案例介绍:
某IT公司有多名员工,按照员工负责的工作不同,进行了部门的划分(研发部员工、维护部员工)。研发部根据所需研发的内容不同,又分为JavaEE工程师、Android工程师;维护部根据所需维护的内容不同,又分为网络维护工程师、硬件维护工程师。
公司的每名员工都有他们自己的员工编号、姓名,并要做它们所负责的工作。
工作内容:
1、JavaEE工程师:员工号为xxx的 xxx员工,正在研发淘宝网站
2、 Android工程师:员工号为xxx的 xxx员工,正在研发淘宝手机客户端软件
3、网络维护工程师:员工号为xxx的 xxx员工,正在检查网络是否畅通
4、硬件维护工程师:员工号为xxx的 xxx员工,正在修复打印机
实现的功能点:
1、都是父类和子类的继承关系、四个子类都有共同的属性(name和ID)和方法(work)
2、name和ID需要进行封装private
3、父类的方法employee中的work需要抽象,因为每个员工实现的功能是不同的
4、类:一个父类employee、两个子类developer和maintainer,每个子类下面分别又有两个子类,developer的子类是Android和JavaEE,maintainer的子类是Hardware和Network。
5、对所有类的共性进行提取,共性name和ID,两个属性定义在Employee类中,其他的类通过构造方法,调用这两个属性
代码实现:
package day12;
/*
* 定义员工类
* 内容都是所有子类的共性抽取
* 属性:姓名 工号
* 方法:工作
*/
public abstract class Employee {
private String name;
private String ID;
public abstract void work();
public Employee(String name,String ID){ //构造方法this.name=name;
this.ID=ID;
}
public void getName(String name){
this.name=name;
}
public void getID(String ID){
this.ID=ID;
}
public String getName(){
return name;
}
public String getID(){
return ID;
}
}
package day12;
/*
* 定义研发员工类
*/
public abstract class Develper extends Employee {
public Develper(String name,String ID){//构造方法
super(name,ID);
}
public abstract void work();
}
package day12;
/*
* 定义维护员工类,属于员工中的一种
* 继承员工类
* 抽象类maintainer,可以给员工定义自己的属性
*/
public abstract class Maintainer extends Employee{
public Maintainer(String name,String ID){//构造方法
super(name,ID);
}
public abstract void work();
}
/*
* 研发部员工的一种,继承研发部
*/
public class JavaEE extends Develper{
public JavaEE(String name,String ID){ //构造方法
super(name,ID);
}
public void work(){
System.out.println("员工号为"+super.getID()+"的"+super.getName()+"员工"+"正在研发淘宝网站");
}
}
package day12;
/*
* 研发部员工的一种,继承研发部
*/
public class Android extends Develper{
public Android(String name,String ID){//构造方法
super(name,ID);
}
public void work(){
System.out.println("员工号为"+super.getID()+"的"+super.getName()+"员工"+"正在研发淘宝手机客户端软件");
}
}
此处省略另外两个类
package day12;
/*
* 测试类
*/
public class Test {
public static void main(String[] args) {
//创建JavaEE工程师的对象
JavaEE p1=new JavaEE("张三","001");
p1.work();
//创建Android工程师工程师的对象
Android p2=new Android("李四","002");
p2.work();
}
}
小总结:
构造方法的格式:修饰符 类名 (参数列表) {}
构造方法的特点:方法名与类名相同、没有返回值,也没有返回值类型,连void也没有
super: 指的是父类的存储空间(理解为父类的引用)
调用父类的成员变量:super.成员变量;
调用父类的构造方法:super(参数);
调用方法的成员方法:super.成员方法();
继承中的构造方法注意事项:
1,如果我们手动给出了构造方法,编译器不会在给我们提供默认的空参数构造方法
如果我们没写任何的构造方法,编译器提供给我们一个空参数构造方法
2, 在构造方法中,默认的第一条语句为 super();
它是用来访问父类中的空参数构造方法,进行父类成员的初始化操作
3,当父类中没有空参数构造方法的时候,怎么办?
a:通过 super(参数) 访问父类有参数的构造方法
b:通过 this(参数) 访问本类中其他构造方法
注意:[本类中的其他构造方法已经能够正常访问父类构造方法]
4,super(参数) 与 this(参数) 不能同时在构造方法中存在