一.多态
多态性:extends继承和implements实现,是多态性的前提
1.代码体现多态性
(1)实现:父类引用指向子类对象
(2)格式:
- 父类名称 对象名 = new 子类名称(); 调用同名方法会调用子类定义方法,同时也能使用父类特有方法
- 接口名称 对象名 = new 实现类名称();
(3)多态用处:
二.多态示例代码
Zi.java代码:
public class Zi extends Fu{
int num = 100;
public void show(){
System.out.println("Zi");
}
public void methodZi(){
System.out.println("Zi类特有");
}
}
Fu.java代码:
public class Fu {
int num = 20;
public void show(){
System.out.println("Fu");
}
public void showNum(){
System.out.println(num);
}
public void methodFu(){
System.out.println("Fu类特有");
}
}
主方法代码:
public class mainCLS{
public static void main(String[] args) {
Fu obj = new Zi();
System.out.println(obj.num); //20
//Zi类无覆盖重写则调用父类方法,若覆盖则为子类方法
obj.showNum();
//编译看左边,左边是Fu,Fu当中没有methodZi方法,所以编译会报错
//obj.methodZi();
obj.show();
//向下转型
Zi obj1 = (Zi)obj;
obj1.methodZi();
System.out.println(obj instanceof Zi);
}
}
}
三.访问
成员变量:
1.直接通过对象名称访问成员变量,看等号左边是谁,优先用谁,则对于obj.num会使用Fu类的num,不会向下查找
2.间接通过成员方法访问成员变量,看该方法属于谁,优先用谁
方法:
多态代码中,成员方法访问规则:看new的是谁则优先用谁,没有则向上找
- 口诀:编译看左边,运行看右边
- 而对于变量而言是,编译看左边,运行也还是看左边
转型:
向上转型:多态写法,可以是抽象父类
- 弊端:一旦向上转型为父类,不能调用子类的特有方法
- 解决方法:用对象的向下转型还原
向下转型:还原
- 如果还原的子类错误会报错,java.lang.ClassCastException类转换异常,编译不会报错!但是运行会出现异常!
- 使用instanceof关键字判断是否属于某个类
格式:对象 instanceof 类型,返回一个boolean变量
tion类转换异常,编译不会报错!但是运行会出现异常!
- 使用instanceof关键字判断是否属于某个类
格式:对象 instanceof 类型,返回一个boolean变量