Java多态系统的了解

多态是Java面向对象三大特性之一

  1. 先创建一个Father类,类中有say()、run()两个方法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class Father {
public int a = 0;

public Father() {
super();
}

public void say() {
System.out.println("father's say");
}

public void run() {
System.out.println("father's run");
say();
System.out.println("father.a=" + a);
}
}
  1. 再创建一个Son类,该类继承字Father,并重写say()方法:
1
2
3
4
5
6
7
8
9
10
11
12
public class Son extends Father{

public Son() {
super();
}
public int a =1;
@Override
public void say(){
System.out.println("Son's say");
System.out.println("Son.a = "+a);
}
}
  1. 创建测试类,在测试类中测试如下三种情况:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class Test {
public static void main(String[] args) {
// 运行时类型与编译时类型一致不存在多态
System.out.println("编译时类型与运行时类型是Son:");
Son ss = new Son();
ss.run();
System.out.println("ss.a = " + ss.a); // 1
// 运行时类型与编译时类型一致不存在多态
System.out.println("编译时类型与运行时类型都是Father:");
Father ff = new Father();
ff.run();
System.out.println("ff.a = " + ff.a); // 0
// 运行时类型与编译时类型不一致,存在多态的特性
System.out.println("编译时类型是Father,运行时类型是Son:");
Father fs = new Son();
fs.run();
System.out.println("fs.a = " + fs.a); // 0
}
}
  1. 运行结果:

运行结果

  1. 结果分析:

通过运行结果可以发现:在继承关系中,Father类中调用的say()方法会根据具体该类的本质来确定该调用父类方法还是子类重写的方法。但是对于类中的变量的处理方式则和方法不同。

java引用变量有两个类型:一个是编译时类型,一个是运行时类型。编译时类型由声明该变量时使用的类型决定,运行时类型有实际赋值给该变量的对象决定。如果编译时类型和运行时类型不一致,就可能出现所谓的多态。

也就是说在Java中对于把一个子类直接赋值给父类引用变量时,当运行时调用该方法引用变量的方法时,其方法行为总是表现出子类方法的行为特征,而不是父类方法的行为特征

相同类型的变量、调用同一个方法时呈现出多重不同的行为特征,这就是多态

但是与方法不同的是,对象的实例变量则不具备多态性,会直接输出编译时类型的实例变量。

-------------本文结束感谢您的阅读-------------