父类
package com.encapsulation.demo03;
public class Person {
public void run () {
System.out.println("run");
}
}
子类1
package com.encapsulation.demo03;
public class Student1 extends Person {
// 把父类的方法进行重写
@Override
public void run() { // 根据父类调用 重写为son1
System.out.println("son1");
}
public void eat() {
System.out.println("eat");
}
}
子类2
package com.encapsulation.demo03;
public class Student2 extends Person {
// 把父类的方法进行重写
@Override
public void run() { // 根据父类调用 重写为son2
System.out.println("son2");
}
public void eat2() {
System.out.println("eat2");
}
}
调用
package com.encapsulation.demo03;
public class Application {
public static void main(String[] args) {
// 一个对象的实际类型是确定的
// 可以指向的引用类型是不一定的: 父类的引用指向子类
// Student能调用的方法都是自己的或者是父类的
Student s1 = new Student();
// Person 父类型,可以指向子类,但是不能调用子类独有的方法
// 指向子类Student1 由Student1重写父类的方
Person s2 = new Student1();
// 指向子类Student2 由Student2重写父类的方法
Person s3 = new Student2();
Object s4 = new Student(); // Object为所有类的祖宗类
s1.run(); // son1
s2.run(); // Student1重写 打印: son1
s3.run(); // Student2重写 打印: son2
// 对象能执行哪些方法,主要看对象左边的类型,和右边的关系不大
((Student) s2).eat();// 强制转换 高转低 把 Person类型转换为 Student
}
}
![image]()
总结
- 多态是方法的多态,属性没有多态
- 父类和子类,有联系 类型转换异常! ClassCastException!
- 存在的条件
- 继承关系
- 方法需要重写
- 父类引用指向子类对象 father f1 = new Son();
- 概念
- 一个父类有很多子类, 不同的子类负责重写父类的方法
- 当父类需要用不同的功能时,就指向不同的子类就可以了 【father f? = new Son?(); 】来完成各种功能,让实例表现不同的状态