一、 解释:
在不同环境下,不同的语句将会是不同的意思
例子:方便-----
我去方便一下
你方便的时候,请你吃饭
多态是指:
程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。. 因为在程序运行时才确定具体的类,这样,不用修改源程序代码,就可以让引用变量绑定到各种不同的类实现上,从而导致该引用调用的具体方法随之改变,即不修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态,这就是多态性。
. 比如你是一个酒神,对酒情有独钟。. 某日回家发现桌上有几个杯子里面都装了白酒,从外面看我们是不可能知道这是些什么酒,只有喝了之后才能够猜出来是何种酒。.
Java中的多态:
条件:
1、必须存在继承
2、必须存在重写
3、必须有父类引用指向子类对象
同一个引用类型,使用不同的实例而操作执行不同,即父类引用指向子类对象
package 多态;
public class cut {
public static void main(String[] args) {
cutman m1=new cutman();
cutman m2=new berber();
cutman m3=new doctor();
m1.cut();
m2.cut();
m3.cut();
}
}
class cutman{
public void cut(){
System.out.println("玩。。。。");
}
}
class berber extends cutman{
@Override
public void cut(){
System.out.println("理发师");
}
}
class doctor extends cutman{
@Override
public void cut(){
System.out.println("手术");
}
}
运行结果
二、
多态访问成员的特点:
在多态(父类引用指向子类的实现)的情况下,我们访问引用相关的成员(成员变量,成员方法,构造方法,静态方法)时的情况
父类类型 变量名=new 子类名称();
1、成员变量
在多态中,成员变量不存在覆盖的情况,在访问的时候是直接访问的父类中的属性
编译看左,运行也是看左
2、成员方法
在多态中,因为方法存在重写(覆盖),所以在访问的时候执行的是子类中重写的方法
编译看左,运行也是看左
3、构造方法
先执行父类的构造方法,可以帮助我们初始化父类的成员变量,然后执行子类的构造方法中其他的代码来实现子类成员变量的初始化
4、静态成员
public static void 名{
}
在多态中,不会继承静态方法,因为静态方法是属于类的,所以在多态中我们调用静态方法那么执行的也是父类中的静态方法。
编译看左,运行也是看左
多态的好处:
1、简化代码
2、提高程序的扩展性
3、提高程序的可维护性
应用:
1、使用父类作为一个方法的形参,如果一个父类作为参数,那么我们可以传入父类对象,也可以传入对应子类 ,这就是多态的常见应用
2、使用父类作为一个方法的返回值
多态的缺点:
在多态中如果我们想要调用子类特有的方法及属性时是实现不了多态中的类型转换
1、向上转型(自动转换)
格式:<父类型> <引用变量名>=new <子类型>()
;
特点:
子类转为父类,父类的引用指向子类对象。自动进行类型转换
此时通过父类引用变量调用的方法是子类覆盖或继承父类的方法
此时通过父类引用变量无法调用子类特有的属性和方法
2、向下转型(强制转换)
格式:<子类型> <引用变量名>=(<子类型>) <父类型的引用变量>
;
特点:
父类转为子类,父类引用为子类对象。强制类型转换
在向下转型的过程中,如果没有转换为真实子类对象,会出现类型转换异常
instanceof关键字
测试它左边的对象是否是它右边的类的实例,返回Boolean类型的数据,
instanceof 通常和向下转型(强制类型转换)结合使用
规避Java.lang.ClassCastException异常