抽象相关学习

一、基本概念和使用:

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

相关推荐
敬往事一杯酒哈6 小时前
海康 AGV 导航读码器学习
学习
代码什么用7 小时前
Spring基础使用
java·后端·spring
Su米苏7 小时前
Spring AI 中MCP 与普通 @Tool的区别
java·人工智能·spring
码云数智-园园7 小时前
unique_ptr 还是 shared_ptr?C++ 智能指针选型与内存泄漏实战分析
java·开发语言
老板一杯拿铁8 小时前
Java 异常体系详解:从字节码原理到最佳实践
java
蜗牛互联网8 小时前
Java 17 HttpClient调用文件转写API的超时与失败回退
java·人工智能·后端
qq_284274058 小时前
机械原理笔记:平面机构自由度计算(复合铰链、局部自由度、虚约束)与四杆机构入门(含考点)
笔记·学习·平面·自动化·制造
禾小西8 小时前
07丨Redis 哨兵机制:主库故障后,如何恢复服务?
java·开发语言·redis
我不是阵雨8 小时前
JDK 21虚拟线程Pinning陷阱:一文拔钉解困
java·开发语言
小卡车5559 小时前
java反射、自定义注解的应用(自定义分页)
java