public abstract class Base {
    //抽象类中可以没有抽象方法,但包含了抽象方法的类就必须被定义为抽象类
    public abstract void method1();
    public abstract void method2();
    public void method3(){}
    //没有抽象的构造方法
    //public abstract Base(){}
    //没有抽象的静态方法
    //static abstract void method4();
    
    public Base(){
        System.out.println("父类的无参构造方法");
    }
    
    static void method4(){
        System.out.print("静态方法表示类所特有的功能,这种功能的实现不依赖于类的具体实例,也不依赖于它的子类。因此,当前类必须为静态方法提供实现");
    }
    
}
//如果子类没有实现父类的所有抽象方法,子类必须被定义为抽象类

public abstract class Sub1 extends Base {

    public void method1() {
        System.out.println("重写父类的method1");
    }
    
}
//否则就必须实现父类的所有抽象方法
public class Sub2 extends Base {
    public Sub2(){
        System.out.println("子类的无参构造方法");
    }

    @Override
    public void method1() {
        System.out.println("重写父类的抽象方法method1");
    }

    @Override
    public void method2() {
        System.out.println("重写父类的抽象方法method2");
    }

}
public class Test {
    public static void main(String[] args) {
        //抽象类不允许实例化
        //Base base=new Base();
        //抽象类中可以有非抽象的构造方法,创建子类的实例时可能调用
        //抽象类不能被实例化,但可以创建一个引用变量,其类型是一个抽象类,指向非抽象的子类实例
        Base sub=new Sub2();
        sub.method1();
        sub.method4();
    }
}