instanceof和类型转换
-
同一个方法可以根据发送对象的不同而采取多种不同的行为方式
-
一个对象的实际类型是确定的,但可以指向对象的引用的类型有很多(父类,有关系的类)
-
多态存在的条件
- 有继承关系
- 子类重写父类方法
- 父类引用指向子类对象
-
注意:多态是方法的多态,属性没有多态性
-
instanceof(类型转换)引用类型,判断一个对象是什么类型
package opp.demo02;
import java.time.Year;
public class Application {
public static void main(String[] args) {
//类型之间的转化: 父 子
//子类转换为父类,可能丢失自己的本来的一些方法
//高-------------------低
Person obj = new Student();
//将obj这个对象转化为Student类型,这样我们可以使用Student类型的方法,想要用子类的方法要把他强转为子类
Student student = (Student) obj;
student.go();
//((Student) obj).go();
}
}
/*
1.父类引用指向子类的对象
2.把子类转换为父类,向上转型
3.把父类转换为子类,向下转型 强制转换
4方便方法的调用,减少重复的代码
*/
package opp.demo02;
public class Person {
public void run(){
System.out.println("run");
}
}
/*
//Object>Person>Student
//Object>Person>Teacher
//Object>String
//System.out.println(X instanceof Y); 能不能编译通过,看有没有父子关系
//能不能编译通过!看"="左边类型与instanceof后面的类型是否有继承关系.运行结果为true或false看"="右边与instanceof的类型是否有继承关系
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 Object);//true
System.out.println(object instanceof String);//false
Person person = new Student();
System.out.println(person instanceof Student);//true
System.out.println(person instanceof Person);//true
System.out.println(person instanceof Teacher);//false
System.out.println(person instanceof Object);//true
//System.out.println(person instanceof String);//编译报错
Student student = new Student();
System.out.println(student instanceof Student);//true
System.out.println(student instanceof Person);//true
// System.out.println(student instanceof Teacher);//编译报错
System.out.println(student instanceof Object);//true
// System.out.println(student instanceof String);//编译报错
*/
package opp.demo02;
//学生 is 人:子类,派生类
//子类继承了父类,就会拥有父类的全部方法
public class Student extends Person {
public void go(){
System.out.println("go");
}
}