您的位置:首页 > 其它

子类继承父类的同时又去实现一个成员变量、方法与父类相同的接口,最后调的是谁的成员变量和方法?

2015-04-25 14:52 1076 查看
此文只讨论如题的这种情况,不要问我为什么这么逗逼,面试题就是这么逗逼!!

接口代码如下:

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐