一、抽象类:我们编写一个类,主要是用来描绘对象,方法也都有具体的方法体,但也并不是所有类都是用来描绘对象的,抽象类描述的就是一个类中没有足够的信息来描绘一个具体的对象,是用abstract关键词修饰的类。
二、抽象类的特点:
- 抽象类必须是abstract修饰的类;
- 抽象类和一般的类是没有什么区别的,都是描述事物,只不过抽象类在描述事物时, 有些功能不具体。所以抽象类里面可以包括一般类里面的所有的功能,可以有成员变量、方法 (普通方法和抽象方法都可以)、构造器、初始化块、内部类(接口、枚举);
public abstract class Abstract {
//成员变量
private int age=10;
//类变量
static int weight;
//初始化块
{
System.out.println("初始化块");
}
//静态初始化块
static{
System.out.println("静态初始化块");
}
//构造器
public Abstract(){
}
//构造器的重载
public Abstract(int big){
}
//定义一个普通方法
public void sleep(){
System.out.println("休息");
}
}
- 抽象类不可以被实例化,无法使用new关键字来调用抽象类的构造器创建抽象类的实例,但是可以声明变量;由于抽象类的构造器不能用于创建实例,因此它主要是用于被其子类调用,被子类继承后,再对抽象类中所有的抽象方法进行实现(重写);
//子类继承抽象类,必须实现抽象类的所有抽象方法
public class Rabbit extends Abstract{
@Override //标识符:代表重写父类的方法,或者实现一个抽象方法
public void swimming() {
System.out.println("我不会游泳");
}
@Override
public String say(String str) {
return str;
}
}
- 抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类。
- abstract static不能同时修饰一个方法(不能同时存在),也不能和final,private共存,因为一个方法用abstract修饰后,它已经是抽象方法了,并不会存在什么抽象静态方法,其余两个也是如此;
- 抽象类可以继承一个类或实现多个接口
//实现一个类
class fish{ }
public abstract class Animal extends fish{
}
//实现多个接口
interface interfaceOne{ //接口1 }
interface interfaceTwo{ //接口 }
public abstract class Animal1 implements interfaceOne,interfaceTwo{
}
三、抽象类的体现:抽象类可以只定义需要使用的某些方法,其余留给子类去实现,抽象类作为多个子类的通用模板,它提供的只是一个通用的方法,具体要怎么实现,要看它的子类,子类在抽象类的基础上进行拓展,对抽象类的方法进行实现,但子类不能改变抽象类的方法。
四、抽象方法的定义:用abstract关键词修饰,没有方法体。
格式:[修饰符] abstract 返回类型 方法名();
修饰符 (public protected )二选一
//抽象方法只包含一个方法名,而没有方法体,使用abstract修饰
public abstract void swimming();
public abstract String say(String str);
抽象方法目的是为了不让该类创建对象。
五、说明:我们在分析一个事物时,可以调用一些共性内容,调用的是方法体;而特殊情况中,我们只需调用它的方法,不需要它的方法体,这个时候我们就可以声明一个抽象的方法,因为我们并不知道这个方法该如何去实现。用一句话概括就是:抽象abstract修饰的方法是不具体的。相当于某个父类只是知道子类包括哪些抽象方法,但是不知道如何实现这些方法,不知道具体是怎么实现的。
六、常见的几个抽象类:
字节流:InputStream(输入流),OutputStream(输出流)
字符流:Reader(输入流),Writer(输出流)
它们都是抽象的,不能直接被实例化,之后在总结IO知识时会详细了解到。