抽象类和接口的区别
相同点
- 都位于继承的顶端,用于被其他类实现或继承;
- 都不能直接实例化对象;
- 都包含抽样方法,其子类必须覆写这些抽样方法;
- 抽象类为部分方法提供实现,避免子类重复实现这些方法,提高代码重用性;接口只能包含抽样方法;
- 一个类只能继承一个直接父类,接口可以多继承;
- 抽象类是某个事物中应该具备的内容,而接口是这个事物额外的内容;
**注意 : **
- 优先选用接口,少用抽象类;
- 需要定义子类的行为,又要为子类提供共性功能才选用抽象类;
多态
java的多态特性体现于,一个子类的对象(实现类对象)既可以给这个子类(实现类对象)引用变量赋值,也可以给其父类(接口)变量赋值。
最终多态体现为:
- 父类的引用变量可以指向子类对象;
父类名 对象名 = new 子类名();
- 多态的前提是必须拥有子父类关系或者类实现接口关系,否则无法完成多态;
- 在使用多态后的父类引用变量调用方法时,会调用子类覆写的方法;
多态定义格式
普通类式
父类的引用变量指向子类对象:
父类类型 变量名 = new 子类类型();
变量名.方法名();
* 普通类多态定义格式:
父类 变量名 = new 子类();
抽象类定义格式
抽象类 变量名 = new 抽象类子类();
接口多态定义格式
接口 类名 = new 接口实现类();
注意事项:
- 成员变量参考的是父类中的变量,存在编译成功,否则编译失败;
- 成员方法编译时参考父类中的方法,存在编译成功,否则编译失败;
- 成员方法运行时参考子类中的方法,子类中不存在时,参考父类方法;
instanceof关键字
通过instanceof关键字来判断某个对象是否属于某种数据类型
多态-转型
- 向上转型:当子类对象赋值给父类引用时,为向上转型,多态的本质就是向上转型的过程。
//格式
父类型行 变量名 = new 子类类型();
特点:
* 调用子类和父类共有功能,不可调用子类特有功能;
- 向下转型:一个已经向上转型的子类对象可以使用强制类型转换转换的格式,将父类引用转为子类引用,如果直接创建父类对象,无法向下转型
//格式
子类型行 变量名 = (子类类型) 父类类型的变量;
特点:
* 可调用子类特有功能,不可调用子类和父类共有功能;
注意:
* 当不需要面对子类类型时,通过提高扩展性,或者使用父类的功能就能完成相应的操作,这时就可以使用向上转型;
* 当要使用子类特有功能时,就需要使用向下转型;
* 需要面对具体的子类对象;在向下转型时容易发生ClassCastException类型转换异常。在转换之前必须做类型判断。
Animal cat = new Cat();
Animal dog = new Dog();
if (dog instanceof Cat){
Cat c = (Cat) dog;
c.run;
}else{
System.out.println("dog is not a instance of Cat");
}
>>> dog is not a instance of Cat
封装、继承、多态的作用:
- 封装:把对象的属性与方法的实现细节隐藏,仅对外提供一些公共的访问方式
- 继承:子类会自动拥有父类所有可继承的属性和方法。
- 多态:配合继承与方法重写提高了代码的复用性与扩展性;如果没有方法重写,则多态同样没有意义。