В Java super.getClass () печатает неожиданное имя в производном классе - почему это так?

Не могли бы вы помочь мне понять, что напечатано в приведенном ниже коде System.out.println(super.getClass().getName());?

Я вижу "PrintSubClass3" напечатанным, даже когда я упомянул super.

class PrintClass {
    int x = 0;
    int y = 1;
    void printMe() {
        System.out.println("X is " + x + ", Y is " + y);
        System.out.println("I am an instance of the class " +super.getClass().getName());
    }
}

class PrintSubClass3 extends PrintClass {
    int z = 3;
    void printMe() {
        System.out.println("x is " + x + ", y is " + y + ", z is " + z);
        System.out.println(super.getClass().getName());
        super.printMe();
    }
    public static void main (String args[]) {
        PrintSubClass3 obj = new PrintSubClass3();
        obj.printMe();
    }
}

person Vidya    schedule 20.01.2016    source источник


Ответы (2)


super.getClass() вызывает метод getClass(), как определено родительским классом (игнорируя любой getClass метод, который вы могли определить в самом классе - не уверен, возможно ли это даже с getClass, возможно final).

Это заканчивается вызовом Object#getClass, который возвращает класс среды выполнения экземпляра (который и есть экземпляр PrintSubClass3).

Все, что делает super, - это позволяет вам вызывать реализацию методов, которых вы иначе не смогли бы достичь, потому что вы их переопределили. Здесь это избыточно, поскольку this.getClass() и super.getClass() используют один и тот же метод.

person Thilo    schedule 20.01.2016

getClass() метод возвращает класс среды выполнения этого объекта. Другими словами, ваш объект obj, который является объектом с именем класса PrintSubClass3. Поэтому он вернет PrintSubClass3.

поэтому, вызывая внутри вашего класса, он предоставит вам свой собственный класс, даже если есть ключевое слово super. есть ключевое слово super, он перейдет в свой суперкласс для поиска метода getClass (), но, поскольку он не реализован явно в суперклассе, метод getClass () будет работать, как сказано в документации, ~ он вернет класс выполнения объекта.

Если вы действительно хотите напечатать имя своего суперкласса, сделайте это

 System.out.println(super.getClass().getSuperclass()); 

Надеюсь, это прояснит ваше замешательство.

каков идеальный способ напечатать имя класса?

просто введите это (вы можете печатать без ключевого слова super)

     System.out.println(getClass().getName());   //Prints your local class
      System.out.println(getClass().getSuperclass()); //Prints your superClass
person Ajay P. Prajapati    schedule 20.01.2016
comment
super.getClass().getSuperclass() Почему не просто getClass().getSuperclass()? Что super там делает? - person Thilo; 20.01.2016
comment
как я там писал, даже если есть ключевое слово super, оно не даст вам className суперкласса, потому что в документации четко указано, что метод getClass() возвращает класс времени выполнения этого объекта. Другими словами, класс объекта. это y возвращает имя. Вы можете распечатать имя класса, не вызывая super. - person Ajay P. Prajapati; 20.01.2016
comment
Кроме того, чтобы добавить, есть ключевое слово super, оно перейдет к своему superClass для поиска метода getClass(), но, поскольку он не реализован явно в суперклассе, метод getClass() будет работать, как сказано в документации ~, он вернет класс выполнения объекта. Я надеюсь, что это прояснит ситуацию - person Ajay P. Prajapati; 20.01.2016