Java基础 4.26

1.访问修饰符细节

java 复制代码
package com.logic.modifier;

public class A {
    public int n1 = 100;
    protected int n2 = 200;
    int n3 = 300;
    private int n4 = 400;
    public void m1() {
        //在同一个类中 可以访问public protected 默认 private 修饰属性和方法
        System.out.println(n1 + " " + n2 + " " + n3 + " " + n4 + "\t");
    }
    protected void m2() {}
    void m3() {}
    private void m4() {}
    public void hi() {
        //在同一类中 可以访问public protected 默认 private 修饰属性和方法
        m1();
        m2();
        m3();
        m4();
    }

}
java 复制代码
package com.logic.modifier;

public class B {
    public void foo() {
        A a = new A();
        //在同一个包下,可以访问public protected 和 默认修饰符属性或方法 不能访问private 属性
        System.out.println(a.n1 + " " + a.n2 + " " + a.n3);
        a.m1();
        a.m2();
        a.m3();
    }
}
java 复制代码
package com.logic.modifier;

public class Test {
    public static void main(String[] args) {
        A a = new A();
        a.m1();
        B b = new B();
        b.foo();
    }
}
java 复制代码
package com.logic.pkg;

import com.logic.modifier.A;

public class Test {
    public static void main(String[] args) {
        A a = new A();
        //在不同包下 可以访问public 修饰符的属性或方法
        //但是不能访问 protected 默认 private修饰的属性或方法
        System.out.println(a.n1);
        a.m1();
    }
}

2.封装

封装介绍

  • 封装就是把抽象出的数据(属性)和对数据的操作(方法)封装在一起,数据被保护在内部,程序的其他部分只有通过被授权的操作(方法),才能对数据进行操作
  • 对电视的操作就是典型的封装(用户不用知道怎么开机的 只用按下开机键)

封装的理解和好处

隐藏实现细节 方法 <-- 调用

可以对数据进行验证 保证安全合理

封装的实现步骤(三步)

  • 将属性进行私有化 private(不能直接修改属性)
  • 提供一个公共的(public)set方法 用于对属性判断并赋值
java 复制代码
public void setXxx(类型 参数名) {
    //加入数据验证的业务逻辑
    属性 = 参数名;
}
  • 提供一个公共的(public)get方法 用于获取属性的值
java 复制代码
public 数据类型 getXxx() {
    //权限判断, Xxx某个属性
    return xxx;
}

封装快速入门

java 复制代码
package com.logic.encap;

import jdk.nashorn.internal.ir.CallNode;

public class Encapsulation01 {
    public static void main(String[] args) {
        //如果要使用快捷键alt + r 需要先配置主类
        //第一次 我们使用鼠标点击形式运算程序 后面直接可用快捷键
        Person person = new Person();
        person.setAge(20);
        person.setName("John");
        person.setSalary(10000);
        System.out.println(person.info());
    }
}
/*
不能随便查看人的年龄 工资等隐私 并对设置的年龄进行合理的验证 年龄合理就设置 否则给默认
年龄 年龄必须在1-120 工资不能直接查看 name的长度在2-6字符之间
 */

class Person {
    public String name;//名字公开
    private double salary;//薪水保密
    private int age;//年龄保密
    //自己写setXxx 和 getXxx 太慢 使用快捷键 alt + insert
    //根据要求完善代码
    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        //加入对数据的校验 相当于增加业务逻辑
        if (age >= 1 && age <= 120) {
            this.age = age;
        } else {
            System.out.println("你设置的年龄需要在1-120之间");
            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("名字长度不符合要求,要在2-6个字符之间,将默认无名");
            this.name = "无名";
        }
    }

    public double getSalary(int password) {
        if (password == 123456) {
            return salary;
        } else {
            System.out.println("你输入的密码不正确");
            return -1;
        }
    }

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

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

将构造器与封装结合

java 复制代码
public Person(String name, double salary, int age) {
//        this.name = name;
//        this.salary = salary;
//        this.age = age;
        setSalary(salary);
        setAge(age);
        setName(name);
//这样就能调用之前设置的初始化方法,无法绕过验证
    }

封装练习

java 复制代码
package com.logic.encap;

import java.util.Scanner;

/*
创建程序 在其中定义两个类 Account 和 AccountTest
1.Account类要求具有属性 姓名(长度为2-4位)余额(>20)
密码(必须是6位) 如果不满足 给出提示信息并给默认值
2.通过set方法给Account的属性赋值
3.在AccountTest中测试
 */
public class Account {
    private String name;
    private double balance;
    private String password;

    public Account() {
    }

    public Account(String name, double balance, String password) {
        setName(name);
        setBalance(balance);
        setPassword(password);
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        if (name.length() >= 2 && name.length() <= 4) {
            this.name = name;
        } else {
            System.out.println("名字必须在2-4个字之间,默认无名");
            this.name = "无名";
        }
    }

    public double getBalance() {
        return balance;
    }

    public void setBalance(double balance) {
        if (balance >= 20) {
            this.balance = balance;
        } else {
            System.out.println("余额必须大于20,默认20");
            this.balance = 20;
        }
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        if (password.length() == 6) {
            this.password = password;
        } else {
            System.out.println("密码必须是6位,默认000000");
            this.password = "000000";
        }
    }

    public void info() {
        //添加一个输入密码的步骤,加入权限检测环节
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入密码:");
        String infoPassword = sc.next();
        if (password.equals(infoPassword)) {
            System.out.println("name = " + name + " balance = " + balance + " password = " + password);
        } else {
            System.out.println("密码不正确,请重新输入!");
        }
    }
}
java 复制代码
package com.logic.encap;

public class AccountTest {
    public static void main(String[] args) {
        Account account = new Account();
        account.setBalance(50);
        account.setName("jack");
        account.setPassword("123456");
        account.info();
    }
}
相关推荐
赵小哥要冲啦11 分钟前
社区邻里互助小程序从 0 到 1 复盘:需求拆解与信任机制设计
java·小程序·需求分析
xiaogai_gai15 分钟前
采购业务退款单同步实战:从钉钉审批流到金蝶云星空付款单
java·数据库·钉钉
二哈赛车手36 分钟前
新人笔记---hermes定时功能设计,具体讲解以及可优化点
java·人工智能·笔记·spring·ai·typescript
ZWZhangYu41 分钟前
从 Dify 实践理解大模型上下文缓存
java·后端·spring
小熊恋旧44 分钟前
Python 面向对象编程:方法、属性、继承与多态详解
开发语言·python
云边云科技_云网融合1 小时前
面向汽车零部件制造业场景的解决方案 | 70 秒:一台车下线的时间里,藏着五张网
开发语言·汽车·php
Evand J1 小时前
【PMSM滤波例程2】PMSM未知负载转矩观测EKF。MATLAB例程(负载增广EKF与实际仿真结果)。附下载链接
开发语言·matlab·电机
小羊没烦恼!1 小时前
关于分布式锁原理的一些学习与思考-redis分布式锁,zookeeper分布式锁
java·服务器·网络·学习·负载均衡
will_net1 小时前
apollo 站点部署&C#接入
开发语言·c#·apollo
晗夜未央2 小时前
任务队列反复失败,先分清重试、阻塞和结果待核对
开发语言·javascript