Skip to content

Latest commit

 

History

History
219 lines (174 loc) · 5.7 KB

封装&继承&多态.md

File metadata and controls

219 lines (174 loc) · 5.7 KB

封装(encapsulation)

介绍

  • 什么是封装

    • 封装就是把抽象出的数据【==属性==】和对数据的操作【==方法==】封装在一起,数据被保护在内部,程序的其他部分只有通过被授权的操作【==方法==】,才能对数据进行操作。
      • 用来打比方的话就是电视的遥控器,你只能操作按键来进行对电视的指令,但是不知道内部
  • 封装的理解和好处

    • 隐藏实现细节 方法(链接数据库)(<-- 调用(传入参数)
    • 可以对数据进行验证,保证安全合理
  • 封装的实现步骤

    1. 将属性进行私有化private[不能直接修改属性]

    2. 提供一个公共的(public)set方法,用于对属性判断并赋值

    3.  public void setXxx(类型 参数名){ // Xxx表示某个属性
           // 加入数据验证的业务逻辑
           属性=参数名;
       }
    4. 提供一个公共的(public)get方法,用于获取属性的值

      public 数据类型 getXxx(){ // 权限判断,Xxx某个属性
          return xx;
      }

快速入门

package Object;
// 不能随便查看人的年龄,工资等隐私,并对设置的年龄进行合理的验证。年龄合理就设置,否则给默认
// 年龄, 必须在1-120, 年龄, 工资不能直接查看, name 的长度在2-6 字符之间
public class encap1 {
    public static void main(String[] args) {
        Person person = new Person();
        person.setName("Harry");
        person.setAge(30);
        person.setSalary(2000.1);
        System.out.println(person.info());
    }
}

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        if (name.length()>=2 && name.length()<=6){
            this.name = name;
        } else {
            System.out.println("error name");
            this.name = "worker";
        }

    }

    public double getSalary() {
        return Salary;
    }

    public void setSalary(double salary) {
        Salary = salary;
    }
 
    public int getAge() {
        if (age >=1 && age <= 120){
            this.age = age;
        } else {
            System.out.println("wrong age");
            this.age = 18;
        }
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
    public String info(){
        return "information about name: " + name + " about age " + age + " sal "+ Salary;
    }
}

封装与构造器

  • 如果我们直接使用构造器指定属性进去
    • 那么就可以直接得到已经被保护的信息
  • 解决方法
    • 可以直接在构造器中set方法, 这样就可以防御了

课堂练习

  • 创建程序,在其中定义两个类:Account 和AccountTest 类体会Java 的封装性。

  • Account 类要求具有属性:姓名(长度为2 位3 位或4 位)、余额(必须>20)、密码(必须是六位), 如果不满足,则给出提示信息,并给默认值(程序员自己定)通过setXxx 的方法给Account 的属性赋值。

  • 在AccountTest 中测试

  • 这里是Account类

package Object;
    /*
     * 创建程序,在其中定义两个类:Account 和AccountTest 类体会Java 的封装性。
     * Account 类要求具有属性:姓名(长度为2 位3 位或4 位)、余额(必须>20)、
     * 密码(必须是六位), 如果不满足,则给出提示信息,并给默认值(程序员自己定)
     * 通过setXxx 的方法给Account 的属性赋值。
     * 在AccountTest 中测试
     */
public class Account {
    private String name;
    private double money;
    private int [] password;
    private int errorValue;

    public Account() {
    }
    public Account(String name, double money, int[] password) {
        this.name = name;
        this.money = money;
        this.password = password;
        this.errorValue = errorValue;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        if (name.length()>=2 && name.length() <=6){
            this.name = name;
        } else {
            System.out.println("please re-make name");
            this.name = "You-know-who";
            errorValue++;
        }
    }

    public double getMoney() {
        return money;
    }

    public void setMoney(double money) {
        if (money <= 20){
            System.out.println("You cannot make your money less");
            this.money = 0;
            errorValue++;
        } else {
            this.money = money;
        }
    }

    public int[] getPassword() {
        return password;
    }

    public void setPassword(int[] password) {
        if (password.length == 6){
            this.password = password;
        }
        else {
            System.out.println("Please re-make password");
            this.password = new int[]{0, 0, 0, 0, 0, 0};
            errorValue++;
        }
    }


    public int getErrorValue(int i) {
        return errorValue;
    }

    public void setErrorValue(int errorValue) {
        this.errorValue = errorValue;
    }

        public void show(){
        System.out.println("Name= "+name);
        if (errorValue>=1){
            System.out.println("You cannot see the rest of things");
        } else {
            System.out.println("You can");
        }

        // 这里是是否查看密码
    }

}
  • 这里是test
package Object;

public class AccountTest {
    public static void main(String[] args) {
        Account account = new Account();
        account.setName("Harry");
        account.setMoney(100);
        account.setPassword(new int[]{1, 1, 1, 1, 1, 1});

        account.show();
    }
}