- 多态:同一方法可以根据发送对象的不同而采用多种不同的行为方式。
- 一个对象的实际类型是确定的,但可以指向对象的引用的类型有很多。(父类,等等)
- 例子:
//父类Person
public class Person {
public void run(){
System.out.println("run");
}
public void A(){
System.out.println("Person");
}
}
//子类Student
public class Student extends Person {
//重写
@Override
public void run() {
System.out.println("son run");
}
public void eat(){
System.out.println("son eat");
}
}
//运行实现类
public class Start {
public static void main(String[] args) {
Student s1 = new Student();
//Person父类,可以指向子类,但是不能调用子类独有的方法,如果想调用强制转换为Student类型
Person s2 = new Student();
Object s3 = new Student();
//对象能执行哪些方法,主要看对象左边的类型,和右边关系不大
s2.run();//子类重写了父类的方法,执行子类的方法
s1.run();
s1.A();
//强制转换为Student类型
((Student) s2).eat();
s1.eat();
}
}
- 一个对象的实际类型是确定的,但可以指向对象的引用的类型有很多:指的就是Student,Person,Object s1的类型;
- Student类可以调用父类,祖父类和以上的类里的方法;
- Student没有重写父类方法时,Student s1可以调用父类方法,如s1.A(),Person s2调用父类方法执行父类方法,如s2.run()//此时结果:run;Student里重写了父类方法时Person s2、Student s1就调用重写后的方法,如:s2.run()//此时结果:son run、s1.run()//结果:son run;
- Person父类,可以指向子类,但是不能调用子类独有的方法,如果想调用强制转换为Student类型,如eat()方法。
-
注意事项:
- 多态是方法的多态,属性没有多态性。
- 父类和子类要有联系!! 没有联系会报错:类型转换异常!!(ClassCastException!)
- 存在条件:有继承关系,大部分方法需要重写,父类引用指向子类对象!Father f1 = new Son();
- 不能重写的方法:
- static:静态方法,属于类,不属于实例,
- final:常量;
- private:私有的方法。
-
类的强制类型转换:
和数据的强制类型转换类似
Person per = new Teacher(); /* Teacher i = (Teacher) per; i.eat(); */ ((Teacher) per).eat();
Person是Teacher的父类
把子类转换成父类,向上转型,是自动转换;
把父类转换为子类,向下转型,是强制转换;
在转换的时候可能会丢失一些方法!!!
方便方法的调用,减少重复的代码。
-
instanceof:
-
作用:判断一个对象是什么类型,是否存在父子关系,某个变量是否属于某个类型!
-
语法:变量 instanceof B
//例子: //Object->Person->Teacher 父子关系树分支 Object object = new Teacher(); System.out.println(object instanceof Student);//false System.out.println(object instanceof Person);//true System.out.println(object instanceof Object);//true System.out.println(object instanceof Teacher);//true System.out.println(object instanceof String);//false //Object->Person->Student 父子关系树分支 Person person = new Student(); System.out.println(person instanceof Student);//true System.out.println(person instanceof Person);//true System.out.println(person instanceof Object);//true System.out.println(person instanceof Teacher);//false //System.out.println(person instanceof String);//编译报错!!! //Object->Person->Student 父子关系树分支 Student student = new Student(); System.out.println(student instanceof Student);//true System.out.println(student instanceof Person);//true System.out.println(student instanceof Object);//true //System.out.println(student instanceof Teacher);//编译报错!!! //System.out.println(student instanceof String);//编译报错!!!
-
根据 new的类 判断属于哪个父子关系树分支,在分支内的结果为true;没在分支内但有父子关系的结果为false;既没在分支内又没有父子关系的编译时会报错!!!
-