2013-03-01 2 views
0

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

super.super.toString(); 

Может быть в состоянии работать, что это не делает. И будучи любопытным я пытался понять это самостоятельно и придумал это:

public class A { 
    public static void main(String[] args){ 
     B b = new B(); 
     C c = new C(); 

     System.out.println(b.toString()); 
     System.out.println(c.toString()); 
    } 

    public String toString(){ 
     return "Class A"; 
    } 
} 

class B extends A { 
    public String toString(){ 
     return "Class B"; 
    } 
} 

class C extends B { 
    public String toString(){ 
     return A.class.toString(); 
    } 
} 

Который разработал, теперь во время тестирования различных вещей, которые я наткнулся на это: (Это было все сделано в классе С)

super.toString(); 

Кажется, чтобы сделать то же самое, как:

B.class.toString(); 

Мой вопрос есть ли разница между этими двумя, или они точно так же? Также в моем коде выше, это правильный способ вызова метода из под-подкласса?

ответ

3

Нет, это не одно и то же. Предполагая, что вы вызываете super.toString() из своего класса C, это вызывает toString() на B, который вернет «класс B».

При вызове A.class.toString() или B.class.toString() вы не вызвать любой метод суперкласса вообще, вы звоните toString на Class.

3

No, B.class.toString() будет называть метод toString() на классе Class. Это даже не немного то же самое, что и звонок super.toString().

Невозможно назвать A исполнением toString() от C, обходя A. В принципе, это разрушит инкапсуляцию.

3
class Parent{ 
    public void foo(){ 

    } 
} 


class Child extends Parent{ 

    @Override 
    public void foo(){ 
     super.foo(); //will call the parent class foo method 
    } 
} 

class ChildOfChild extends Child{ 

    public void bar(){ 
     super.foo(); //this actually is the method of the Parent that is actually called at the end as Child calls super.foo(); 
    } 
} 

super.toString(); и B.class.toString() совершенно разные. В дальнейшем вы вызываете метод toString()класс литерал.

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

Если непосредственный родитель не переопределил метод и вы вызываете метод из под-подкласс, тогда будет вызван метод родителя непосредственного родителя.

1

Вы увидите очень быстро, если попытаетесь получить доступ к любому состоянию внутри вашего toString(), чтобы вы не делали то, что, по вашему мнению, делаете.

SomeClass.class - специальная конструкция. См. http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.8.2 Для точного определения.

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