类的属性和方法有时候我们不希望其他的类或子类使用,该怎么办呢?可以通过信息的隐藏与封装实现,在Java中就是通过 <modifiers>
来实现;
[<modifiers>] class <class_name>
1、<modifiers>
有四种形式:public
、protected
、default
、private
来实现的;
2、default
表示不写,比如 class Person
也是可以的;
3、这四种形式,有自己的隐藏和封装范围(参考下方图标);
一、信息隐藏介绍
1、隐藏:指的是对象的一种保护机制,使得它的属性或方法不被外部的程序直接访问;因为,使用者对类内部定义的数据(属性)的直接操作,可能会导致数据的错误、混乱或安全性问题;
2、就像一个人的名字是可以公开(public)的,但是身份证信息就需要保密(private);
二、信息封装介绍
1、封装指的是将对象的状态信息(属性)和行为(函数)捆绑为一个逻辑单元的机制;
2、Java 中通过将数据封装、声明为私有的(private),再提供一个或多个公开的(public)方法实现对该属性的操作,以实现下述目的:
-
隐藏一个类的实现细节;
-
防止对封装数据的未经授权的访问;
-
有利于保证数据的完整性,增强代码的可维护性;
三、如何实现封装和隐藏
1、通过修饰符<modifiers>
控制隐藏范围:public
、protected
、default
、private
;
2、可以通过自定义 setter 和 getter 方法来控制我们想(公开)暴露的数据;
四、修饰符的权限
参考下方图表,选择<modifiers>
控制隐藏范围即可;√
表示可以访问,×
表示不可以访问;
作用域 | 当前类 | 同一包内 | 不同包子孙类 | 不同包其他类 |
public | √ | √ | √ | √ |
protected | √ | √ | √ | × |
default | √ | √ | × | × |
private | √ | × | × | × |
1、可以看到,public的访问范围最大;private的访问范围最小;
2、在编程中,一般属性用private居多,方法用public居多;
五、编程实战
代码的详细解读,可以参考视频教程
Person.java
/**
* User: 祁大聪
*/
public class Person {
public String name; // public(公共的)
int age; // default(默认的)
private int money=1000000; // protected(私有的)
protected int grades; // protected (保护的)
public void printPersonInfo(){
this.name = "三妮";
this.age = 100;
}
//封装money对应的开放函数,通过密码才能访问
protected int getPersonMoney(String password){
if(password == "111"){
return this.money;
}else{
return 0;
}
}
public static void main(String[] args) {
Person p = new Person();
p.name = "三妮";
p.age = 100;
p.money = 10000;//同一个函数内可以使用money
p.grades = 100;
}
//通过自定属性的setter & getter方法,来控制属性的访问
public String getName() {
return name;
}
public void setName(String name) {
//逻辑控制
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int getMoney() {
return money;
}
public void setMoney(int money) {
this.money = money;
}
public int getGrades() {
return grades;
}
public void setGrades(int grades) {
this.grades = grades;
}
}
测试类,调用 Person.java 中的成员
PersonTest.java
// 和 Person.java 在同一个package(包)中
/**
* User: 祁大聪,通过PersonTest理解访问权限
*/
public class PersonTest {
public static void main(String[] args) {
Person p = new Person();
//age是default,但是在同一包内,可以访问
p.age = 28;
// p.money = 1000; //这个是不可以直接访问,因为是私有的
int money = p.getPersonMoney("112"); //可以通过开放函数访问私有数据
System.out.println("money = " + money);
}
}