springboot多态_JAVA三大特性之多态

本文详细介绍了JAVA的多态性概念,包括其存在的必要条件:继承、子类重写父类方法和父类引用指向子类对象。通过代码示例展示了基于继承实现的多态性,解释了在多态情况下方法调用和字段访问的规则,并提供了基于接口实现多态性的思考。总结了对象的编译类型和运行类型,强调了静态方法与多态的关系以及字段的非多态性特点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、介绍

多态是同一个行为具有多个不同表现形式或形态的能力

多态就是同一个接口,使用不同的实例而执行不同操作

多态性是对象多种表现形式的体现。

2、多态存在的必要条件

继承

子类重写父类方法

父类引用指向子类对象

比如:Parent parent = new Child();

3、代码示例

①、基于继承实现的多态public class {

public String name = "animal";

public void eat(Animal animal){

System.out.println("animal say ......");

}

public void sleep(){

System.out.println("animal sleep......");

}

public static void speak(){

System.out.println("animal speak .......");

}

}

public class Cat extends {

/**

* 重写父类的eat()方法

*

* @param animal

*/

public void eat(Animal animal) {

System.out.println("****************************************");

if (animal instanceof Animal) {

System.out.println("animal is instanceof Animal.....");

}

if (animal instanceof Cat) {

System.out.println("animal is instanceof Cat.....");

}

if (animal instanceof Dog) {

System.out.println("animal is instanceof Dog.....");

}

if (animal instanceof Object) {

System.out.println("animal is instanceof Object.....");

}

System.out.println(animal + " say .......");

System.out.println("****************************************");

}

}

public class Dog extends {

public String name = "dog";

/**

* 重写父类的sleep()方法

*/

public void sleep() {

System.out.println("dog sleep......");

}

public static void speak() {

System.out.println("dog speak .......");

}

}

//测试案例

public class TestMain {

public static void main(String[] args) {

Animal animal1 = new Cat();

//父类的引用,根据传入不同的子类实例,在运行期间会表现出具体子类的特征

animal1.eat(new Cat());

animal1.eat(new Dog());

Animal animal2 = new Dog();

animal2.sleep(); // 非静态方法,JVM调用的是具体子类的sleep(Dog)的方法

animal2.speak(); // 静态方法不能被重写,仍然调用的是父类的speak方法

System.out.println(animal2.name); //字段不具有多态性,仍然是父类的属性值

}

}

测试结果// animal 对象体现的多态性,是 Animal,Dog,Object的实例

****************************************

animal is instanceof Animal.....

animal is instanceof Cat.....

animal is instanceof Object.....

com.gulj.springbootvalidator.duotai.Cat@378bf509 say .......

****************************************

****************************************

animal is instanceof Animal.....

animal is instanceof Dog.....

animal is instanceof Object.....

com.gulj.springbootvalidator.duotai.Dog@5fd0d5ae say .......

****************************************

dog sleep......

animal speak .......

总结说明

对象具有两种类型:

编译类型(编译类型必须是运行类型的父类或相同)

运行类型

在形式上,类定义的对象只能看到自己所属类中的成员。父类对象无法看到子类的新扩充方法。

父类被关键词static修饰的静态方法是不能被子类覆盖的,可以利用这一特性达到隐藏的效果

使用父类类型的引用指向子类的对象

当子类和父类存在相同的字段时候,无论修饰符是什么,都会在各自的内存空间中存储数据,则字段不具有多态性

如果子类中重写了父类中的一个方法,那么在调用这个方法的时候,将会调用子类中的这个方法// final修饰的对象不能改变其值;只能指向animal这个地址(引用关系不能变)但是对象里面的值可以改变。

final Animal animal = new Cat();

②、基于接口实现的多态(不在举例,读者可以自行实现)

在接口的多态中,指向接口的引用必须是指定这实现了该接口的一个类的实例程序,在运行时,根据对象引用的实际类型来执行对应的方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值