Java自学day 11 之 封装

Java 封装

在面向对象程式设计方法中,封装(英语:Encapsulation)是指一种将抽象性函式接口的实现细节部分包装、隐藏起来的方法。

封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访问。

要访问该类的代码和数据,必须通过严格的接口控制。

封装最主要的功能在于我们能修改自己的实现代码,而不用修改那些调用我们代码的程序片段。

适当的封装可以让程式码更容易理解与维护,也加强了程式码的安全性。

实现Java封装的步骤

1. 修改属性的可见性来限制对属性的访问(一般限制为private),例如:

public class Person {
    private String name;
    private int age;
}

这段代码中,将 name 和 age 属性设置为私有的,只能本类才能访问,其他类都访问不了,如此就对信息进行了隐藏。

2. 对每个值属性提供对外的公共方法访问,也就是创建一对赋取值方法,用于对私有属性的访问,例如:

public class Person{
    private String name;
    private int age;
​
    public int getAge(){
      return age;
    }
​
    public String getName(){
      return name;
    }
​
    public void setAge(int age){
      this.age = age;
    }
​
    public void setName(String name){
      this.name = name;
    }
}

采用 this 关键字是为了解决实例变量(private String name)和局部变量(setName(String name)中的name变量)之间发生的同名的冲突。

快速入门案例:

package com.hspedu.encap;

public class Education01 {
    public static void main(String[] args) {
        Person p = new Person();
        p.setName("jack");
        p.setAge(30);
        p.setSalary(30000);
        System.out.println(p.info());


    }
}

class Person {
    public String name;
    private int age;
    private double salary;

    //可以用快捷键来写set和get方法 Alt + insert
    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        //判断年龄合法
        if(age >= 1 && age <= 120) {
            this.age = age;
        }
        else {
            System.out.println("invalid");
            this.age = 18;
        }
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        //加入对数据的检测
        if (name.length() >= 2 && name.length() <= 6){
            this.name = name;
        }
        else {
            System.out.println("invalid");
            this.name = "无名";
        }
    }

    public double getSalary() {
        //可以增加权限访问 密码等
        return salary;
    }

    public void setSalary(double salary) {
        this.salary = salary;
    }

    //写一个方法,返回属性信息
    public String info(){
        return name+age+salary;
    }
}
package com.hspedu.encap;

public class Education01 {
    public static void main(String[] args) {
        Person p = new Person();
        p.setName("jack");
        p.setAge(30);
        p.setSalary(30000);
        System.out.println(p.info());

        //如果使用构造器指定属性
        Person smith = new Person("smith",2000,50000);
        System.out.println(smith.info());
    }
}

class Person {
    public String name;
    private int age;
    private double salary;
    //构造器 Alt + insert
    public Person() {
    }

    public Person(String name, int age, double salary) {
//        this.name = name;
//        this.age = age;
//        this.salary = salary;
        //将set方法写在构造期中,这样可以验证数据
        setName(name);
        setAge(age);
        setSalary(salary);
    }

    //可以用快捷键来写set和get方法 Alt + insert
    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        //判断年龄合法
        if(age >= 1 && age <= 120) {
            this.age = age;
        }
        else {
            System.out.println("invalid");
            this.age = 18;
        }
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        //加入对数据的检测
        if (name.length() >= 2 && name.length() <= 6){
            this.name = name;
        }
        else {
            System.out.println("invalid");
            this.name = "无名";
        }
    }

    public double getSalary() {
        //可以增加权限访问 密码等
        return salary;
    }

    public void setSalary(double salary) {
        this.salary = salary;
    }

    //写一个方法,返回属性信息
    public String info(){
        return name+age+salary;
    }
}

将set方法写在构造器内才会有验证的效果,直接写构造的话会绕过set方法,不执行set中的检验信息合法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值