多态
- 静态绑定与动态绑定
静态绑定(静态联编): 在编译期完成,可以提高代码执行速度。静态绑定的方法包括: - 静态方法
- 构造器
- private方法
- 用关键字super 调用的方法
动态绑定(动态联编):指在“执行期间(而非编译期间)” 判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。 这虽然让我们编程灵活,但是降低了代码的执行速度。
多态,polymorphism 即多种形态,模糊策略,以不变应万变,使用多态可以编写更加通用的代码。
多态的概念发展出来,是以封装和继承为基础的。子类以父类的身份出现,但做事情时还是以自己的方法实现。
相同的事物,调用其相同的方法,参数也相同时,但表现的行为却不同。
3.实现多态的条件
要发生多态有三个必要条件:要有继承,要有重写,父类引用指向子类对象
父类是父类
子类是子类
子类是父类
父类不是子类
子类不是其他子类
4.做题四大原则:
1、继承链,自己没有找父亲;
2、编译看类型+确定方法表,运行找对象
3、就近最优原则:自己没有找父亲
4、发生多态,基类对子类的新增方法不可见
instanceof
向下转型—强制转换,是有风险的, 可能会出现类型转换异常ClassCastException,为了降低这种风险性,我们可以使用Java中的instance运算符,在强转前进行一次判断
结论
在引用数据类型中,只有有继承关系的类型才能进行类型转换;
类型转换只是转换看待对象的引用的类型,对象本身没有也不可能参与转换;
父类引用可以自动指向子类对象,但只能访问和调用到来自于父类的属性和行为;
子类的引用不能指向父类或其它子类对象,就算强转也会导致运行失败并抛出ClassCastException;.
把父类引用赋给子类引用,语法上必须使用强制类型转换,要想运行也成功还必须保证父类
引用指向的对象一定是该子类对象(最好使用instance判断后,再强转)。
抽象类
分析事物时,发现了共性内容,就出现向上抽取。会有这样一种特殊情况,就是方法功能声明相同,但方法功能主体不同。那么这时也可以抽取,但只抽取方法声明,不抽取方法主体。那么此方法就是一个抽象方法。
用abstract关键字来修饰一个类时,这个类叫做抽象类;用abstract来修饰一个方法时,该方法叫做抽象方法。
含有抽象方法的类必须被声明为抽象类,抽象类必须被继承,抽象方法必须被重写
抽象类不能被实例化
抽象类除了包含抽象方法外,还可以包含具体的变量和具体的方法。类即使不包含抽象方法,也可以被声明为抽象类,防止被实例化。
抽象类不能被实例化,也就是不能使用new关键字来得到一个抽象类的实例,抽象方法必须在子类中被实现。
//有抽象方法的类也必须被声明为abstract
public static void main(String[] args) {
Teacher teacher=new Teacher("教师");
teacher.work();
Driver driver=new Driver("驾驶员");
driver.work();
}
}
//一个抽象类
abstract class People{
//抽象方法
public abstract void work();
}
class Teacher extends People{
private String work;
public Teacher(String work) {
this.work=work;
}
@Override
public void work() {
System.out.println("我的职业是"+this.work);
}
}
class Driver extends People{
private String work;
public Driver(String work) {
this.work=work;
}
@Override
public void work() {
System.out.println("我的职业是"+this.work);
}```