抽象相关学习

一、基本概念和使用:

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方法来设计。

相关推荐
凸头9 小时前
一个小问题:Swagger 不显示 VO,Swagger 泛型丢失
java
Pluchon10 小时前
硅基计划4.0 算法 动态规划高阶
java·数据结构·算法·leetcode·深度优先·动态规划
编程彩机10 小时前
互联网大厂Java面试:从Spring Boot到分布式缓存的技术场景解析
java·redis·分布式·缓存·大厂面试·技术解析·sprint boot
白开水+10 小时前
AI学习-第二天
python·学习
007php00710 小时前
mac笔记本中在PHP中调用Java JAR包的指南
java·ide·python·面试·职场和发展·pycharm·php
sheji341610 小时前
【开题答辩全过程】以 母婴店购物系统为例,包含答辩的问题和答案
java
哪里不会点哪里.10 小时前
Spring 中常用注解详解
java·后端·spring
草莓熊Lotso10 小时前
Qt 控件美化与交互进阶:透明度、光标、字体与 QSS 实战
android·java·开发语言·c++·人工智能·git·qt
Hyacinth&10 小时前
IntelliJ IDEA|学习笔记
笔记·学习·intellij-idea