2015-10-24 5 views
0

Какой адрес супер в 4-й строке, указывая на следующий код?Что следует указывать в следующем коде?

public class SuperChk { 
    private void test() { 
     System.out.println(toString()); 
     System.out.println(super.toString()); //4 
    } 

    @Override 
    public String toString() { 
     return "Hello world"; 
    } 

    public static void main(String[] args) { 
     SuperChk sc1 = new SuperChk(); 
     sc1.test(); 
    } 
} 

ответ

2

Посмотрите на это таким образом.

неявный, ваш класс наследует от родительского класса Object, так что вы можете получить доступ к объекту либо с Object ссылки или с SuperChk ссылкой

Объектом

public class Object { 
    // Other methods 

    public String toString(){ 
     // This is the method super.toString() will use once called in SuperChk 
     return getClass().getName() + "@" + Integer.toHexString(hashCode()); 
    } 

} 

SuperChk

public class SuperChk extends Object { 
    private void test() { 
     System.out.println(toString()); 
     System.out.println(super.toString()); //4 
    } 

    @Override 
    public String toString() { 
     return "Hello world"; 
    } 

    public static void main(String[] args) { 
     SuperChk sc1 = new SuperChk(); 
     sc1.test(); 
    } 
} 

Выход

Hello world 
[email protected] 

Вы можете видеть, что toString() метод из класса Object принтов:

  • Имени класса первого.
  • Тогда «@»
  • Затем шестнадцатеричное представление HashCode которое также определено в методе суперкласса Object
+0

Является ли getClass() вызовом класса, в котором метод toString() наследуется? – Alvin3001

+0

@ Alvin3001 getClass() предоставит вам имя класса объекта из кучи. Даже если ваша ссылка относится к родительскому классу. –

+0

Итак, здесь hashcode() также получает целочисленное значение адреса, указанного sc1? – Alvin3001

1

Классы в Java все проистекают из Object. Поскольку у вас нет явного родительского класса, родительский адрес равен Object, а super ссылается на Object. Object поддерживает toString() method. См. Java class hierarchy.

enter image description here

+0

Но почему он ссылается на тот же адрес, на который ссылается sc1? – Alvin3001

+0

@ Alvin3001 Я не уверен, что понимаю ваш вопрос. Вы говорите 'System.out.println (super.toString())' печатает "Hello World"? Это было непонятно из вашего первоначального вопроса. – lurker

+0

@ Alvin3001 Даже если toString() переопределено, вызов супер. перед тем, как метод заставит вас ссылаться на то, как метод написан в прямом родительском классе. –

0

super не является выражением. Таким образом, super не указывает на что-либо, и вы не можете использовать super самостоятельно.

super.something() это выражение, которое позволяет вызвать метод объекта, который this указывает на, но поиск, реализация которых для вызова протекает вверх от суперкласса класса, код которого это находится, а не вверх от класс выполнения объекта, как если бы вы сделали this.something().

Здесь вызывается как toString(), так и super.toString(), на который указывает this (что является экземпляром SuperChk). Тем не менее, они вызывают разные реализации toString() - в первом случае поиск основан на классе времени выполнения объекта, который равен SuperChk, а SuperChk действительно выполняет свою собственную реализацию toString(), поэтому используется реализация SuperChk. Во втором случае поиск основан на классе, который является суперклассом класса, в котором находится код (SuperChk), который равен Object, поэтому используется ObjecttoString().

Смежные вопросы