一.抽象类和接口的区别
&相同点:
①都位于继承的顶端,用于被其他类实现或继承;
②都不能直接实例化对象;都包含抽象方法,其子类都必须覆写这些抽象方法;
&区别:
①抽象类为部分方法提供实现,避免子类重复实现这些方法,提高代码重用性;
②接口只能包含抽象方法;一个类只能继承一个直接父类(可能是抽象类),却可以实现多个接口;
③(接口弥补了Java的单继承)抽象类是这个事物中应该具备的内容, 继承体系是一种 is…a关系 ;
接口是这个事物中的额外内容,继承体系是一种 like…a关系
&二者的选用:
①优先选用接口,尽量少用抽象类;
②需要定义子类的行为,又要为子类提供共性功能时才选用抽象
③类要实现的方法不是当前类族的必要,而是扩展,用接口.
二.Instanceof关键字
在java中可以使用Instanceof关键字判断一个对象是否为一个类(接口,抽象类,父类)的实例。
语法格式如下: boolean result = obj instanceof Class/interface;
其中,obj 是一个对象,Class 表示一个类或接口。当obj 是 class 类(或接口)的实例或者子类实例
时,结果 result 返回 true,否则返回 false。
Object是java中所有类型的根类型
三.Java对象类型转换
概念:是指存在继承关系的对象,不是任意类型的对象
分别是向上转型(upcasting)和向下转型(downcasting)。
向上转型:父类引用指向子类对象为向上转型。
①语法格式如下: fatherClass obj = new sonClass();
fatherClass 是父类名称或接口名称,obj 是创建的对象,sonClass 是子类名称。
②向上转型就是把子类对象直接赋给父类引用,不用强制转换。
③使用向上转型可以调用父类类型中的所有成员,不能调用子类类型中特有成员,最终运行效果
看子类的具体实现。
向下转型:与向上转型相反,子类对象指向父类引用为向下转型。
①语法格式如下:sonClass obj = (sonClass) fatherClass;
fatherClass 是父类名称,obj 是创建的对象,sonClass 是子类名称。
②向下转型可以调用子类类型中所有的成员,
③不过需要注意的是如果父类引用对象指向的是子类对象,那么在向下转型的过程中是安全的,
也就是编译是不会出错误。
④但是如果父类引用对象是父类本身,那么在向下转型的过程中是不安全的,编译不会出错,但
是运行时会出现我们开始提到的 Java 强制类型转换异常,一般使用 instanceof 运算符来避免
出此类错误。
异常错误,不能转型
Exception in thread "main"java.lang.ClassCastException: com.pqw.instanceofdemo.Father cannot be cast to com.pqw.instanceofdemo.Childat com.pqw.instanceofdemo.Demo.main(Demo.java:24)
以下图片为正确的写法: