一句话:父类引用指向子类对象
格式: 父类名称 对象名 = new 子类名称()
或者
接口名称 对象名 = new 实现类名称()
public class Fu {
public void main() {
System.out.println("父类方法");
}
public void mainTest() {
System.out.println("父类特殊方法");
}
}
public class Zi extends Fu{
@Override
public void main() {
System.out.println("子类方法");
}
}
public class Mulituplate {
public static void main(String[] args) {
Fu objFu = new Zi();
objFu.main();
objFu.mainTest();
}
}
访问成员变量:
直接通过对象名称访问成员变量,谁是对象,优先使用谁,没有则向上找。
间接通过方法访问成员变量,方法属于谁,则优先使用谁,没有则向上找。
重写了父类方法,就是50,不重写就是20。
public class Fu {
int num = 20;
public void main() {
System.out.println("父类方法");
}
public void mainTest() {
System.out.println("父类特殊方法");
}
}
public class Zi extends Fu{
int num = 50;
@Override
public void main() {
System.out.println("子类方法");
}
}
//调用
public class Mulituplate {
public static void main(String[] args) {
Fu obj = new Zi();
obj.main();
obj.mainTest();
System.out.println(obj.num); // 20
}
}
访问成员方法:
看new的是谁,就优先用谁,没有则向上找。但是无法访问子类特有的成员。
使用多态的好处:使左边的代码更加简单。无需修改
对象的向上转型:(多态)
父类引用指向子类对象。
对象的向下转型:
向上转型是安全的,但是无法访问子类特有的成员方法
对象的向下转型一定要进行类型instanceof判断
if (obj instanceof Fu) {
Zi zi = (Zi)obj;
zi.mianZi();
}