多态:
概述:事物存在多种形态。(大白话:同一事物在不同时刻,表现出来的不同状态)
前提:
1、要有继承关系,
2、要有方法重写。
3、要有父类引用执行子类对象。
Fu f = new Zi();
f.num; //父类的
f.eat() //子类的
多态中成员的访问特点:
成员变量:
编译看左边(父类),运行看左边(父类)。
编译只检查语法问题。
成员方法:(类中的非静态成员方法) :动态绑定
编译看左边(父类),运行看右边(子类)。
大白话:编译时会去找父类中有没有这个方法,如果有,编译不报错,没有编译就报错。
运行的时候,执行的还是子类的成员方法,原因很简单,因为方法有重写。
静态方法:
编译看左边(父类),运行看左边(父类)。
原因:因为静态是和类相关的,算不上重写。
多态中的向上,向下转型:
向上转型: Fu f = new Zi(); // double d = 20; 这个叫隐式类型转换
向下转型: Zi z = (Zi)f; // int a = (int)d;这个叫强制类型转换
案例:
人类:
属性:姓名
方法:谈生意
超人继承人类:
属性:name
方法:
谈生意
fly();
class Person{
String name = "jack";
public void 谈生意(){
System.out.println("谈生意");
}
}
class SuperMan extends Person{
String name = "superMan";
int age ;
public void 谈生意(){
System.out.println("谈一个大单子");
}
public void fly(){
System.out.println("我是超人,我会飞");
}
}
Person p = new SuperMan();
p.name = "法海";
p.谈生意();
p.fly();
多态的好处和弊端:
好处:
1、复用性。
2、扩展性。
3、可以做为形参的数据类型,用来接收各个子类的对象。 (开发中较常用)
public void eat(Animal a){ // Animal a = new Cat();
a.eat();
}
instanceof关键字:
格式: 对象名 instanceof 类名
作用: 判断前边的引用是否是后边的数据类型。
(判断前边的对象是否是后边这个类的对象)
弊端:
父类引用不能使用子类的特有属性和行为。 |
|