多态
- 动态编译:类型:可扩展性
- 即同一个方法可以根据发送的对象不同而 采用多种不同的行为方式
- 一个对象的实际类型是确定的,但可以指向对象的引用的类型有很多
- 多态存在的条件
- 有继承关系
- 子类重写父类方法
- 父类引用指向子类对象
- 注意:多态是方法的多态,属性没有多态性
package base.Demo04; public class Person { public void run(){ System.out.println("run"); } } package base.Demo04; public class Student extends Person{ @Override public void run() { System.out.println("son"); } public void eat(){ System.out.println("eat"); } } package base.Demo04; public class Application { public static void main(String[] args) { //父类的引用指向子类 Student s1 = new Student(); Person s2 = new Student(); Object s3 = new Student(); s2.run();//子类重写了父类的方法,就执行子类的方法 s1.run(); s1.eat();//对象能执行哪些方法,主要看对象左边的类型,和右边没有关系 //父类可以指向子类,但是不能调用子类的独有的方法 } }
注意
- 多态是方法的多态,属性没有多态
- 父类和子类,有联系,类型转化异常!
- 存在条件,继承关系,方法需要重写,父类引用指向子类的对象
多态无法创建
- static 方法,属于类,不属于实例
- final 常量
- private方法
instanceof
判断一个对象是什么类型
package base.Demo04; public class Person { public void run(){ System.out.println("run"); } } package base.Demo04; public class Student extends Person{ public void go(){ System.out.println("go"); } @Override public void run(){ System.out.println("go"); } } package base.Demo04; public class Application { public static void main(String[] args) { //类型之间的转化:父类 --》子类 //低转高,可以直接转化,高转低,需要强制转化 Person s = new Student(); ((Student) s).run(); Student s1 =new Student(); s1.go(); Person s2 = s; s.run(); } }
注意
- 父类引用指向子类的对象
- 把子类转换为父类,向上转型
- 把父类转换为子类,向下转型,强制转化
- 方便方法的调用,减少重复代码
抽象:封装、继承、多态