抽象类
包含抽象方法的类叫做抽象类。抽象类不允许直接创建实例,只能有子类提供方法实现后才能通过子类创建对象
抽象方法就是值没有方法体的方法,方法只做一个声明,没有具体的实现。抽象方法必须在子类中提供具体的实现。
抽象类中可以包含抽象方法,不是必须包含抽象方法
public abstract class Vehicle{
//方法是由具体的实现的,不过是空实现,不会没有方法体
public void pp(){
}
//抽象方法
public abstract void func();
}
抽象类不能直接进行new操作,只能定义具体实现的子类然后进行new操作
public abstract class Vehicle{
}
//具体类必须实现继承抽象类中的所有抽象方法,否则这个类还是抽象类
public class Car extends Vehicle{
}
public class Test{
Vehicle v = new Car();
}
抽象类和普通类一样可以定义成员方法和成员属性,以及构造器和析构器。知识抽象类允许包含抽象方法,普通类继承抽象类,必须将抽象类中的所有抽象具体实现
public abstract class Animal{
private String name;
protected int age;
//构造器
public Animal(){
}
public Animal(int age){
}
//成员方法
public void sleep(){
System.out.println("正在睡觉");
}
public abstract void walk();//子类若不是抽象类必须对该方法进行实现
}
abstract class Pig extends Animal{
//针对walk方法没有提供实现这个份方法也是抽象类
}
class SmallPig extends Pig{
public void walk(){
}//允许对方法进行空实现
}
抽象类的特点
- 方法只声明而没有具体的实现则方法就是抽象方法
- 抽象方法只能使用范围限定词中的public\protected\package默认,不能使用private
- 不允许定义抽象构造器
public abstract Animal();
//1.抽象类中可以定义构造器也可以不定义构造器,由系统自动提供默认的无参构造器,但是如果自己定义构造器,不允许对构造器使用private范围限定词
abstract class Parent{
private Parent(){
}
}
class Son extends Parent{
//语法报错:因为父类的构造器是private,所以Son在构建对象是不能通过super()调用父类构造器}
//2.如果需要定义私有构造器,则必须提供带参的非私有的构造器
abstract class Parent{
private Parent(){
}
public Parent(int age){
//this();调用自身无参构造器
}
}
- 抽象类或者抽象方法不允许被final修饰
final修饰的类不允许继承,则不能定义子类
方法不允许子类中覆盖定义,所以不能定义final抽象方法 - 抽象类中可以定义静态方法
public lass Test{
public static void main(String[] args){
Parent.func();//不能创建Parent对象来调用方法
Parent p = new Son();
s.func();
}
}
abstract class Parent{
public static void func(){
System.out.println("Parent func()方法")
}
}
//不允许定义抽象静态方法
abstract class Parent{
public static abstract void func();
}
//可以使用抽象类直接调用静态方法
- 抽象类不能直接创建对象,只能通过继承的方式定义子类,然后创建子类对象。子类对象可以赋值个抽象类声明的变量
Animal animal = new Dog();
- 抽象类中除了可以抽象方法,也可以有非抽象方法。