получить значение, только ссылаясь на объект - PullRequest
0 голосов
/ 08 июня 2018

Как иногда мы получаем значение от объекта, ссылаясь только на его имя?

Пример:

class Abc {
 int a=0; 
char b='a';

void tellDetails()
{ return a; }

void main(){
Abc obj=new Abc();
Date d1=new Date();
System.out.println(obj.a);
System.out.println(d1); }

Как вы можете видеть для объекта 'obj', мне нужночтобы использовать оператор точки и ссылаться на поле / метод, но для объекта «Дата» я могу напрямую использовать имя объекта / ссылку «d1» и не прикреплять никакое поле / метод.Почему это так?

Ответы [ 3 ]

0 голосов
/ 08 июня 2018

У каждого Java-класса есть метод toString.Метод toString определен в классе Object, и, поскольку все классы java являются подклассом класса Object, таким образом, каждый класс java имеет функцию toString.

Когда мы пытаемся напечатать объект, на самом деле вызывается метод toString этого классакоторые возвращают строку и эта строка печатается.

В вашем случае, когда вы печатаете объект класса Date, вызывается метод класса toString класса даты.

Вы также можете попробовать это с вашим объектом, просто напишите

System.out.println(obj);

И то, что вы увидите, это строка, которую вы не поймете.Если вы хотите настроить метод toString, вы можете переопределить его следующим образом.

    class Abc {
     int a=0; 
    char b='a';

    void tellDetails()
    {
     return a; 
    }
    @Override
      public String toString()
      {
         return "a="+a+"  b="+b;
       }
    void main(){
    Abc obj=new Abc();
    Date d1=new Date();
    System.out.println(obj.a);
    System.out.println(d1); 
   }



}

Над кодом будет напечатано значение a и b, когда вы будете печатать объект класса ABC

0 голосов
/ 08 июня 2018

То, что вы делаете, использует метод PrintStream.print(Object).

Печатает объект.Строка, созданная методом String.valueOf (Object) , переводится в байты в соответствии с кодировкой символов платформы по умолчанию, и эти байты записываются точно так же, как метод write (int).

Он будет использовать для параметра String.valueOf(Object).

если аргумент равен нулю, то строка равна нулю;в противном случае возвращается значение obj.toString () .

Поэтому, если передаваемый вами экземпляр не переопределяет метод toString, он будет использовать тот из Object.

Короче, вам просто нужно переопределить public String toString() метод.

0 голосов
/ 08 июня 2018

Прежде всего вы должны знать, что Класс объекта является матерью всех классов Java, включая все их методы.Одним из них является toString () , которое возвращает строковое представление объекта.Как вы могли заметить, печать obj возвращает classname + @ + hashcode (реализацию класса объекта) объектов, например: Abc@7852e922

Но это не то, что нам нужно.Это зависит от реализации и требований, но в большинстве случаев вам понадобятся атрибуты объекта с соответствующими им значениями.

Примером в этом случае может быть:

Класс Abc:

import java.util.Date;

public class Abc {
    int a = 0;
    char b = 'a';

    int tellDetails() {
        return a;
    }

    public static void main(String[] args) {
        Abc obj = new Abc();
        Date d1 = new Date();
        System.out.println(obj);
        System.out.println(d1);
    }

    @Override
    public String toString() {
        return "Abc [a=" + a + ", b=" + b + "]";
    }
}

Примечание: обратите внимание на аннотацию @Override

, выдающую следующий вывод:

Abc [a=0, b=a]
Fri Jun 08 03:02:27 CLT 2018

Но теперь: Как это работает для даты по умолчанию? .Потому что уже переопределено в классе Date .который преобразует этот объект Date в строку вида:

 dow mon dd hh:mm:ss zzz yyyy

. Поэтому System.out.println(d1); работает по умолчанию.

...