本文参照教科书《Java语言程序设计与数据结构(第11版)》以及网上资料进行编写。
参考网址:Java 多态 | 菜鸟教程 (runoob.com)
———————————————————————————————————————————
前言
本文主要是对java多态知识点的一个学习与了解。
一、多态的简介
多态(polymorphism)顾名思义:多态就是多种形式、多种状态,在面向对象语言中,接口的多种不同的实现方式即为多态,它是面向对象的程序设计语言最核心的特征。
多态是多种状态的现象,不是代表具体的一句代码,例如:金鱼可以说是一种海洋动物,也可以说是一条鱼等等。下面让我们一起走进Java多态的世界~
1.多态的优点
- 1. 消除类型之间的耦合关系
- 2. 可替换性
- 3. 可扩充性
- 4. 接口性
- 5. 灵活性
- 6. 简化性
2.多态存在的三个必要条件
- 继承
- 重写
- 父类引用指向子类对象:Parent p = new Child();
当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;如果有,再去调用子类的同名方法。
多态的好处:可以使程序有良好的扩展,并可以对所有类的对象进行通用处理。
3.多态的成员访问
- 成员变量:编译时看父类、运行时看父类
- 直接通过对象名称访问成员变量:等号左边优先用
- 间接通过成员方法访问
- 成员方法:编译时看父类、运行时看子类
二、实例演示
1.代码中来体现多态性:父类引用指向子类对象。
- 格式:
- 父类名称 对象名 =new 子类名称();
- 接口名称 对象名 =new 实现类名称();
实例:
首先创建一个polymorphism包,里面建立一个Animal类,定义方法run和变量size。
代码如下(示例):
package polymorphism;
public class Animal {
int size= 10;
//定义方法run
public void run() {
System.out.println("run run run!");
}
}
2.接着我们来创建一个Dog子类,继承Animal类。
代码如下(示例):
package polymorphism;
//创建Dog类,继承Animal类
public class Dog extends Animal{
//成员变量访问
int size =5;
//方法重写,具体到子类
@Override
public void run() {
System.out.println("Dog runs fast!");
}
}
3.在包内创建一个text类,来进行JAVA实例演示。
成员访问:
代码如下(示例):
package polymorphism;
public class test {
public static void main(String[] args) {
// TODO Auto-generated method stub
//父类引用指向子类对象
Animal dog = new Dog(); //体现多态
//成员变量访问:编译看父类,运行看父类
System.out.println(dog.size);
//成员方法访问:编译看父类(父类有则正常编译),运行看子类
dog.run();
}
}
运行结果如下:
10
Dog runs fast!
所以:进行成员变量访问时,编译和运行都要取决于父类,而进行成员方法访问时,运行要取决于子类,但是编译还是要看父类中有无此方法定义。
三、多态的实现方式
方式一:重写
//方法重写
public class Test1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
A a=new A();
a.p(10);
a.p(10.0);
}
}
class B{
public void p(double i) {
System.out.println(i*2);
}
}
class A extends B{
//This method overrides the method in B
public void p(double i) {
System.out.println(i);
}
}
方式二:接口
-
1. 生活中的接口最具代表性的就是插座,例如一个三接头的插头都能接在三孔插座中,因为这个是每个国家都有各自规定的接口规则,有可能到国外就不行,那是因为国外自己定义的接口类型。
-
2. java中的接口类似于生活中的接口,就是一些方法特征的集合,但没有方法的实现。具体可以看 java接口 这一章节的内容。
方式三:抽象类和抽象方法
继承抽象方法的子类必须重写方法。否则,该子类也必须声明为抽象类。
四、多态的转型
1.向上转型
(1)格式:父类名称 对象名 = new 子类名称();
(2)含义: 右侧创建一个子类对象,把它当做父类来看待使用
(3)注意:向上转型一定是安全的,从小范围转向了大范围,例如:从一条鱼向上转换为一个海洋动物。
(4)当不需要面对子类类型时,通过提高扩展性,或者使用父类的功能就能完成相应的操作,通常使用向上转型。类似于:自动类型转换:double x=2;
//向上转型
Animal animal=new Dog();
2.向下转型
(1)格式:子类名称 对象名 = (子类名称)父类对象;
(2)含义:将父类对象还原成为本来的子类对象
(3)注意事项:必须保证对象创建时就是小范围对象,被认为是大范围对象,才能向下转型成为原本的小范围对象。
(4)当要使用子类特有功能时,就需要使用向下转型。
(5)类似于:强制类型转换:int a=(int)10.5;(不可以转换)
//向下转型
Dog dog= (Dog) animal;
总结
本文就到此结束啦,谢谢观看。