什么是封装
面向对象编程有三个基本特征:封装,继承,多态。
封装的意思就是把复杂的操作隐藏起来,只留下用来访问的接口用于使用。
访问权限修饰符
访问权限修饰符有三个。
public:修饰 类 属性 方法。
private:修饰 属性 方法。
protected:修饰 属性 方法
缺省不写:修饰 类 属性 方法
代码例子:
packagefengzhuang;publicclassUser{int age=0;// 默认(包可见)privateString name="chenjiamur";// 私有protectedboolean mood=true;// 包可见 + 子类可见}// 同一个包中的另一个类classUser2{User user=newUser();User3 user3=newUser3();voidtest(){user3.user=user;// 可以赋值int age2=user.age;// ✅ 同包,可访问 default// String name2 = user.name; // ❌ private,编译错误boolean mood2=user.mood;// ✅ protected 在同包内可访问}}// 继承 User 的子类(同包)classUser3extendsUser{User user;// 额外持有的引用(演示赋值用)voidtest(){int a=age;// ✅ 继承自父类的 default 成员,同包子类可访问// String n = name; // ❌ private,不能访问boolean m=mood;// ✅ protected,子类可访问(即使在不同包也 OK)// 若通过外部引用访问User u=newUser();int age2=u.age;// ✅ 同包,可访问 default// String name2 = u.name; // ❌ privateboolean mood2=u.mood;// ✅ protected 在同包内可访问(同包任何类)}}实际例子
最后举一个实际的代码例子说明修饰符的作用
packagefengzhuang;publicclassUser{privateString name;// 必须6个字符以上privateString pwd;// 必须包含字符以及数字privateString email;// 必须包含合法的域名和@符号privateint age;// 0-150// 构造方法publicUser(String name,String pwd,String email,int age){//this.已有变量名=临时变量,这里就是括号里的临时变量传给了private修饰的几个变量。this.name=name;this.pwd=pwd;this.email=email;this.setAge(age);//经过条件判断才可以被使用的age}publicUser(){//函数的重载}publicUser(String name,String pwd){this.name=name;this.pwd=pwd;}publicintgetAge(){returnage;}publicvoidsetAge(int age1){// 将数据存入参数中,在方法中对参数进行验证后 再赋给属性if(age1<0||age1>150){System.out.println("年龄不合法~");return;}this.age=age1;}publicvoidshowInfo(){System.out.println("name:"+this.name+" pwd:"+this.pwd+" email:"+this.email+" age:"+this.age);}classStudent{}classTeacher{}classMain{publicstaticvoidmain(String[]args){User user=newUser("hello","123456","hello@hello.com",18);user.setAge(-100);int a=user.getAge();System.out.println(a);user.showInfo();User user1=newUser();User user2=newUser("admin","123456");user2.showInfo();user1.showInfo();}}}private作用01:防止别人绕过检验方法。
// 假设 age 是 publicUser user=newUser("hello","123456","hello@hello.com",18);user.age=-100;// 直接赋值!不需要经过 setAge,编译通过,运行正常!有了 private,外部无法直接访问 user.age,只能被迫调用 user.setAge(-100)。这样一来,你的校验逻辑就强制生效了,保证了对象的数据永远合法。
这就是 private 最大的作用:保护数据完整性,强制外部遵守你的业务规则。
private作用02:方便修改程序
添加private以后不能通过user.pwd=‘123’;等方式修改,而是只能通过setPwd()等方法进行获取。