子类继承父类的同时又去实现一个成员变量、方法与父类相同的接口,最后调的是哪位高手的成员变量和方法
此文只讨论如题的这种情况,不要问我为什么这么逗逼,面试题就是这么逗逼!!
接口代码如下:
public interface MyInterface { int n = 10; String str = "接口成员变量"; //接口方法不能实现,所以是不能出现{} public void doSomething() ; }
父类代码如下:
public abstract class ParentClass { int n = 30; String str = "抽象类的成员变量"; //顺便提一下,抽象方法是不能有{}的 // public abstract void doSomething() {}; public abstract void doSomething() ; //非抽象方法才可以有{} public void doSomething2() {}; }
子类代码如下:
public class SubClass extends ParentClass implements MyInterface { @Override public void doSomething() { //如果打开下面这话代码的注释,IDE会提示n和str是ambiguous(暧昧的、混淆的),无法通过编译 //System.out.println("在子类重写方法里打印,结果:n = " + n + ",调用的是:" + str); System.out.println("在子类重写方法里打印,结果:n = " + super.n + ",调用的是:" + super.str); } }
Main函数如下:
public static void main(String[] args) { SubClass subClass = new SubClass(); subClass.doSomething(); }
执行结果:在子类重写方法里打印,结果:n = 30,调用的是:抽象类的成员变量
总结:当出现子类继承父类的同时又去实现一个成员变量、方法与父类相同的接口时,重写的是父类的方法,接口的方法被隐藏。
如果子类没有定义跟父类、接口一样的成员变量,则需要通过super关键字调用父类的成员变量,接口的成员则无法调用,而且这个时候不用super关键的话,IDE会提示使用的成员变量是ambiguous(暧昧的、混淆的),无法通过编译;
如果子类同时还定义了跟父类、接口一样的成员变量,可以直接调它本身的成员变量,能过super关键字可以调父类的成员变量,而接口的成员变量则无法调用。
以上测试,关于怎么在子类中显式地调接口的成员变量和方法,如有童鞋知道的话,请告知哦。多谢了~
从别地方拷来的补充知识点:
子类在隐藏了父类的成员变量或重载了父类的方法后,常常还要用到父类的成员变量,或在重载的方法中使用父类中被重载的方法以简化代码的编写,这时就要访问父类的成员变量或调用父类的方法,Java中通过super来实现对父类成员的访问。
Java中,this用来引用当前对象,与this 类似,super用来引用当前对象的父类。
super的使用有三种情况:
1. 用来访问父类被隐藏的成员变量,如:super.variable
2. 用来调用父类中被重载的方法,如:super.Method ( [paramlist] );
3. 用来调用父类的构造函数,如: super( [paramlist] );
更多关于Java对象继承和接口实现的基础知识,可以参见以下地址:
http://61.187.10.76/java/htm/ch7/7-1.htm
http://my.oschina.net/u/617660/blog/83427