🧁 本次文章介绍了Java三大特性之一的多态性
分别介绍了多态的定义、作用、相关问题
文中还包括方便理解的相关例子
多态的定义
🥩 大伙知道变形金刚吧,我们将Java多态比作变形金刚
变形金刚 | Java多态 |
---|---|
车形态 | 编译阶段 |
人形态 | 运行阶段 |
1️⃣多态的定义
- 必要条件:存在父子继承关系
- 表现:在编译和运行阶段状态表现呈现多态
2️⃣多态表现例子
🧂 存在练习生父类(class Trainee)和IKUN子类(class IKUN)
练习生父类拥有Sing、Dance方法,IKUN子类拥有Sing、Dance、Rap方法
IKUN子类中的Sing、Dance方法是对父类的重写,Rap方法是IKUN独有
练习生父类(class Trainee)
/* * 练习生类 * 作为基类 * 方法为唱歌方法和跳舞方法 * */
public class Trainee {
public void Sing(){
System.out.println("singing...");
}
public void Dance(){
System.out.println("dancing...");
}
}
IKUN子类(class IKUN)
/* * IKUN类 * 作为练习生的子类 * 独有方法为rap * */
public class IKUN extends Trainee{
public void Sing(){
System.out.println("IKUN singing...");
}
public void Dancing(){
System.out.println("IKUN dancing...");
}
public void Rap(){
System.out.println("IKUN rapping...");
}
}
主方法
/* * 主方法 * */
public class Test {
/** * @param args */
public static void main(String[] args) {
Trainee trainee = new IKUN();
trainee.Sing();
}
}
在主方法中利用练习生父类指针指向IKUN子类对象:Trainee trainee = new IKUN();
运行结果
3️⃣问题
为什么我们利用的是练习生父类的指针,并且在代码层面上调用的是练习生父类的方法,结果却是显示IKUN子类对象方法的结果?
这个例子就体现出了Java的多态特性。出现这种运行结果是因为在编译阶段,编译器只会认为trainee引用是一个练习生父类型,不会管它指向IKUN对象,此时你也只能调用练习生父类型的Sing、Dance方法,无法调用IKUN子类型的Rap方法。但到了运行阶段,运行栈trainee引用会寻址到堆内存中IKUN对象,所以实际上执行的是IKUN对象中的Sing方法。
多态的作用
问题:有人会问,这个多态有啥用,搞这么麻烦,代码可读性也不高。
1️⃣多态的作用
- 提升代码的可扩展性
- 降低了程序的耦合性
2️⃣作用的例子
开始存在猫类、主人类,之后增加了狗类、宠物类
在主人类中存在喂养宠物方法
在主方法中实现了主人喂养宠物动作
*️ 刚开始
猫类(class Cat)、主人类(class Person)
public class Cat {
public void eat(){
System.out.println("Cat eating...");
}
}
public class Person {
//喂养宠物
public static void feed(Cat c){
c.eat();
}
}
主方法
public class FeedPet {
/** * @param args */
public static void main(String[] args) {
Person person = new Person();
Cat cat = new Cat();
person.feed(cat);
}
}
结果
*️之后
此时我要喂养狗,得创建狗类子类(class Dog)。如果我们没有多态,此时我们还得修改Person类中的方法,得增加一个喂养狗的方法,因为feed方法是喂养猫的方法,但如果有一百个动物,那就太麻烦了。这时候多态就体现其在扩展性的优势了。我们只需将feed方法中的形参修改为Pet p及父类引用。
修改后的主人类
public class Person {
//喂养宠物
public static void feed(Pet p){
p.eat();
}
}
这样我们将Dog对象、Cat对象或者以后继承Pet父类型的子对象传入feed方法,这样就是多态的体现,它会执行特定对象的eat方法。相当于以下代码:
Pet p = new Cat();
(OR) Pet p = new Dog();
主方法
public class FeedPet {
/** * @param args */
public static void main(String[] args) {
Person person = new Person();
Cat cat = new Cat();
person.feed(cat);
Dog dog = new Dog();
person.feed(dog);
}
}
结果
多态的问题
如果你看完前面,会有个疑问(如果没有这个疑问说明你还没完全理解IKUN代码哈),就是在编译阶段是父类型引用,不允许我调用子类型的独有方法。但IKUN就要Rap,只会普通练习生的唱跳不符合我IKUN的身份。这时候可以利用instanceof进行类型判断,并且利用强制类型转换进行向下转换即可,由于太简单就不赘述了。
文章评论