继承时子类和父类中出现重名变量和重名方法问题的解释
1.成员变量同名
public class Test2 {
public static void main (String[] args) {
ZI zi = new ZI();
FU fu = new FU();
System.out.println(zi.a);
System.out.println(fu.a);
}
}
class FU{
int a=10;
}
class ZI extends FU{
int a=20;
}
/*
输出结果为20 10
*/
public class Test2 {
public static void main (String[] args) {
ZI zi = new ZI();
zi.show();
}
}
class FU{
int a=10;
public void show(){
System.out.println(a);
}
}
class ZI extends FU{
int a=20;
}
/*
输出结果为10
*/
public class Test2 {
public static void main (String[] args) {
ZI zi = new ZI();
zi.show();
}
}
class FU{
int a=10;
}
class ZI extends FU{
int a=20;
public void show(){
System.out.println(a);
}
}
/*
输出结果为20
*/
由上述代码显示可以看出,当继承时子类和父类中出现用名成员变量时,同名变量之间相互独立;如果是直接获取时只需依据对象类型即可;如果进行调用时依据方法定义在哪个类中,父类中进行父类调用,子类中进行子类调用。
2.成员方法同名时
public class Test2 {
public static void main (String[] args) {
ZI zi = new ZI();
zi.show();
zi.A();
FU fu = new FU();
fu.show();
fu.A();
FU fu1=new ZI();
fu1.show();
fu1.A();
}
}
class FU{
public void A(){
System.out.println("A方法");
}
public void show(){
System.out.println("FU SHOW");
}
}
class ZI extends FU{
public void show(){
System.out.println("ZI SHOW");
}
}
/*
输出结果为
ZI SHOW
A方法
FU SHOW
A方法
ZI SHOW
A方法
*/
注:FU为父类对象,ZI为子类对象,FU1为用子类实例化的父类对象(实现向上转型)
上述代码实现的功能可得:父类对象和子类对象可以调用本类中的对象;子类中没有但是父类中有的方法会实现继承;在实现向上转型后,子类和父类中重名的方法将会被子类重写后的方法所覆盖(方法重写),不重名的方法将会得到子类的继承,当测试类中进行方法调用时,方法会以重写后的方法为准进行调用。
总结
继承只能覆盖方法(方法重写),而不能覆盖成员变量,当有同名变量时,则变量之间相互独立,直接获取变量时,依据变量前的对象类型进行获取,调用时依据对象在哪个类中进行调用。
方法一旦进行重写,再次被调用时均以重写后的方法为准,进行执行。
用子类对父类对象进行实例化(即多态或者向上转型)是基于继承和子类对父类方法的重写而实现的。无继承和方法的重写,多态则无从谈起。
版权声明:本文为DONG__CHI原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。