java类的多态

一、什么是多态

定义:父类的引用指向子类的对象
父类 Animal
子类 cat继承Animal
main(){
Cat cat = new Cat();
}
创建子类对象之前创建父类对象
main(){
Animal catAnimal = new Cat();
}
父亲的引用指向子类的对象----多态
数据类型是干什么用的?
  • 基本数据类型
  • 引用数据类型
数据类型决定数据在内存当中的存储形式

二、为什么有多态

多态能解决java语言设计当中的问题——>数据类型的转换(使用向上转型来解决---子类的对象由父类的类型接收)

下面是一些具体的实例

A.java

public class A {
	public String Show(D obj) {
		return "A and D";
	}
	public String Show(A obj) {
		return "A and A";
	}
	public String Show() {
		return "无参的A";
	}
}

B.java

public class B extends A{
	public String Show(Object obj) {
		return "A and D";
	}
	public String Show(A obj) {
		return "B and A";
	}
	public String Show() {
		return "无参的B";
	}
}

C.java

public class C extends B{

}

D.java

public class D extends B{

}

Test.java

public class Test {
	public static void main(String[] args) {
		A a1 = new A();
		A a2 = new B();
		B b1 = new B();
		C c = new C();
		D d = new D();
		
		System.out.println(a1.Show());//1
		System.out.println(a2.Show());//2
		System.out.println(b1.Show());//3
		
		System.out.println(a1.Show(b1));//4
		System.out.println(a1.Show(c));//5
		System.out.println(a1.Show(d));//6
		
		System.out.println(a2.Show(b1));//7
		System.out.println(a2.Show(c));//8
		System.out.println(a2.Show(d));//9
		
		System.out.println(b1.Show(b1));//10
		System.out.println(b1.Show(c));//11
		System.out.println(b1.Show(d));//12
		
	}
	
}

最终结果:

无参的A
无参的B
无参的B
A and A
A and A
A and D
B and A
B and A
A and D
B and A
B and A
A and D

解释:

创建子类对象之前创建父类对象

先创建的是什么类(内存空间创建了几个类,new B()),再考虑它的数据类型能调用哪些方法(A a2),不存在的话,再考虑是否需要向上转型

1:内存空间创建了A一个类,a1只能调用A里面的方法,所以直接输出‘无参的A’

2:内存空间先创建父类A,再创建B,a2是A类型的只能调用A里面的方法,调用子类对象要重写父类中的方法,所以输出‘无参的B’

3:内存空间先创建父类A,再创建B,b1是B类型的AB中的方法都可以调用,调用子类对象要重写父类中的方法,所以输出‘无参的B’

4:内存空间创建了A一个类,a1调用A里面的方法,b1是B类型的,a1能调用的方法里面没有B类型的传参,所以向上转型成为A类型的,调用Show(A obj),输出‘A and A’

5:内存空间创建了A一个类,a1调用A里面的方法,c是C类型的,a1能调用的方法里面没有C类型的传参,所以向上转型成为B类型的,a1能调用的方法里面也没有B类型的传参,所以再向上转型成为A类型的,调用Show(A obj),输出‘A and A’

6:内存空间创建了A一个类,a1调用A里面的方法,d是D类型的,a1能调用的方法里面有D类型的传参,所以调用Show(D obj),输出‘A and D’

7:内存空间先创建父类A,再创建B,a2是A类型的只能调用A里面的方法,调用子类对象要重写父类中的方法,a2能调用的方法里面没有B类型的传参,所以向上转型成为A类型的,调用重写之后的Show(A obj),输出‘B and A’

8:内存空间先创建父类A,再创建B,a2是A类型的只能调用A里面的方法,调用子类对象要重写父类中的方法,c是C类型的,a2能调用的方法里面没有C类型的传参,所以向上转型成为B类型的,a1能调用的方法里面也没有B类型的传参,所以再向上转型成为A类型的,调用Show(A obj),输出‘B and A’

9:内存空间先创建父类A,再创建B,a2是A类型的只能调用A里面的方法,d是D类型的,a2能调用的方法里面有D类型的传参,所以调用Show(D obj),输出‘A and D’

10:内存空间先创建父类A,再创建B,b1是B类型的AB中的方法都可以调用,调用子类对象要重写父类中的方法,b1能调用的方法里面没有B类型的传参,所以向上转型成为A类型的,调用重写之后的Show(A obj),输出‘B and A’

11:内存空间先创建父类A,再创建B,b1是B类型的AB中的方法都可以调用,调用子类对象要重写父类中的方法,c是C类型的,b1能调用的方法里面没有C类型的传参,所以向上转型成为B类型的,b1能调用的方法里面也没有B类型的传参,所以再向上转型成为A类型的,调用重写之后的Show(A obj),输出‘B and A’

12:内存空间先创建父类A,再创建B,b1是B类型的AB中的方法都可以调用,d是D类型的,b1能调用的方法里面有D类型的传参,所以调用Show(D obj),输出‘A and D’

Java多态性和抽象是面向对象编程的重要特性。 **多态(Polymorphism)**: 在Java中,多态允许不同型的对象对同一消息作出响应。它主要有两种形式:方法重载(Overloading)和方法覆盖(Overriding)。方法重载是指在同一中有多个同名方法,但参数列表不同;方法覆盖则是指子重写父的方法,提供自己的实现。通过引用父或接口型的对象,可以调用其实现的具体方法,体现了“一种接口多种实现”的原则。 **抽象(Abstract Class)**: 抽象是一种特殊的,它不能被实例化,主要用于定义一组共同的属性和行为。抽象可以包含抽象方法(没有实现体的方法,仅声明了方法名和返回型)以及非抽象方法。子继承抽象后,如果实现了所有的抽象方法,那么该子就可以是具体的(non-abstract);如果没有实现所有抽象方法,则子也需要变为抽象。 使用场景示例: ```java abstract class Animal { // 抽象 abstract void sound(); // 抽象方法 } class Dog extends Animal { // 具体子 @Override void sound() { System.out.println("汪汪汪"); } } class Cat extends Animal { @Override void sound() { System.out.println("喵喵喵"); } } Dog dog = new Dog(); Cat cat = new Cat(); dog.sound(); // 输出:汪汪汪 cat.sound(); // 输出:喵喵喵 ``` 在这个例子中,`Animal`是抽象,`Dog`和`Cat`是它的子并实现了`sound()`方法。通过`Animal`型的引用,我们可以调用它们各自的`sound()`实现,展示了多态性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值