java抽象类
概述
在 Java 里,抽象类属于特殊的类,不能被实例化,主要用于为子类提供通用的属性与方法,起到模板的作用。
类中描绘了该类所有对象共同的特性,当一个类中给出的信息足够全面时,我们就可以实例化该类;比方说,在Dog类中定义了name,age,fur_color,sex等属性,以及habit,eat等行为时,我们就可以创建一个Dog类对象,来模拟某个具体的Dog,比如你家的宠物狗等。但是,当一个类中给出的信息不够全面时,(比方说有无法确定的行为),它给出的信息不足以描绘出一个具体的对象,这时我们往往不会实例化该类,这种类就是抽象类。打个比方,对于Animal类,是,所有的动物都有吃喝的行为,定义eat方法可以描述动物“吃”这一行为,但是每种动物吃的都不一样,因此一个eat方法并不能准确描述吃什么,怎么吃。这时Animal给出的信息就不足够描述一个对象,我们就不能去实例化Animal类。
抽象类的定义
要定义抽象类,需要在类的声明前添加abstract
关键字:
abstract class Animal {// 类的成员变量protected String name;// 构造方法public Animal(String name) {this.name = name;}// 普通方法public void eat() {System.out.println(name + " is eating.");}// 抽象方法public abstract void makeSound();
}
抽象方法
抽象方法指的是只有方法声明,没有方法体的方法,同样需要用abstract
关键字来修饰。抽象方法要求子类必须对其进行实现。例如上面代码中的makeSound()
方法就是抽象方法。如果一个方法已经确定是抽象方法,那么它绝不能再有方法体
class Dog extends Animal {public Dog(String name) {super(name);}@Overridepublic void makeSound() {System.out.println(name + " says woof!");}
}class Cat extends Animal {public Cat(String name) {super(name);}@Overridepublic void makeSound() {System.out.println(name + " says meow!");}
}public class Main {public static void main(String[] args) {Dog dog = new Dog("Buddy");dog.eat();dog.makeSound();Cat cat = new Cat("Whiskers");cat.eat();cat.makeSound();}
}
Dog和Cat类继承自Animal抽象类,并且实现了makeSound()抽象方法。在Main类的main方法里,创建了Dog和Cat的实例,调用了eat()和makeSound()方法。
抽象类的特点总结
- 抽象类不能被实例化,但可以有构造方法,其构造方法用于子类实例化时初始化父类的成员变量。
- 抽象类可以包含普通方法和抽象方法,而普通类不能包含抽象方法。
- 子类继承抽象类时,必须实现抽象类中的所有抽象方法,否则子类也必须声明为抽象类。
- 抽象方法 抽象方法的目的就是为了重写,不需要{}
- abstract修饰,没有函数体的方法即为抽象方法
- 只有抽象类才能有抽象方法,非抽象类不能有抽象方法,抽象类里也可以没有抽象方法
- 抽象类可以有具体方法
- abstract和private不能同时使用,private修饰的子类看不到,子类也无法重写
- abstract和static不能同时使用,static针对类的,abstract针对对象层次
- 抽象类可以构造方法,目的是子类在初始化前先初始化父类
- 子类继承抽象类,如果不想实现抽象方法,子类也要是抽象类