父类:
/*
代码当中体现多态性,其实就是一句话:父类引用指向子类对象。
格式:
父类名称 对象名 = new 子类名称();
或者:
接口名称 对象名 = new 实现类名称();
访问成员变量的两种方式:
1. 直接通过对象名称访问成员变量:看等号左边是谁,优先用谁,没有则向上找。
2. 间接通过成员方法访问成员变量:看该方法属于谁,优先用谁,没有则向上找。
成员方法的访问规则是:
看new的是谁,就优先用谁,没有则向上找。
口诀:编译看左边,运行看右边。
对比一下:
成员变量:编译看左边,运行还看左边。
成员方法:编译看左边,运行看右边。
向上转型一定是安全的,没有问题的,正确的。但是也有一个弊端:
对象一旦向上转型为父类,那么就无法调用子类原本特有的内容。
解决方案:用对象的向下转型【还原】。
*/
package day9;
public class MultiFu {
String name = "vergil";
int age = 25;
public void method1(){
System.out.println("在父类方法1");
System.out.println(name);
System.out.println(age);
}
}
子类:
package day9;
public class MultiZi extends MultiFu{
String name = "danti";
int age = 26;
public void method2(){
System.out.println("在子类方法2");
}
@Override
public void method1(){
System.out.println("在子类覆盖重写");
System.out.println(super.name);
System.out.println(super.age);
System.out.println(name);
System.out.println(age);
}
}
另起一个类:
package day9;
public class TesForMulti {
public static void main(String[] args) {
MultiFu obj = new MultiZi();//向上转型
System.out.println(obj.name);
obj.method1();
System.out.println(obj instanceof MultiZi);
if (obj instanceof MultiZi){
MultiZi objZi = (MultiZi) obj;
objZi.method1();
}
}
}