Member 11735960 Ответов: 1

Почему мой вывод ложен в большинстве программ на java?


<code begins>   public class Welcome{
                public static void main(String args[]){
                Hello h1=new Hello("Hello");
                Hello h2=new Hello("Hello");
                System.out.println(h1.equals("Hello"));
                }
                }
                class Hello{
                String name;
                Hello(String name){
                this.name=name;
                }
                public boolean equals(Hello h){
                return this.name==h.name;
                }
                } </code ends>
Output: false 

I apologize for my mistakes. After looking at comments from some members, I found out that I typed the code wrong. I am sorry. I have corrected them.

Hi.'Hello' is a class and h1 and h2 are reference variables of class 'Hello'. I call the constructor of 'Hello' class by using "Hello" String arguments, which invokes the respective constructor. I have two questions.

1> 'this' keyword, how does it know that it is referring to object h1 or h2 that is compared. Is it because I used h1.equals? A little explanation of how 'this' keyword works would be helpful.

2> Even though I pass a String "Hello" in equals and compare, I get the output as false. How is this possible?

Next, I would like to modify the above program a little bit as:

    <code begins> public class Welcome{
                  public static void main(String args[]){
                  String s1=new String("Hello");
                  String s2=new String("Hello");
                  Hello h1=new Hello(s1);
                  Hello h2=new Hello(s2);
                  System.out.println(h1.equals(h2));
                  }
                  }
                  class Hello{
                  String name;
                  Hello(String name){
                  this.name=name;
                  }
                  public boolean equals(Hello h){
                  return this.name==h.name;
                  }
                  } </code ends>
Output: false

Here, how is it false again? Is the reason same as for the above program?

How is output changing when I replace program 2 with the overridden 'equals' method with .equals instead of == as:

<code begins>    public boolean equals(Hello h){
                 return this.name.equals(h.name);
                 } </code ends>
Output: true

What is wrong if I pass Object class reference as this in Program 2:

<code begins>    public boolean equals(Object h){
                 return this.name.equals.(h.name);
                 } </code ends>
Output: Compilation Error


Что я уже пробовал:

Я пробовал выполнять вышеприведенные коды.

1 Ответов

Рейтинг:
2

OriginalGriff

this относится к текущему экземпляру текущего класса точно так же, как это происходит, когда вы используете его на английском языке: "этот автомобиль" относится к автомобилю, в котором вы являетесь водителем или пассажиром, независимо от того, какой это фактический автомобиль.

Поэтому, когда вы используете this внутри метода класса он позволяет указать, что используемое свойство или метод принадлежат текущему экземпляру. В большинстве случаев вам не нужно указывать его, так как это подразумевается контекстом - он действительно нужен только тогда, когда у вас есть переменная класса или свойство, которое "скрыто" локальной переменной с тем же именем. Как и в случае внутри вашего конструктора Hello, потому что параметр конструктора "name" называется так же, как переменная уровня класса "name", и вам нужно уточнить назначение:

this.name=name;
Без указания this. name, вы копируете из параметра в параметр.

Другой вопрос проще и сложнее.
= = сравнивает для равенство ссылок, нет равенство ценностей вот почему вы получаете те результаты, которые получаете. Что это значит? Это хорошо объяснено здесь: Как сравнить строки в Java? - переполнение стека[^]


Member 11735960

Меня вполне устраивает ответ на ключевое слово "это". Можете ли вы подробнее остановиться на других частях. Спасибо.

OriginalGriff

Не так хорошо, как ссылка - прочтите это пару раз, и это должно иметь смысл. Если есть какие - то особенности, которых вы не понимаете, спросите о них, но сначала постарайтесь понять, что они говорят!

Member 11735960

Позвольте мне прояснить один за другим. Во-первых, в первой программе строка "Hello", являющаяся параметром конструктора Student, сравнивается со строкой "Hello" St1. Поскольку это разные адреса и оператор = = сравнивает адреса, они являются ложными. Это верно?

OriginalGriff

Что ж... вот тут-то все и усложняется! :смеяться:
Дело не в том, что это разные адреса, а в том, что они ссылаются на разные объекты, которые содержат одну и ту же последовательность символов (здесь я очень осторожен со словами, потому что фактические термины имеют очень специфические значения, которые не обязательно совпадают с общепринятой интерпретацией этих слов в английском языке).

И это не так просто, как могло бы быть: строковые литералы могут быть "интернированы" компилятором, что просто означает, что два литерала "Hello" и "Hello", которые вы используете для создания двух экземпляров Hello, могут быть одним и тем же экземпляром Строковой ссылки (но поскольку они действительно короткие, они, вероятно, не являются таковыми), и вы не можете контролировать это. Таким образом, вы не можете быть уверены, что == будет или не будет сравнивать одни и те же экземпляры, потому что == всегда сравнивает ссылки, а не значения. Если вместо этого вы используете .equals, он полностью игнорирует ссылки и всегда сравнивает значения.
Это, вероятно, тоже не имеет большого смысла, но в маленьком текстовом поле довольно трудно объяснить все это, не будучи в состоянии увидеть точку, в которой ваши глаза начинают стекленеть ... :смеяться:

Member 11735960

Я очень ценю ваше время, потраченное на объяснение этого ответа. Спасибо.

OriginalGriff

Пожалуйста!

CPallini

5.