多态
-
即同一个方法可以根据发送对象的不同而采用多种不同的行为方式。
-
一个对象的实际类型是确定的,但可以指向对象的引用的类型有很多(父类、有关系的类:object)。
-
多态存在的条件
- 有继承关系(父类、有关系的类:object)
- 子类重写父类的方法
- 父类的引用指向子类对象
-
注意事项:
-
多态是方法的多态,属性是没有动态的(静态的属性,动态的方法)。
-
父类和子类有联系的 类型转换异常:ClassCastExCeption!
-
存在条件:继承关系、方法需要重写、父类引用指向子类对象! Father fa = new Son();
- 方法重写注意事项:
- static 方法:属于类,它不属于实例;
- final :常量;
- private 方法;
- 方法重写注意事项:
-
public class Person {
public void run(){
System.out.println("father");
}
}
public class Student extends Person{
@Override
public void run() {
System.out.println("son");
}
public void eat(){
System.out.println("ear");
}
}
public class Application {
public static void main(String[] args) {
//一个对象的实际类型是确定的
//new Student();
//new Person();
//可以指向的类型就不确定了:父类的引用指向子类的对象
//Student 子类能调用的方法都是自己的或者是继承父类的
Student s1 = new Student();//子类引用指向子类对象
//person 父类,可以指向子类,但是不能调用独有的方法
Person s2 = new Student();//父类引用指向子类对象
Object s3 = new Student();//父类的父类引用指向子类对象
//子类重写父类方法时,执行子类的方法
// s1.run(); son
// s2.run(); son
//对象能执行那些方法,主要看对象左边的类型,和右边关系不大!
s1.eat();
//s2.eat();父类可以通过转换使用子类的独有的方法
((Student)s2).eat();
}
}
- 关键字:instanceof
//instaceof 判断父类和子类是否有关系
Object obj = new Student();
//System.out.println(x instanceof y); x和y没有关系编译会报错 判断它们的结果就是要看(x变量实际指向的类型和y的子类型)
/*
Object > Person > Student
Object > Person > Teacher
Object > String
*/
System.out.println(obj instanceof Student);//true 它是Student的父类的父类 有继承关系
System.out.println(obj instanceof Person);//true 它是Person的父类 也是有继承关系
System.out.println(obj instanceof Object);//true
System.out.println(obj instanceof Teacher);//false 从关系图上就可以看出Teacher和我们没有关系
System.out.println(obj instanceof String);//false 同上
System.out.println("=========================");
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); 它们的关系连编译都会报错
System.out.println("=========================");
Student stu = new Student();
System.out.println(stu instanceof Student);//true
System.out.println(stu instanceof Person);//true
System.out.println(stu instanceof Object);//true
//System.out.println(stu instanceof Teacher); 编译报错
//System.out.println(stu instanceof String); 编译报错
-
类型转换
- 把子类转为父类:向上转型,缺失方法
- 把父类转向子类:向下转型(强制转换),缺失精度
public class Application { public static void main(String[] args) { //类之间的转换: 父 子 //高 低 Person s1 = new Student(); //将s1这个对象转换为Student类型,就可以使用Student类型的方法 Student s2 = (Student)s1; //或者这样表示也是一样的 ((Student)s1).say() s2.say(); //子类转换为父类时,会丢失原来本身的方法 Student student = new Student(); student.say(); Person person = student; //person.say(); } }