是你所了解的JAVA多态吗?

本文参照教科书《Java语言程序设计与数据结构(第11版)》以及网上资料进行编写。
参考网址:
Java 多态 | 菜鸟教程 (runoob.com)
———————————————————————————————————————————

文章目录

  • 前言
  • 一、多态的简介
  •        1.多态的优点
  •        2.多态存在的三个必要条件
  •        3.多态的成员访问
  • 二、多态实例演示
  • 三、多态的实现方式
  • 四、多态的转型
  • 总结


前言

       本文主要是对java多态知识点的一个学习与了解。

一、多态的简介

       多态(polymorphism)顾名思义:多态就是多种形式、多种状态,在面向对象语言中,接口的多种不同的实现方式即为多态,它是面向对象的程序设计语言最核心的特征。

      多态是多种状态的现象,不是代表具体的一句代码,例如:金鱼可以说是一种海洋动物,也可以说是一条鱼等等。下面让我们一起走进Java多态的世界~

1.多态的优点

  • 1. 消除类型之间的耦合关系
  • 2. 可替换性
  • 3. 可扩充性
  • 4. 接口性
  • 5. 灵活性
  • 6. 简化性

2.多态存在的三个必要条件

  • 继承

是你所了解的JAVA多态吗?_第1张图片

  • 重写

是你所了解的JAVA多态吗?_第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;


总结

       本文就到此结束啦,谢谢观看。

你可能感兴趣的:(java)