• 抽象类不能被实例化,但是构造函数是有的
    • 抽象父类的构造方法,可以完成类似于成员变量初始化的功能,从而使这个成员变量可以被子对象使用

    父类:

    1. /**
    2. *
    3. * 抽象类 - 父类
    4. * 可以设置构造函数
    5. *
    6. */
    7. package Test13_Demo.Demo02;/*
    8. @create 2020--12--01--10:13
    9. */
    10. public abstract class Employee {
    11. //属性
    12. private String name;
    13. public String getName() {
    14. return name;
    15. }
    16. public void setName(String name) {
    17. this.name = name;
    18. }
    19. /**
    20. * 抽象类中的构造方法不能被程序直接调用,因为该类是一个抽象类,不能实例化对象
    21. * 但是在创建子类(普通类)的时候,子类构造函数会默认调用父类的无参构造函数,为了子类对象的父类存储空间赋值
    22. */
    23. //无参构造
    24. public Employee() {
    25. super();
    26. }
    27. //有参构造
    28. public Employee(String name) {
    29. super();
    30. this.name = name;
    31. }
    32. //定义成员方法 - 抽象方法
    33. public abstract void work();
    34. //抽象类中可以保存普通方法
    35. public void test() {
    36. System.out.println("我是一个普通方法");
    37. }
    38. }

    子类(抽象类):

    1. /**
    2. *
    3. * 子类(抽象类)
    4. *
    5. * 如果一个类在继承父类(抽象类)的时候,没有实现父类中的所有抽象方法,那么这个子类还是抽象类
    6. *
    7. */
    8. package Test13_Demo.Demo02;/*
    9. @create 2020--12--01--10:20
    10. */
    11. public abstract class Cook extends Employee{
    12. }

    子类(普通类):

    1. /**
    2. *
    3. * 定义一个普通类去实现父类(抽象类)中的所有的抽象方法!
    4. */
    5. package Test13_Demo.Demo02;/*
    6. @create 2020--12--01--10:22
    7. */
    8. public class Waiter extends Employee{
    9. @Override
    10. public void work() {
    11. System.out.println("接客,上菜,结账");
    12. }
    13. public Waiter() {
    14. }
    15. /**
    16. *
    17. * 子类的构造方法可以调用父类的构造方法
    18. * 这里,一个参数的子类构造,调用了父类的一个参数的构造,,为父类中的成员赋值
    19. * 但是最终还是子类对象自己使用了这个成员变量
    20. * @param name
    21. */
    22. //子类的有参构造
    23. public Waiter(String name) {
    24. super(name); //调用的父类(抽象类)中的有参构造方法
    25. }
    26. }

    测试类:

    1. /**
    2. *
    3. * 抽象类不能被实例化,但是构造函数是有的
    4. *
    5. * 抽象父类的构造方法,可以完成类似于成员变量初始化的功能,从而使这个成员变量可以被子对象使用
    6. *
    7. *
    8. */
    9. package Test13_Demo.Demo02;/*
    10. @create 2020--12--01--10:11
    11. */
    12. public class AbstractDemo {
    13. public static void main(String[] args) {
    14. //实例化的是子类,但是子类中的成员属性还是从父类中继承过来的!父类(抽象类)中的构造函数是有意义的
    15. Waiter waiter = new Waiter("Rose");
    16. waiter.work();
    17. //直接输出属性
    18. System.out.println(waiter.getName());
    19. }
    20. }