MyException - 我的异常网
当前位置:我的异常网» Java面试 » 面试题:为何java不允许 super.super.xxx

面试题:为何java不允许 super.super.xxx(2)

www.MyException.Cn  网友分享于:2013-12-03  浏览:1239次

也真难为这个出题的人了
------解决方案--------------------

super 在编译器解释成为一种特殊的this操作 ,难道你可以this.this这样写么?

楼主能明白了么?



------解决方案--------------------
看到现在 还是不知道 为什么不能够这样使用!!
有谁可以明确地给个解释?
------解决方案--------------------
这么简单的连我个菜鸟都能很自信的回答 JAVA不允许多继承啊
------解决方案--------------------
5楼的理解独到
------解决方案--------------------
super看一下这个方法的声明就应该知道了
------解决方案--------------------
mark....
------解决方案--------------------
子类继承了父类的所有方法和成员变量,比如说B extends A, 然后C extends ,
B 继承了A的所有方法和成员变量,C调用直接父类B中的成员,没有必要引用间接父类.

------解决方案--------------------
如果你用了super,不就说明这是子类吗?而子类总是会继承父类的非私有(非静态)字段,即直接父类已经继承了其所有父类的成员和方法,super.super.xxx就不需要了... 个人理解,如有不对之处还请各位指正...
------解决方案--------------------
又学到一点,呵呵。谢了!
------解决方案--------------------
我认为当super 时就已经实例化它所有的父类的构造器了。那么再一个super 又是什么意思!当然不合理了
------解决方案--------------------
从内存中的形势角度看,super指向的是 子类对象中父类的对象,super.super就说明父类的对象中的父类对象,待时内存在加再代码时,没有必要把子类中所有的祖宗都加载进来,所以super.super.xxx是错的
------解决方案--------------------
Java code

class A{
    public void f(){
        System.out.println("A.f()");
    }
}
class B extends A{
    public void f(){
        System.out.println("B.f()");
    }
}
class C extends B{
    public void f(){
        super.super.f();//想想这种情况下怎么办,也许有些人认为这种做法在实际应用中不会出现,
                  //但是如果真要这么做,怎么解决
        System.out.println("C.f()");
    }
}

------解决方案--------------------
Java中所有的类都是继承制Object,那么如果你写一个类,如:
public class A {}
也就是说你的类A默认继承了Object,等同于
public class A extends Object {}

如果你的类A里面有一个方法去调用super.super.xxx
这个时候你说调用的是什么呢?

所以java不允许调用super.super。

这才是根本的原因。
------解决方案--------------------
探讨
Object getSuper()
可以返回,super.getClass().newInstance();
不能返回,super
说明super很特殊,不能理解成私有成员
哪家公司出这种面试题哦!?

------解决方案--------------------
面试题比较变态,谁会用super.super?

------解决方案--------------------
可不可以这样理解?
子类的构造方法中如果什么都没有写的话其实是隐含了调用父类的无参的构造方法super();

class A{
A(){
}
}
class B extends A{
B(){
}
}
等价于:
class B extends A{
B(){
super();
}
}

所以如果有class C extends B{}的时候
C的构造方法会super();的构造方法,而B的构造方法会自动super();A
当然A会super();Object
所以根本就不需要super.super.xxx
------解决方案--------------------
class A{
public void f(){
System.out.println("A.f()");
}
}
class B extends A{
public void f(){
System.out.println("B.f()");
}
}
class C extends B{
public void f(){
super.f();//想想这种情况下怎么办,也许有些人认为这种做法在实际应用中不会出现,
//但是如果真要这么做,怎么解决
//不能用super.super.f();
System.out.println("C.f()");

文章评论

软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有