访问父子类成员变量
(1)直接通过子类对象访问成员变量
总结:等号左边是谁,就优先用谁,没有则向上找。
Fu类
public class Fu {
int num=10;
int numFu=100;
}
Zi类
public class Zi extends Fu {
int num=20;
int numZi=200;
}
测试
public class Test {
public static void main(String[] args) {
//第一
Fu fu=new Zi();
System.out.println(fu.num);//10
System.out.println(fu.numFu);//100
//第二
Fu fu1=new Fu();
System.out.println(fu1.num);//10
System.out.println(fu1.numFu);//100
//第三
Zi zi=new Zi();
System.out.println(zi.num);//20
System.out.println(zi.numFu);//100
System.out.println(zi.numZi);//200
}
}
(2)间接通过成员方法访问成员变量
总结:这个方法属于谁,就优先用谁;
但当父类子类方法名重名的时候,创建的对象是谁,就优先用谁。
Fu类
public class Fu {
int num = 10;
int numFu = 100;
public void method() {
System.out.println(num);
System.out.println(numFu);
}
public void methodFu() {
System.out.println(num);
System.out.println(numFu);
}
}
Zi类
public class Zi extends Fu {
int num = 20;
int numZi = 200;
public void method() {
System.out.println(num);
System.out.println(numZi);
System.out.println(numFu);
}
public void methodZi() {
System.out.println(num);
System.out.println(numZi);
System.out.println(numFu);
}
}
测试
public class Test {
public static void main(String[] args) {
//第一
Fu fu = new Zi();
fu.method();//fuzi都有,new的是zi, 20,200,100
fu.methodFu();//方法属于fu,10,100
System.out.println("===");
//第二
Fu fu1 = new Fu();
fu1.method();//fuzi都有,new的是fu,10,100
fu1.methodFu();//方法属于fu,10,100
System.out.println("===");
//第三
Zi zi = new Zi();
zi.method();//fuzi都有,new的是zi,20,200,100
zi.methodZi();//方法属于zi,20,200,100
zi.methodFu();//方法属于fu,10,100
}
}
========================================================================================================================================================
访问父子类成员方法
(1)父类子类成员方法不重名时,访问没有任何影响
总结:创建的对象是谁,就优先用谁,没有则向上找。
Fu类
public class Fu {
int num = 10;
int numFu = 100;
public void methodFu() {
System.out.println("fu类特有方法执行");
}
}
Zi类
public class Zi extends Fu {
int num = 20;
int numZi = 200;
public void methodZi() {
System.out.println("zi类特有方法执行");
}
}
测试
public class Test01 {
public static void main(String[] args) {
//第一
Fu fu = new Zi();
fu.methodFu();//new的是zi,zi没有,用fu,fu类特有方法执行
System.out.println("===");
//第二
Fu fu1 = new Fu();
fu1.methodFu();//new的是fu,fu有,fu类特有方法执行
System.out.println("===");
//第三
Zi zi = new Zi();
zi.methodZi();//new的是zi,zi有,zi类特有方法执行
zi.methodFu();//new的是zi,zi没有,用fu,fu特有方法执行
}
}
(2)父类子类成员方法重名时,会覆盖重写
总结:创建的对象是谁,就优先用谁,没有则向上找。
Fu类
public class Fu {
int num = 10;
int numFu = 100;
public void method() {
System.out.println("fu类重名方法执行");
}
}
Zi类
public class Zi extends Fu {
int num = 20;
int numZi = 200;
public void method() {
System.out.println("zi类重名方法覆盖重写执行");
}
}
测试
public class Test01 {
public static void main(String[] args) {
//第一
Fu fu = new Zi();
fu.method();//fuzi都有,new的是Zi,zi类重名方法覆盖重写执行
System.out.println("===");
//第二
Fu fu1 = new Fu();
fu1.method();//fuzi都有,new的是Fu,fu类重名方法执行
System.out.println("===");
//第三
Zi zi = new Zi();
zi.method();//fuzi都有,new的是Zi,zi类重名方法覆盖重写执行
}
}