访问成员变量时
- 原则1:直接通过成员变量名访问成员变量时,看等号左边时谁优先用谁,没有就继续网上找。
- 原则2:通过成员方法间接调用成员变量时,方法属于谁,就优先使用谁的成员变量,没有就往上找。
tip:成员变量不能覆盖重写。
访问成员方法时
- 原则3:new的是谁,就优先用谁,没有就往上找。
- 原则4:编译看左边,运行看右边。父类引用子类对象,不能调用子类独有的成员方法,否则编译报错。
例子
Father为父类,Son为子类
public class Father {
public String fatherName = "fatherName"; //父类独有的成员变量
public String name = "father"; //父子类都有的成员变量
public void show(){ //父类成员方法(子类重写)
System.out.println(name);
}
public void fatherShow(){ //父类成员方法(子类未重写)
System.out.println("fatherShow");
}
}
public class Son extends Father {
public String sonName = "sonName"; //子类独有的成员变量
public String name = "son"; //父子类都有的成员变量
@Override
public void show(){ //重写父类show方法
System.out.println(name);
}
public void sonShow(){ //子类成员方法
System.out.println("sonShow");
}
public static void main(String[] args) {
//使用多态,将Son子类使用Father父类容纳
Father son = new Son();
System.out.println(son.name);
//由原则1,等号左边时Father,所以得到Father的成员变量,输出-->"father"
System.out.println(son.fatherName);
//输出-->"fatherName"
System.out.println(son.sonName);
//由于父类没有sonName成员变量,向上寻找也没有,所以编译报错。
son.show();
//由原则3,new的是Son子类,所以调用Son的show方法。
//show方法调用成员变量name,由原则2,使用Son的成员变量。
//输出-->"son"
son.sonShow();
//由原则4,编译看左(Father son = new Son()等号左边是Father父类 )
//由于Father没有sonShow方法,所以编译报错。
son.fatherShow();
//由原则4,编译通过
//由原则3,son没有fatherShow方法,向上找到父类的fatherShow方法
//输出-->"fatherShow"
}
}