一、抽象类的基本概念
1.抽象类定义
普通类是一个完善的功能类,可以直接产生实例化对象,并且在普通类中可以包含有构造方法、普通方法、static方法、常量和变量等内容。如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。
抽象类除了不能实例化对象之外,类的其他功能依然存在,成员变量、成员方法和构造方法的访问方式和普通类一样。
2.抽象类的声明
abstract class 类名{//抽象类
}
3.抽象方法
abstract class 类名{//抽象类
public abstract void 方法名();//抽象方法,只声明而未实现
}
4.抽象类的规范
在抽象类的使用中有以下原则:
- 抽象类本身是不能直接进行实例化操作的,即:不能直接使用关键字new完成;
- 抽象类必须有子类,使用extends继承,一个子类只能继承一个抽象类;
- 一个抽象类必须被子类所继承,被继承的子类(如果不是抽象类)则必须覆写(重写)抽象类中的全部抽象方法(如果子类没有实现父类的抽象方法,则必须将子类也定义为abstract类);
- 抽象类可以有构造方法,子类对象实例化的时候的流程与普通类的继承是一样的,都是要先调用父类中的构造方法(默认是无参的),之后再调用子类自己的构造方法。
二、抽象类的使用
范例:
abstract class A{
public void fun(){
System.out.println("存在方法");
}
public abstract void print();
}
public class HelloWorld{
public static void main(String[] args) {
A a=new A();
}
}
运行:
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
Cannot instantiate the type A
at HelloWorld.main(HelloWorld.java:11)
由此可知,A是抽象的,无法直接进行实例化操作。
改写之后范例:
abstract class A{
public void fun(){
System.out.println("存在方法");
}
public abstract void print();//抽象方法,没有方法体,有abstract关键字做修饰
}
//单继承
class B extends A{
@Override
public void print() {
System.out.println("Hello world !");
}
}
public class HelloWorld{
public static void main(String[] args) {
A a=new B();
a.print();
}
}
运行结果:
Hello world !
由此我们可以发现:
(1)抽象类继承子类里面有明确的方法覆写要求,而普通类可以有选择性的来决定是否需要覆写;
(2)抽象类实际上就比普通类多了一些抽象方法,其他组成部分和·普通类完全一样;
(3)普通类对象可以直接实例化,但抽象类的对象必须经过向上转型之后才可以得到。