多态
- 动态编译:类型:可扩展性
- 即同一个方法可以根据发送的对象不同而 采用多种不同的行为方式
- 一个对象的实际类型是确定的,但可以指向对象的引用的类型有很多
- 多态存在的条件
- 有继承关系
- 子类重写父类方法
- 父类引用指向子类对象
- 注意:多态是方法的多态,属性没有多态性
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();
}
}
注意
- 父类引用指向子类的对象
- 把子类转换为父类,向上转型
- 把父类转换为子类,向下转型,强制转化
- 方便方法的调用,减少重复代码
抽象:封装、继承、多态
浙公网安备 33010602011771号