abstract

有些类并不能真正的去描述一个对象,只是将子类相似的特点抽象出来,形成了一个类的模板,这种类称为抽象类。用abstract修饰。

1.什么是abstract?

abstract的意思是抽象的,用于修饰方法、类。

2.abstract的用法

(1)abstract修饰类

被abstract修饰的类称为抽象类。

抽象类只是一个更特殊的类,抽象类也拥有普通类的基本特性,在抽象类中可以使用4个权限修饰符,任意定义属性和方法,抽象类也有构造方法;

package com.dh.abstractdemo;

//使用abstract修饰类
public abstract class AbstractDemo {

    //可以使用4个权限修饰符
    public String name;
    int age;

    public AbstractDemo(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public void show(){
        System.out.println("抽象类的普通方法");
    }
}

下面就是抽象类的特殊性了:

抽象类只能被继承,不能实例化对象;

书写一个类继承上述抽象类:

package com.dh.abstractdemo;

public class Test extends AbstractDemo {

    public Test(String name, int age) {
        super(name, age);
    }
}

可以看到是没有问题的。

我们再看看能不能实例化对象:

可以看到抽象类是不能实例化对象的,抽象类的作用就是充当一个类的模板,给其它的类继承。

但是,继承抽象类的子类是可以实例化对象的。

(2)abstract修饰方法

被abstract修饰的方法叫抽象方法,子类如果继承的是抽象类,必须重写其抽象方法,除非子类也是抽象方法。

注意:抽象方法是没有方法体的!用于给子类重写。

package com.dh.abstractdemo;

//使用abstract修饰类
public abstract class AbstractDemo {

    public String name;
    public int age;

    public AbstractDemo(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public void show(){
        System.out.println("抽象类的普通方法");
    }

    //抽象方法没有方法体,用于给子类重写
    public abstract void abstractMethod();
}

如果子类不重写父类的抽象方法就会报错:

可以直接点击蓝色的Implement methods在子类中生成重写的方法:此时不再报错

如果子类也是抽象类,就不是必须要实现父类的抽象方法了:

我们在(1)中看到,abstract类中是可以不书写abstract方法的,那书写了abstract方法,但是不定义成abstract类可以吗?

答案是no,书写了抽象方法就一定要将该抽象方法所在的类定义成抽象类。

3.总结

  • abstract修饰的类称为抽象类

    • 可以使用4种权限符定义属性和方法;

    • 拥有构造方法;

    • 可以被继承,不能实例化对象;

    • 继承抽象类的子类,可以实例化对象;

  • abstract修饰的方法称为抽象方法

    • 没有方法体,给子类重写;

    • 抽象类中可以没有抽象方法;

    • 定义了抽象方法的类一定要定义为抽象类;

    • 继承了抽象类的子类,一定要实现其抽象方法;

      • 除非该类也为抽象类

本人水平有限,若有错误和不足,望指正~

posted @ 2021-01-21 23:14  deng-hui  阅读(2523)  评论(0编辑  收藏  举报