19-oop多态
多态
-
动态编译(可扩展性)
-
即同一方法可以根据发送对象的不同而采取多种不同的行为方式。
-
一个对象的实际类型是确定的,但是可以指向对象的引用类型有很多(父类,有关系的类)
public class Person {
public void run(){
System.out.println("run");
}
}
public class Student extends Person{
@Override
public void run() {
System.out.println("son");
}
public void eat(){
System.out.println("eat");
}
}
/*
public static void main(String[] args) {
//一个对象的实际类型是确定的
//new Student();
//new Person();
//可以指向的引用类型就不确定了: 父类的引用指向子类
Student s1 = new Student(); //Student 能调用的方法都是自己的或父类的
Person s2 = new Student(); //Person 父类型,可以指向子类,但是不能调用子类独有的方法
Object s3 = new Student();
//这就是多态,都是学生可以表现多种状态(Student、Person、Object)
//对象能执行哪些方法,主要看对象左边类型(能否执行看引用类型,执行内容看实际类型)
s2.run();//子类重写了父类的方法,执行子类的方法 输出son
((Student) s2).eat();//强制转换,,Person———》Student 然后就可以调用eat方法
s1.run();//son
}
*/
多态注意事项:
- 多态是方法的多态,属性没有多态
- 父类和子类,有联系(才能类型转换) 不然会类型转换异常(ClassCastException)
- 存在条件: 继承关系,方法需要重写,父类引用指向子类对象 Father f1 = new Son();
不能被重写的方法:(也就没有多态)
- static 方法,属于类,它不属于实例
- final 常量 (在常量池)
- private 方法
instanseof 和 (类型转换) 引用类型
- instanceof:可以判断两个类之间是否存在父子关系(有关系为true)
- "X instanceof Y" X与Y之间是否有继承关系
/*
Student extends Person
Teacher extends Person
*/
public static void main(String[] args) {
//Object > Person > Student
Object object = new Student();
System.out.println(object instanceof Student);//true
System.out.println(object instanceof Person);//true
System.out.println(object instanceof Teacher);//false
System.out.println(object instanceof String);//false
//类型之间的转换 父 子
//Object > Person > Student
//高 低
Person student = new Student();
//将student这个对象转换会Student类型,就可以使用Student类型方法了
((Student)student).go();//高类型 转 低类型 -->强制转换
- 把子类转换成父类,向上转型
- 把父类转换为子类,向下转型:强制转换(可能丢失一些方法)
- 方便方法的调用,减少重复的代码