抽象相关学习

一、基本概念和使用:

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

相关推荐
张某布响丸辣4 小时前
附件下载的安全边界:路径白名单、NAS 哨兵文件与 Redis Lua 一次性令牌
java·redis·redis lua·nas哨兵
传奇开心果编程4 小时前
【Jetpack Compose基础语法学与练】第8课 rememberSaveable,页面旋转/系统重建保留状态
android·学习·ui·kotlin·android jetpack
迪丽热爱4 小时前
多媒体应用16-830(补)
学习
YatHinLay5 小时前
Spring Boot + Calcite 实现跨库查询
java
酷炫码神5 小时前
MosMos 创意效果与能力边界展示
java
Wang's Blog5 小时前
Java 接入Redis: 使用Jedis操作Redis
java·服务器·redis
事圆则缓5 小时前
Java 8 Lambda、Stream、Optional 与 Android 边界:从回调语法到运行时兼容
android·java
shehuiyuelaiyuehao5 小时前
算法50,分治归并,数组中的逆序对
java·算法
烽学长5 小时前
(附源码)基于Springboot+vue的图书阅读分享系统的设计与实现
java·spring boot·后端
Ivanqhz5 小时前
数据搬运是性能关键
java·服务器·网络·人工智能·深度学习