/*
定义⼀个抽象的“Person"类,有姓名,年龄,性别等成员变量,要求
1、尽可能隐藏所有变量(能够私有就私有,能够保护就不要公有),再通过GetXXX()和SetXXX()⽅法对各变量进⾏读写。
2、具有⼀个抽象的work()⽅法,该⽅法不返回任何值,输出“某某在工作”
3、同时⾄少定义两个构造⽅法,有参和无参构造方法
4、Person类中要使用this

从Person类派⽣出⼀个"Employee"类
1、该类具有Person类的所有成员(构造⽅法除外),并扩展成员变量,同时增加⼀个成员变量“职⼯编号(ID) ”。
2、同样要有⾄少两个构造⽅法,要使用his和super,还要求覆盖work()⽅法。
3、并提供⼀个final discuss()⽅法,输出“某某在讨论”

"Manager"类继承"Employee"类
2、有⼀个final成员变量"vehicle"
在main()⽅法中创建Manager和Employee对象,并测试这些对象的⽅法

每个类有getInfo()方法输出对象的姓名、年龄、性别,Employee对象多输出工号,Manager对象又多输出座驾(vehicle)信息

执行以下语句时
public class Demo {
public static void main(String[] args) {
Manager mgr=new Manager("韩寒",28, 7788);
// mgr.discuss();
// mgr.getInfo();
Employee em=new Employee("王建新",25,5247);
em.setAge(27);
em.setSex("男");
em.work();
em.discuss();
em.getInfo();
mgr.setSex("男");
mgr.discuss();
mgr.getInfo();


输出:
执行Person类有参构造方法
执行Employee类有参构造方法
执行Manager类有参构造方法
执行Person类有参构造方法
执行Employee类有参构造方法
王建新在工作
王建新在讨论
name:王建新 age:27 sex:男 id:5247
韩寒在讨论
name:韩寒 age:28 sex:男 id:7788
座驾:奔驰车


*/
abstract class Person {
String name;
int age;
String sex;

abstract void work();// 重写时实现为"xxx"在工作

//abstract void getInfo();//获取信息
void getInfo()
{
System.out.print("name: "+name+" age: "+age+" sex: "+sex+" ");
}

Person() {
System.out.println("执行Person类无参构造方法");
}

Person(String str, int age_) {
System.out.println("执行Person类有参构造方法");
this.name = str;
this.age = age_;

}

public String getName() {
return name;
};

public void setName(String name) {
this.name = name;// 使用this可以区分形参和成员变量同名的情况下谁是谁;
}

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}

public String getSex() {
return sex;
}

public void setSex(String sex) {
this.sex = sex;
}
}

class Employee extends Person {
/* 先继承Person的成员 */
private int ID;

Employee() {
System.out.println("执行Employee类的无参构造函数");
}

Employee(String str, int age_, int ID_) {
super(str, age_);// 类似C++中构造函数后面跟着的初始化参数列表,将用于初始化的参数传给基类的构造函数
System.out.println("执行Employee类的有参构造函数");
this.ID = ID_;
}

// 覆盖/重写抽象类中的work();
void work() {
System.out.println(name + "在工作");// name是类的成员变量,无须再传参(String name)
}

// 添加了子类所独有的方法discuss()
final void discuss() {
System.out.println(name + "在讨论");
}
void getInfo(){
super.getInfo();
System.out.println("id: "+ID);
}
}

class Manager extends Employee {
final String vehicle;
//constructor of Mangager class
Manager(String name,int age,int ID)
{
super(name,age,ID);
vehicle="奔驰车";
}
void getInfo(){
super.getInfo();//super表示父类的引用
System.out.println(" 座驾: "+vehicle);
}
}

public class Demo {

public static void main(String[] args) {
Manager mgr = new Manager("韩寒", 28, 7788);
// mgr.discuss();
// mgr.getInfo();
Employee em = new Employee("王建新", 25, 5247);
em.setAge(27);
em.setSex("男");
em.work();
em.discuss();
em.getInfo();

mgr.setSex("男");
mgr.discuss();
mgr.getInfo();

}
}