0%

Java基础(多态性相关)

一、什么是多态

1、 多态是继封装、继承之后,面向对象的第三大特性。

2、理解多态性:可以理解为一个事物的多种形态。 如Student类继承了Person类,一个Student的对象便既是Student,又是Person。

3、 何为多态性:多态性体现在 父类的引用指向子类的对象

4、多态的使用:当调用子父类同名同参的方法时,实际执行的是子类重写父类的方法(虚拟方法调用)

5、多态的定义格式:父类类型 变量名 = new 子类类型( );

二、多态中成员特点

1、多态成员变量:编译、运行看左边(多态性不适用于属性)

1
2
Fu f = new Zi();
System.out.println(f.num); //f是Fu中的值,只能取到父类中的值

2、多态成员方法:编译看左边,运行看右边

1
2
Fu f1 = new Zi();
System.out.println(f1.show()); //f1的编译类型是Fu,但实际运行时是Zi,所以调用的是子类重写后的方法。

三、多态是运行时行为

如何证明多态是 编译时行为 还是 运行时行为

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
public class DuoTai {
public static Animal getInstance(int key) {
switch (key) {
case 0:
return new Dog();
default:
return new Cat();
}
}

public static void main(String[] args) {
int key = new Random().nextInt(2);
System.out.println(key);
Animal animal = getInstance(key);
animal.eat();
}
}
class Animal {
public void eat() {
System.out.println("animal eat food");
}
}
class Dog extends Animal {
public void eat() {
System.out.println("Dog eats bone");
}
}
class Cat extends Animal {
public void eat() {
System.out.println("Cat eats fish");
}
}
1
2
> 1
> Cat eats fish

可见,多态是一种动态绑定,运行时行为。

四、多态的向下和向上转型

1、向上转型

​ 多态本身就是向上转型过的过程。

​ 使用格式:父类类型 变量名 = new 子类类型();

​ 适用场景:当不需要面对子类类型时,通过提高扩展性,或者使用父类的功能就能完成相应的操作。

有了对象的多态性以后,内存中实际上是加载了子类的属性和方法的,但是由于变量声明为父类类型,导致编译时,只能调用父类中声明的属性和方法。子类特有的属性和声明不能调用。

​ 那么如何才能调用子类特有的属性和方法呢?可以利用多态的向下转型

2、向下转型

一个已经向上转型的子类对象可以使用强制类型转换的格式,将父类引用类型转为子类引用各类型。

​ 使用格式:子类类型 变量名=(子类类型) 父类类型的变量;

​ 适用场景:当要使用子类特有功能时。

不过在使用强转时,可能会出现ClassCastException的异常,所以通常在强转时会利用instanceof关键字进行判断,返回true就进行向下转型。

五、instanceof的使用

作用:用来判断某个对象是否属于某种数据类型。

  • 注意: 返回类型为布尔类型
1
2
3
4
5
6
7
Fu f1=new Zi();
Fu f2=new Son();
if(f1 instanceof Zi) {
System.out.println("f1是Zi的类型");
}else {
System.out.println("f1是Son的类型");
}
  • 如果 a instanceof A返回true,则a instanceof B也返回true,其中,类B是类A的父类。
  • 要求a所属的类与类A必须是子类和父类的关系,否则编译错误。

六、练习

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public class Test {
public static void main(String[] args) {
Sub s = new Sub();
System.out.println(s.count); //20
s.display(); //20

Base b = s; //多态
System.out.println(b == s); //true
System.out.println(b.count); //10
b.display(); //20
}
}
class Base{
int count = 10;
public void display() {
System.out.println(this.count);
}
}
class Sub extends Base {
int count = 20;

@Override
public void display() {
System.out.println(this.count);
}
}
-------------本文结束感谢您的阅读-------------