Java语言的三大特性

125 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第1天,点击查看活动详情

java语言的三大特性:封装、继承、多态

封装

封装我简单的理解成隐藏信息,即将类的属性隐藏起来,变为类私有的,将类的属性私有化,再提供公有的public的方法访问和操作类的属性,此过程我理解为封装,如以下代码:

public class User {
    private String account;
    public String getAccount() {
        return account;
    }
    public void setAccount(String account) {
        this.account = account;
    }
}

在此创建一个User类,定义一个account用户的账户属性,此时将account属性添加private变为私有,添加private后外部就访问不了User的account属性,要想访问和操作account就得在类的内部添加公有方法,如上通过公有方法getAccount和setAccount来获取对象的account值和改变account值,此外也可以在公有方法中实现更复杂一点的逻辑,此处只做封装的简单演示。

封装的好处:

  • 隐藏实现的细节,可以将不想让外部看到的信息隐藏起来,外部只能看到公共的方法,而看不到具体的属性实现细节等等
  • 实现一对一,功能方向明确,一个功能只为这个功能服务,避免了代码逻辑都在一块,一团糟
  • 可减少耦合

继承

一个类继承另一个类,继承的为子类,被继承的为父类,继承可以实现代码的复用,如以下代码:

public class BusinessException extends PenkException {
    public BusinessException(RetCodeEnum retCodeEnum, String message, Errors data) {
        super(retCodeEnum, message, data);
    }
}

public abstract class PenkException extends RuntimeException {
    private final Integer code;
    private final String message;
    private final transient Object errors;
    
    protected PenkException(RetCodeEnum retCodeEnum, String message, Object errors) {
        this.code = retCodeEnum.getCode();
        this.message = message;
        this.errors = errors;
    }
}

此处的BusinessException继承PenkException类,子类BusinessException集成了父类中的属性code、message、errors,然而构造器不能被继承,所以子类BusinessException得定义自己的构造方法,在构造方法中用super调用父类的构造方法逻辑

注意点:

  • 子类继承父类中所有非私有的属性和方法
  • 子类只能继承一个父类
  • 构造器不能被继承

多态

多态是以封装和继承为基础。多态就是同一个接口,使用不同的实例而执行不同操作,具体示例如下:

class Father {
    private int age = 40;
    public int getAge() {
        return age;
    }
    public void say() {
        System.out.println("I'm father");
    }
}
 
class Son extends Father{
    private int age = 16;
    @Override
    public void say() {
        System.out.println("I'm son");
    }
    public void play() {}
}
 
public class Main{
    public static void main(String[] args) {
        Father father = new Son();
        System.out.println(father.getAge()); // 输出40
        father.say(); // 输出I'm son
        // father.play() // 无法完成编译
    }
}