一、Java多态概述
1、定义
- 一个对象具备多种形态,也可以理解为事物存在的多种体现形态(父类的引用类型变量指向了子类对象,或者是接口的引用类型变量指向了接口实现类的对象)
- 定义格式:父类类型 变量名=new 子类类型();
-
多态是同一个行为具有多个不同表现形式或形态的能力。
多态就是同一个接口,使用不同的实例而执行不同操作,如图所示:
-
2.Java多态的前提和体现
-
有继承关系
-
要有方法重写(其实没有也是可以的,但是如果没有这个就没有意义。
例如 动物 d=new 猫();
d.show();
动物 d = new 狗();
d.show(); -
要有父类引用指向子类对象。
父 f = new 子();
3.多态的优点
- 1. 消除类型之间的耦合关系
- 2. 可替换性
- 3. 可扩充性
- 4. 接口性
- 5. 灵活性
- 6. 简化性
二、Java多态使用
1.多态的转型
多态的转型分为向上转型和向下转型两种
向上转型:多态本身就是向上转型过的过程
使用格式:父类类型 变量名=new 子类类型();
适用场景:当不需要面对子类类型时,通过提高扩展性,或者使用父类的功能就能完成相应的操作。
向下转型:一个已经向上转型的子类对象可以使用强制类型转换的格式,将父类引用类型转为子类引用各类型
使用格式:子类类型 变量名=(子类类型) 父类类型的变量;
适用场景:当要使用子类特有功能时。
2.多态中成员变量的使用特点
访问成员变量的方式:
1.直接通过对象名称访问成员变量,看等号左边是谁,优先用谁,没有则向上找
2.间接通过成员方法访问成员变量,看方法属于谁,优先用谁,没有则向上找
3.多态中成员方法的使用特点
在多态代码中,成员方法的访问规则是:
看new 的是谁,就使用谁,没有则向上找
成员变量:编译运行看左
成员方法:编译看左边,运行看右边
4.多态的案例
public class demo04 {
public static void main(String[] args) {
People p=new Stu();
p.eat();
//调用特有的方法
Stu s=(Stu)p;
s.study();
//((Stu) p).study();
}
}
class People{
public void eat(){
System.out.println("吃饭");
}
}
class Stu extends People{
@Override
public void eat(){
System.out.println("吃水煮肉片");
}
public void study(){
System.out.println("好好学习");
}
}
class Teachers extends People{
@Override
public void eat(){
System.out.println("吃樱桃");
}
public void teach(){
System.out.println("认真授课");
}
}
public class demo1 {
public static void main(String[] args) {
A a=new A();
a.show();
B b=new B();
b.show();
}
}
class A{
public void show(){
show2();
}
public void show2(){
System.out.println("A");
}
}
class B extends A{
public void show2(){
System.out.println("B");
}
}
class C extends B{
public void show(){
super.show();
}
public void show2(){
System.out.println("C");
}
}
运行的结果为A B
三、总结
- 多态,简而言之就是同一个行为具有多个不同表现形式或形态的能力。
- 多态的变量使用特点和成员方法使用特点
- 运行时多态的前提:继承(实现),重写,向上转型
- 向上转型与向下转型。
- 案例