Я читаю книгу и иногда в примере мы ссылаемся на переменную, а в книге описывается мол ссылаемся на объект. Вот эти слова:
Когда метод вызывается, ему автоматически передается ссылка на
вызывающий объект, т.е. тот объект, для которого вызывается данный
метод. Эта ссылка обозначается ключевым словом this
.
Для меня объект это экземпляр класса. Вот объявление/создание объекта.
Test test = new Test();
Объясните пожалуйста!
Показан вот такой пример:
public class Test {
double b;
int e;
double val;
Test(double base, int exp) {
this.b = base;
this.e = exp;
this.val = 1;
if(exp==0) return;
for ( ; exp>0; exp-- ) this.val = this.val * base;
}
double get_pwr() {
return this.val;
}
}
В Java
объекты - это только экземпляры классов, и все. В цитате говорится, что в методе у нас есть ссылка на объект класса(слово this
). С помощью этой ссылки мы можем вызвать переменную/метод из класса. Слово this
- это ссылка на экземпляр класса(только того класса, в котором оно используется). Т.е., this.val
эквивалентно
double get_pwr() {
Test test = this;
return test.val;
}
Описание объекта с одного старого сайта:
Шаблоном или описанием объекта является класс, а объект представляет экземпляр этого класса.
Объекты представляют из себя совокупность примитивных типов и других объектов. Объекты можно сравнивать с помощью equals и hashcode. В первом случае сравниваются ссылочные типы на объект, во втором сравнивается хешкод. Подробнее вы можете узнать в интернете. Там как раз описываются свойства объектов. Что касается This - то это ссылочный тип на текущий объект. Есть еще super - в данном случае мы ссылаемся на родительский элемент, это может быть имплементация или интерфейс. Что касательно книги, то не стоит придираться к каждому слову, так как перевод может быть неправильным и некоторые слова не те. В переменные действительно можно использовать другие объекты и использовать их методы. Так что я соглашусь.
"1. с помощью equals ... сравниваются ссылочные типы на объект" - мне непонятна фраза. То ли речь про оператор == идёт, который сравнивает ссылки, в отличие от equals, где может быть какая угодно логика сравнения, то ли ещё про что-то. О чём идёт речь?
Если мы посмотрим реализацию метода equals, то мы увидим следующее:
@Override
public boolean equals(Object obj) {
if (obj == this) {
return true;
}
Т.е. отвечаю автору вопроса, метод equals является абсолютно тоже самым что и ==. Но лучше использовать в практике метод equals, его можно переопределить на ваше усмотрение. Например:
@Override
public boolean equals(Object obj) {
if (obj == this) {
if (obj instanceof String) return true;
else return false;
} else return false;
Родительский элементы является интерфейс или абстрактный класс. Например:
public class LadaKalina implements Car
в данном случае родительский элемент это интерфейс Car, и методы у него будут, при вызове super, как у интерфейса Car. Или пример с абстрактным классом. Чтобы не писать заново переопределение метода, мы вызываем super:
public abstract class Lada {
public open() {
System.out.println("Машина открыта");
}
}
public class Kalina extends Lada {
@Override
public open() {
super.open();
System.out.println("Привет Алексей!");
System.out.println("Добро пожаловать в Ладу Калину.");
System.out.println("Это голосовой помощник Алиса.");
System.out.println("Чем я могу быть вам полезна?");
}
}
Вывод:
"Машина открыта"
"Привет Алексей!"
"Добро пожаловать в Ладу Калину. "
"Это голосовой помощник Алиса. "
"Чем я могу быть вам полезна?"
UPD 18.11.2018: Специально для автора еще раз перечитал
Core java (Java. Библиотека профессионала, том 1-2) Cay S. Horstmann (Кей С. Хорстманн)
вопрос автора:
Такая «штука» как раз существует.
Я считаю свою формулировки и теперь правильными поскольку, (цитата из книги):
Если родительские классы не предоставили переопределение, то по умолчанию используется метод из конечного родительского класса Object и поэтому вы остаетесь с методом Object#equals(Object o). В Object API это то же самое, что и ==; то есть он возвращает true тогда и только тогда, когда обе переменные относятся к одному и тому же объекту, если их ссылки одно и то же. Таким образом, вы будете тестировать на равенство объектов, а не на функциональное равенство.
Да, действительно, вы правы. Я писал не родительский класс, а родительский элемент. Как я мог совершить такую ошибку... Лично мне не понятна ваша логика претензий в плане формулировок. Это не поможет вам быстрей писать код. Мое субъективное мнение, что можно хоть обглататься формулировками, но это не поможет создавать эффективный код, причем еще когда подбивают сроки по проекту.
Что касается следующего вопроса автора:
"Родительский элементы является интерфейс или абстрактный класс." - а неабстрактный класс, от которого наследуется данный класс, почему не входит в эту формулировку? Плюс цепочка может состоять более чем из одного интерфейса/класса - должно быть в множественном числе тогда
Да, согласен. Но в С++ интерфейсов вообще нет. Там строится все на абстрактных классах. Сам вопрос как звучит? вроде как: В Java всё объекты?
а не :
построение цепочек из более чем одного интерфейса/класса
Теперь сам ответ на главный вопрос. На этот ответ я наткнулся в Spring MVC. При передаче атрибутов в сессию. Фишка в том, что при передачи атрибутов в сессию мы можем указать строку, коллекцию, любой другой Object. Так как jdk «превращает» (надеюсь автор не придирется к этому слову) объекты в байт код. И фактически все что туда передается это объекты. А следовательно - В JAVA ВСЕ объекты, так как и String и Integer наслудуются от Object.
Вот небольшой пример из Spring MVC где передаются значение Integer, String, Map.
map = new MapResume(request).getResumeMap(page);
ModelAndView model = new ModelAndView();
model.setViewName("ResumeSearch");
model.addObject("list_prof_field", paramsDAO.getProfFields());
model.addObject("map_resume", map);
model.addObject("count_resume", countResume);
model.addObject("page_select", page);
model.addObject("page_begin", startPage);
model.addObject("page_end", endPage);
model.addObject("page_count", countPage);
Как видно по коду, мы передает и коллекцию и String и Integer. Но входной параметр у addObject
это Object
:
public ModelAndView addObject(Object attributeValue) {
// <editor-fold defaultstate="collapsed" desc="Compiled Code">
/* 0: aload_0
* 1: invokevirtual org/springframework/web/servlet/ModelAndView.getModelMap:()Lorg/springframework/ui/ModelMap;
* 4: aload_1
* 5: invokevirtual org/springframework/ui/ModelMap.addAttribute:(Ljava/lang/Object;)Lorg/springframework/ui/ModelMap;
* 8: pop
* 9: aload_0
* 10: areturn
* */
// </editor-fold>
}
Именно поэтому в JAVA ВСЕ объекты, отвечаю на главный вопрос. Мой ответ вполне обоснованный, надеюсь он удовлетворит автора.
Виртуальный выделенный сервер (VDS) становится отличным выбором
Имеются две Entity, ссылающиеся друг на друга соответствующими полями отмеченными аннотациями
Я делаю клиент для Telegram на Java с использованием официальной библиотеки TDLib, те
Есть ли какой способ проверить что бин был создан? с помощью аннотации а не простым if