- 抽象类不能被实例化,但是构造函数是有的
- 抽象父类的构造方法,可以完成类似于成员变量初始化的功能,从而使这个成员变量可以被子对象使用
父类:
/**
*
* 抽象类 - 父类
* 可以设置构造函数
*
*/
package Test13_Demo.Demo02;/*
@create 2020--12--01--10:13
*/
public abstract class Employee {
//属性
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
/**
* 抽象类中的构造方法不能被程序直接调用,因为该类是一个抽象类,不能实例化对象
* 但是在创建子类(普通类)的时候,子类构造函数会默认调用父类的无参构造函数,为了子类对象的父类存储空间赋值
*/
//无参构造
public Employee() {
super();
}
//有参构造
public Employee(String name) {
super();
this.name = name;
}
//定义成员方法 - 抽象方法
public abstract void work();
//抽象类中可以保存普通方法
public void test() {
System.out.println("我是一个普通方法");
}
}
子类(抽象类):
/**
*
* 子类(抽象类)
*
* 如果一个类在继承父类(抽象类)的时候,没有实现父类中的所有抽象方法,那么这个子类还是抽象类
*
*/
package Test13_Demo.Demo02;/*
@create 2020--12--01--10:20
*/
public abstract class Cook extends Employee{
}
子类(普通类):
/**
*
* 定义一个普通类去实现父类(抽象类)中的所有的抽象方法!
*/
package Test13_Demo.Demo02;/*
@create 2020--12--01--10:22
*/
public class Waiter extends Employee{
@Override
public void work() {
System.out.println("接客,上菜,结账");
}
public Waiter() {
}
/**
*
* 子类的构造方法可以调用父类的构造方法
* 这里,一个参数的子类构造,调用了父类的一个参数的构造,,为父类中的成员赋值
* 但是最终还是子类对象自己使用了这个成员变量
* @param name
*/
//子类的有参构造
public Waiter(String name) {
super(name); //调用的父类(抽象类)中的有参构造方法
}
}
测试类:
/**
*
* 抽象类不能被实例化,但是构造函数是有的
*
* 抽象父类的构造方法,可以完成类似于成员变量初始化的功能,从而使这个成员变量可以被子对象使用
*
*
*/
package Test13_Demo.Demo02;/*
@create 2020--12--01--10:11
*/
public class AbstractDemo {
public static void main(String[] args) {
//实例化的是子类,但是子类中的成员属性还是从父类中继承过来的!父类(抽象类)中的构造函数是有意义的
Waiter waiter = new Waiter("Rose");
waiter.work();
//直接输出属性
System.out.println(waiter.getName());
}
}