一、基本概念和使用:
1.抽象类怎么来的?
抽取共性方法,放到父类中,发现方法没法实现,因为每个子类对此方法的实现细节不一样,此时父类中的方法体说不清道不明,可以定义成抽象方法。
抽象方法所在的类一定是抽象类
2.关键字:abstract
3.抽象方法:
修饰符 abstract 返回值类型 方法名(参数)
4.抽象类:
public abstract class 类名{}
5.注意:
a.抽象方法所在的类一定是抽象类;
b.抽象类中不一定有抽象方法;
c.子类继承父类之后,需要重写父类中的抽象方法,不然编译报错;
d.抽象类不能new对象,只能通过new子类对象调动重写方法。
6.可以将抽象类看成是一类事物的标准,要求只要是属于这一类的,都必须要拥有抽象类中的方法,必须要实现,怎么证明拥有了,怎么证明实现了? --> 重写
至于这个方法怎么实现,就看子类重写之后怎么写方法体了。
二、注意事项
1.抽象类不能直接new对象,只能创建非抽象子类的对象;
2.抽象类中不一定非得有抽象方法,但是抽象方法所在的类一定是抽象类;
3.抽象类的子类,必须重写父类中的所有抽象方法,否则,编译报错,除非该子类也是抽象类;
4.抽象类中可以有成员变量,构造、成员方法;
5.抽象类中可以有构造方法,是供子类创建对象时,初始化父类属性使用的(需要用到super)。
三、综合案例:
某工T公司有多名员工,按照员工负责的工作不同,进行了部门的划分(研发部、维护部)。研发部(Developer)根据所雷研发的内容不同,又分为JavaEE工程师、Android工程师;维护部(Maintainer)根据所维护的内容不同,又分为网络维护工程师(Network)、硬件维护工程师(Hardware)公司的每名员工都有他们自己的员工编号、姓名,并要做它们所负责的工作。
工作内容:
JavaEE工程师:员工号为xxx的xxx员工,正在研发电商网站
Android工程师:员工号为xxx的xxx员工,正在研发电商的手机客户端软件
网络维护工程师:员工号为xxx的xxx员工,正在检查网络是否畅週
硬件维护工程师:员工号为xxx的xxx员工,正在修复电脑主板
Developer类:
java
public abstract class Developer {
int id;
String name;
public Developer() {
}
public Developer(int id, String name) {
this.id = id;
this.name = name;
}
public void setId(int id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
public int getId() {
return id;
}
public String getName() {
return name;
}
public abstract String work();
}
Maintainer类:
java
public abstract class Maintainer {
int id;
String name;
public Maintainer() {
}
public Maintainer(int id, String name) {
this.id = id;
this.name = name;
}
public void setId(int id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
public int getId() {
return id;
}
public String getName() {
return name;
}
public abstract String work();
}
java
public class JavaEE extends Developer{
public JavaEE() {
}
public JavaEE(int id, String name) {
super(id, name);
}
public String work(){
return "正在研发电商网站";
}
}
java
public class Android extends Developer{
public Android() {
}
public Android(int id, String name) {
super(id, name);
}
public String work(){
return "正在研发电商的手机客户端软件";
}
}
java
public class Network extends Maintainer{
public Network() {
}
public Network(int id, String name) {
super(id, name);
}
public String work(){
return "正在检查网络是否通畅";
}
}
java
public class Hardware extends Maintainer{
public Hardware() {
}
public Hardware(int id, String name) {
super(id, name);
}
public String work(){
return "正在修复电脑主板";
}
}
java
public class Text {
public static void main(String[] args) {
JavaEE je = new JavaEE(123,"李明");
System.out.println("员工号为" + je.id+ "的" + je.name + "员工," + je.work());
Android ar = new Android(789,"张强");
System.out.println("员工号为" + ar.id + "的" + ar.name + "员工," + ar.work());
Network nw = new Network(456,"王竹");
System.out.println("员工号为" + nw.id + "的" + nw.name + "员工," + nw.work());
Hardware hw = new Hardware(753,"何琳");
System.out.println("员工号为" + hw.id + "的" + hw.name + "员工," + hw.work());
}
}
运行结果:
属性赋值即用了子类中构造方法中的super(),从而给父类属性赋值。还可以用set方法来设计。