多态
多态,按照字面意思来解释就是多种形态。
一句话概括就是同一种事物不同的表现形态
举个栗子:
水
在常温下水是以液体的形态呈现;而在零度或者零度以下水又会被冻结以固态的形态呈现;当温度很高的时候水又会被蒸发以气态的形态呈现。
而在程序中可以通过代码描述这种关系,只需满足继承这一关系即可
多态的定义与使用:
父类类型 变量名 = new 子类类型();
变量名.方法名();
-
普通类多态定义的格式
父类 变量名 = new 子类();
-
抽象类多态定义的格式
抽象类 变量名 = new 抽象类子类();
-
接口多态定义的格式
接口 变量名 = new 接口实现类();
多态成员的特点
-
多态成员变量
当子父类中出现同名的成员变量时,多态调用该变量时:
编译时期:参考的时引用型变量所属的类中是否有被调用的成员变量。没有,编译失败。
运行时期:也是调用引用型变量所属的类中的成员变量。
口诀:编译和运行都参考等号的左边,编译运行看左边。
-
多态成员方法
当子父类中出现同名的成员方法时,多态调用该方法时:
编译时期:参考引用变量所属的类,如果类中没有调用的方法,编译失败。
运行时期:参考引用变量所指的对象所属的类,运行所属类中的成员方法。
口诀:编译看左,运行看右。
以下演示多态成员特点:
/**
* Project:javaSE
* Package:demo
*
* @date: 2020/12/23
* @author: CnreCoder
* @signature: Bug Free
* @version: 1.8
*/
/***
* 演示多态成员的特点
*/
public class Demo1 {
public static void main(String[] args) {
//创建多态对象
Fu i = new Zi();
//输出多态对象的成员属性
System.out.println(i.str);
//调用多态对象的成员方法
i.method();
}
}
/***
* 父类
*/
class Fu{
/**
* 父类成员属性
*/
String str = "父类变量";
/**
* 父类成员方法
*/
public void method(){
System.out.println("父类方法");
}
}
/***
* 子类
*/
class Zi extends Fu{
/**
* 父类成员属性
*/
String str = "子类变量";
/**
* 父类成员方法
*/
@Override
public void method(){
System.out.println("子类方法");
}
}
多态中向上转型与向下转型
多态的转型分为向上转型与向下转型两种:
-
向上转型:当有子类对象赋值给一个父类引用时,便是向上转型,多态本身就是向上转型的过程。
格式:
//父类类型 变量名 = new 子类类型(); Animal animal = new Animal();
-
向下转型:一个已经向上转型的子类对象可以使用强制类型转换的格式,将父类引用转为子类引用,这个过程就是向下转型。如果时直接创建父类对象,是无法向下转型的
格式:
//子类类型 变量名 = (子类类型) 父类类型的变量; //变量animal实际上指向Dog对象 Dog dog = (Dog) animal;
以下演示向上向下转型
/**
* Project:javaSE
* Package:demo
*
* @date: 2020/12/23
* @author: CnreCoder
* @signature: Bug Free
* @version: 1.8
*/
/***
* 演示多态的向上向下转型
*/
public class Demo2 {
public static void main(String[] args) {
//多态 旺财是动物 这里自动使用了向上转型
Animal animal1 = new Dog();
//输出动物的name属性
System.out.println(animal1.name);
//创建动物对象
Animal animal2 = new Animal();
//调用动物方法
animal2.method();
//调用旺财方法
animal1.method();
//向下转型
Dog dog = (Dog) animal1;
//输出旺财的name属性
System.out.println(dog.name);
}
}
/**
* 父类
*/
class Animal {
/**
* 父类的属性
*/
String name = "动物";
/**
* 父类的方法
*/
public void method() {
System.out.println("动物的方法");
}
}
/**
* 子类
*/
class Dog extends Animal {
/**
* 子类的属性
*/
String name = "旺财";
/**
* 子类的方法
*/
@Override
public void method() {
System.out.println("旺财的方法");
}
}
多态的优缺点
优点:
可以提高可维护性(多态前提所保证的),提高代码的可扩展性
为了方便以后使用接口和抽象类时,想访问其中的成员
缺点:
无法直接访问子类特有的成员
如果你学废了就 一键三连 支持支持我吧,谢谢!其他优质文章点击这里即可观看!