一 、什么是多态?
一种事物的多种存在形态,比如说男人和女人都是人,人可以分为男人和女人
二、多态使用的条件
-
要有继承
-
要有重写
-
父类引用指向子类对象(向上转型)
三、 对象类型的转换:
向上可以自动转换类型,由子类转换成父类!
向下(由父类转换成子类)强制类型转换!以调用该对象特有的方法!
demo:
/**
* 测试多态
*
*/
public class TextPolym {
public static void main(String[] args) {
Animal a=new Animal();
animalCry(a);
Dog b=new Dog();
animalCry(b);
Animal b1=new Dog(); //向上可以自动转换类型,由子类转换成父类!
animalCry(b1);
Dog b2=(Dog)b1; //向下(由父类转换成子类)强制类型转换!以调用该对象特有的方法!
b2.seeDoor(); //调用该对象特有的方法
Animal c=new Cat();
animalCry(c);
}
static void animalCry(Animal a1) {
a1.shout();
}
}
class Animal{
public void shout() {
System.out.println("叫了一声!");
}
}
class Dog extends Animal{
public void shout() {
System.out.println("汪汪汪");
}
public void seeDoor() {
System.out.println("看门中!"); //该对象特有的方法!
}
}
class Cat extends Animal{
public void shout() {
System.out.println("喵喵喵");
}
}
四、多态面试题
-
1、Java 中实现多态的机制是什么?
-
靠的是父类或接口定义的引用变量可以指向子类或具体实现类的实例对象,而程序调用的方法在运行期才动态绑定,就是引用变量所指向的具体实例对象的方法,也就是内存里正在运行的那个对象的方法,而不是引用变量的类型中定义的方法。
-
2、Java多态有什么优势?
-
(1)可替换性(substitutability)。多态对已存在代码具有可替换性。例如,多态对圆Circle类工作,对其他任何圆形几何体,如圆环,也同样工作。
-
(2)可扩充性(extensibility)。多态对代码具有可扩充性。增加新的子类不影响已存在类的多态性、继承性,以及其他特性的运行和操作。实际上新加子类更容易获得多态功能。例如,在实现了圆锥、半圆锥以及半球体的多态基础上,很容易增添球体类的多态性。
-
(3)接口性(interface-ability)。多态是超类通过方法签名,向子类提供了一个共同接口,由子类来完善或者覆盖它而实现的。
-
(4)灵活性(flexibility)。它在应用中体现了灵活多样的操作,提高了使用效率。
-
(5)简化性(simplicity)。多态简化对应用软件的代码编写和修改过程,尤其在处理大量对象的运算和操作时,这个特点尤为突出和重要。
-
3、运行时多态存在的必要条件是什么?
-
(1)要有继承(包括接口的实现);(2)要有重写;(2)父类引用指向子类对象。
-
4、按要求编写一个Java应用程序:
-
(1)定义一个类,描述一个矩形,包含有长、宽两种属性和计算面积方法。
-
(2)编写一个类,继承自矩形类,同时该类描述长方体,具有长、宽、高属性和计算体积的方法。
-
(3)编写一个测试类,对以上两个类进行测试,创建一个长方体,定义其长、宽、高,输出其底面积和体积。
-
示例代码如下:
-
class Rectangle { double chang; double kuan; Rectangle(double chang,double kuan){ this.chang = chang; this.kuan = kuan; } double getArea(){ return chang * kuan; } } class Rectangular extends Rectangle{ double gao; Rectangular(double chang, double kuan,double gao) { super(chang, kuan); this.gao = gao; } double getVolume(){ return gao * getArea(); } } class RectangleTest{ public static void main(String []args){ System.out.println("开始执行"); Rectangular rectangular = new Rectangular(15,12,5); System.out.println("这是体积计算:" + rectangular.getVolume()); System.out.println("这是面积计算:" + rectangular.getArea()); System.out.println("另一种实例化方式:"); System.out.println("这是面积计算:" + new Rectangle(15,12).getArea()); System.out.println("这是体积计算:" + new Rectangular(15,12,5).getVolume()); } }
-
运行结果:
-
开始执行
-
这是体积计算:900.0
-
这是面积计算:180.0
-
另一种实例化方式:
-
这是面积计算:180.0
-
这是体积计算:900.0