抽象类abstract class
- 被
abstract
关键字修饰的 类 称为 抽象类
1. 为什么需要抽象类?
如果一部分类都具备共同的功能,就可以将该方法定义在父类中,
如果各子类对该功能的具体实现(或者不能准确描述定义)不同,
就可将该方法定义为抽象方法 该父类定义为抽象类
2. 抽象方法
- 被
abstract
关键字修饰的 非静态 非final
方法 称为抽象方法
public class Example{
//抽象方法
public abstract void method();
}
特点:
1. 抽象方法无具体实现
2. 如果一个类中有了抽象方法,说明这个类表示的事物也是描述不清的,需要定义为抽象类;
3. 抽象方法不可用 private 或 static ,final 关键字修饰
(表示不可被重写(final) 不参与继承(private) 如果是static只属于类 )
3.抽象类的特点
1. 抽象类无法实例化
2. 子类继承抽象类,必须实现父类的所有抽象方法,否则子类也必须定义为抽象类
3. 抽象类一定是父类
4. 抽象类中可定义:静态成员变量,非静态成员变量,代码块(静态|非静态),方法(静态|非精态),构造器,抽象方法
5. 抽象类不一定包含抽象方法,有抽象方法的类一定是抽象类
6. 如果一个类不包含抽象方法,但被允许继承不允许实例化,可讲该类定义为抽象类
7. 抽象类不可用final 修饰(表示不可被继承)
多态
- 同一事物的不同表现形式 称为
多态
前提: 必须有继承关系 (因为多态实际就是 父类的多种具体表现形式 )
体现: 父类型的引用指向子类实例
- 多态的优点:
1. 抽象性表述
2. 高内聚 低耦合 (`High cohesion & Low coupling`)
3. 提高扩展性 代码复用性
- 多态的缺点
只能调用父类中声明的成员变量和方法,子类中的不能直接调用(多态的类型转换)
3.多态的类型转换
- 自动提升类型
在使用多态时,父类型引用指向子类型对象,相当于将子类型对象的类型提升为父类型,叫做向上提升类型;这个过程可以自动进行;
public class Super{
}
public class Child extends Super{
public void hello(){
}
public static void main(String[] args){
Super s = new Child(); //自动转型
s.hello();
}
}
- 强制向下转型
子类型的引用指向父类型的实例,相当于转换为子类型,这个过程需要强制转换
注意: 在强转向下转型时,务必确保引用对象是强转类型的子类型,否则将抛出RuntimeException:ClassCastException
public class Test{
public static void main(String[] args){
Super s = new Super();
//强制转型
Child c = (Child) s;
}
}
instance of
运算符
强制向下转型时经常会抛出类型转换异常:ClassCastException 如要避免抛出此异常,在转型时需要提前进行类型检查来判断类型的正确性
使用: Object instance of Class
注意:
如果 object 是 class 的一个实例,则 instanceof 运算符返回 true。如果 object 不是指定类的一个实例,或者 object 是 null,则返回 false。
但是instanceof在Java的编译状态和运行状态是有区别的:
在编译状态中:
class可以是object对象的父类,自身类,子类。在这三种情况下Java编译时不会报错。
在运行转态中:
class可以是object对象的父类,自身类,不能是子类。在前两种情况下result的结果为true,最后一种为false。但是class为子类时编译不会报错。运行结果为false。
- 多态中类的成员
多态中的成员,在编译期全部看父类,运行期只有非静态 函数看子类
编译时:
使用的所有成员(静态和非静态的)都要检查父类中有没有
运行时:
只有非静态函数使用的是子类中的,其他成员全
部都是父类的
多态发生在父类型引用class和子类对象Object之间,所以静态成员不参与多态,编译和运行都看父类;
非静态成员,编译期都看父类,运行期,函数看子类;
接口interface
声明:
public interface Example(){}
关键字: interface
注意:
1. 在接口中只存在 静态成员常量 和 抽象方法
2. 接口是抽象的,不可被实例化
3. 类与接口的关系是实现 使用关键字implements 实现接口的类称为实现类
4. 实现接口,必须实现接口中的所有抽象方法
5. 在Java中,类只能单继承,但可以多实现
6. 接口与接口之间可以存在继承关系
7. 接口没有构造器(constractor)
1.接口的多态性
- 大多数情况下,以多态的形式应用接口
- 接口与抽象类的区别
共同点: 接口和抽象类的共同点:都可以有抽象函数,都不能实例化
不通点:
不同点 抽象类 接口 声明 abstract
interface
结构 包含变量方法 只包含常量和抽象方法 构造器 true
false
作用 抽象类描述的是继承体系中的共同的特征和行为,如果行为不确定,就定义为抽象函数; 接口描述的是不属于继承体系的共同的功能;接口可以用来定义规则; 继承性 单一继承和多重继承 接口和接口可以多继承和多重继承;接口和实现类可以多实现