什么是多态
A: 方法或对象具有多种形态,是面向对象的第三大特征,多态是建立在封装和继承的基础之上的。简单来说,多态是具有表现多种形态的能力的特征。
多态的优点
- 消除类型之间的耦合关系
- 可替代性
- 可扩充性
- 接口性
- 灵活性
- 简化性
多态的分类
重载式多态
重载式多态在编译时已经确定好了。方法名相同而参数列表不同的一组方法就是重载。在调用这种重载的方法时,通过传入不同的参数最后得到不同的结果。
案例
public void add(int a, int b) {
int c = a + b;
System.out.println("两个整数相加得 " + c);
}
public void add(float a, float b) {
float c = a + b;
System.out.println("两个float型浮点数相加得" + c);
}
重写式多态
重写式多态是指在执行期间判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。也就是说,只有程序运行起来,你才知道调用的是哪个子类的方法。 这种多态通过函数的重写以及向上转型来实现,我们接下来讲的所有多态都是重写式多态,因为它才是面向对象编程中真正的多态。
多态的向上转型
Q:什么是多态的向上转型?
A:父类的引用指向子类的对象叫做向上转型。
Q:向上转型的怎么写?
A:父类类型 引用名 = new 子类类型();
Q:向上转型有什么特点?
A:编译类型看左边,运行类型看右边。可以调用父类中的所有成员。最终运行效果看子类的具体实现。
案例
//动物类,拥有一个call()方法
class Animal {
public void call() {
System.out.println("动物叫!");
}
}
// 狗类,实现父类动物,并重写call()方法
class Dog extends Animal {
public void call() {
System.out.println("汪汪!");
}
public void color() {
System.out.println("狗狗颜色!");
}
}
// 猫类,实现父类动物,并重写call()方法
class Cat extends Animal {
public void call() {
System.out.println("喵~");
}
public void color() {
System.out.println("猫猫颜色!");
}
}
//测试类
public class Test {
public static void main(String[] args) {
//向上转型
Animal animal = new Dog();
animal.call();
animal = new Cat();
animal.call();
}
}
这里 Animal animal = new Dog();
将子类对象Dog
转化为父类对象Animal
,这个时候Animal
引用指向的是子类对象,所以调用的方法是子类方法。
向上转型时,子类单独定义的方法会丢失。比如,上面案例中的Dog
类和Cat
类都定义了自己的call
方法,当进行了向上转型后,Animal
引用指向Dog
类的实例时是访问不到color
方法的,Animal.color()
会报错。
多态的向下转型
Q:什么是多态的向下转型?
A:子类引用指向父类对象(父类型,实例是子类的实例化)叫做多态的向下转型。通常需要进行强制类型转换。
案例
//动物类,拥有一个call()方法
class Animal {
public void call() {
System.out.println("动物叫!");
}
}
// 狗类,实现父类动物,并重写call()方法
class Dog extends Animal {
public void call() {
System.out.println("汪汪!");
}
public void color() {
System.out.println("狗狗颜色!");
}
}
// 猫类,实现父类动物,并重写call()方法
class Cat extends Animal {
public void call() {
System.out.println("喵~");
}
public void color() {
System.out.println("猫猫颜色!");
}
}
//测试类
public class Test {
public static void main(String[] args) {
//向上转型
Animal animal = new Dog();
//向下转型
Dog dog = (Dog)animal;//向下转型,强制类型转换
dog.color();//输出狗狗颜色!
Cat cat = (Cat)animal;//报错
Animal animal = new Animal();
Dog dog = (Dog)animal;//报错
}
}
这里需要注意Dog dog = (Dog)Animal;
可以正常运行,是因为dog
本身就是Dog
对象,可以正常转型为Dog
,而不能转型为Cat
。aniaml
类是Animal
对象,他也不能向下转型成任何子类对象。文章来源:https://www.toymoban.com/news/detail-808651.html
|
1)向下转型的前提是父类引用指向的是子类对象,也就是说,向下转型之前,它得先进行过向上转型。
2)向下转型只能转型为本类对象。文章来源地址https://www.toymoban.com/news/detail-808651.html
到了这里,关于【Java面向对象】多态的详细介绍,简单易懂,看这一篇就够了的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!