java abstract修饰符用法

认识abstract

abstract一般用来修饰类和方法,不能修饰变量
1.abstract修饰类

abstract修饰类,会使得类变成抽象类,抽象类不能生成实例,但是可以作为对象变量声明的类型,也就是编译时类型。抽象类相当于类的半成品,需要子类继承并覆盖其中的方法。
注意:
抽象类虽然不能实例化,但是有自己的构造方法。
抽象类和接口(interface)有很大的不同之处,接口中不能有实例方法去实现业务逻辑,而抽象类可以有实例方法,并实现业务逻辑。
抽象类不能被final修饰,因为被final修饰的类无法被继承,而对于抽象类来说就是需要通过继承去实现抽象方法。

2.abstract修饰方法

abstract修饰方法会使得这个方法变成抽象方法,也就是只有声明,而没有实现,需要子类重写。
注意:
有抽象方法的类一定是抽象类,但是抽象类不一定有抽象方法。
父类是抽象类,其中有抽象方法,那么子类继承父类,并把父类中的所有抽象方法都实现了,子类才有创建对象实例的能力,否则子类也必须是抽象类。抽象类中可以有构造方法,子类在构造子类对象时需要调用父类(抽象类)的构造方法。
抽象方法不能用private修饰,因为抽象方法必须被子类重写,而private权限对于子类来说是不能访问的,所以就会产生矛盾。
抽象方法也不能用static修饰,如果用static修饰了,那么我们就可以直接通过类名调用了,而抽象方法压根没有主体,没有任何业务逻辑,这样就毫无意义了。

抽象类(abstract)和接口类(interface)的共同点:不能实例化
抽象类(abstract)和接口类(interface)的不同点:

  1. 抽象类可以声明变量,接口类不能
  2. 抽象类可以有实例方法,接口类没有
  3. 抽象类有构造方法,接口类没有
  4. 抽象类的子类可以直接调用父类(抽象类)的实例方法

创建abstract修饰的person抽象类

public abstract class person {

    private String name;
    private Integer age;

    //无参构造方法
    public person() {
        System.out.println("我是person抽象类,我被调用了");
    }
    
    //有参构造方法
    public person(String name, Integer age) {
        this.name = name;
        this.age = age;
    }
    
    //实例方法
    public void sleep(){
        System.out.println("睡觉");
    }
    
    //抽象方法
    public abstract void eat();
    
}

创建boss子类继承person抽象类

public class boss extends person{

    public void eat(){    //重写父类抽象方法
        System.out.println("我在吃饭");
    }

    public void sleep(){   //覆盖父类的方法
        System.out.println("boss在睡觉");
    }

    public static void main(String[] args) {
        //person boss = new boss();  //可以通过父类来接收实例化对象
        boss boss = new boss();  //在new 一个子类对象时会优先调用父类(这里指的是抽象类person)的构造器初始化,然后再调用子类的构造器。
        boss.sleep();
        boss.eat();
    }

}

运行结果:
java abstract修饰符用法_第1张图片
纯属个人经验,喜欢的可以点赞关注,后续见!!!

你可能感兴趣的:(java,java,开发语言)