1.访问成员变量的两种方式:
1.直接通过对象名称访问成员变量:看等号左边是谁,优先用谁,没有则向上找。
2.间接通过成员方法访问成员变量:看该方法属于谁,优先用谁,没有则向上找。
public class Fu /*extends Object*/{
int num = 10;
public void showNum(){
System.out.println(num);
}
}
public class Zi extends Fu {
int num = 20;
int age = 16;
@Override
public void showNum() {
System.out.println(num);
}
}
public class demoMult {
public static void main(String[] args) {
//时用多态写法,父类引用指向子类对象
Fu obj = new Zi();
System.out.println( obj.num);
// System.out.println(obj.age); 错误写法
System.out.println("==================");
obj.showNum(); //没有覆盖重写 方法是父类的 就是10
//子类覆盖重写了就是子类的,就是20
}
}
2.在多态的代码中,成员方法的访问规则是:
看new的是谁,就优先用谁,没有则向上找。
简记:编译看左边,运行看右边。
对比:
成员变量:编译看左边,运行还看左边
成员方法:编译看左边,运行看右边。
public class Fu /*extends Object*/{
public void method(){
System.out.println("父类方法");
}
public void methodFu(){
System.out.println("父类特有方法");
}
}
public class Zi extends Fu {
@Override
public void method() {
System.out.println("子类方法");
}
public void methodZi(){
System.out.println("子类特有方法");
}
}
public class demoMult {
public static void main(String[] args) {
Fu obj = new Zi(); //多态
obj.method(); //父子都有,优先用子
obj.methodFu(); //子类没有,父类有,向上找到父类。
// 编译看左边,左边是Fu,Fu当中没有methodZi方法,所以编译报错。
// obj.methodZi(); 错误
((Zi) obj).methodZi();
}
}