博客 Java 基础 --- 浅谈 Java 中的访问权限控制

Java 基础 --- 浅谈 Java 中的访问权限控制

   数栈君   发表于 2023-11-23 14:35  117  0

1. 描述:


今天我们就浅谈一下 Java 中的访问权限控制,例如如下 2 个场景:


场景 1:工程师创建 ClassA, 如果现在有个需求是 ClassA 不能被应用中其他所有类访问,我们该如何处理呢?


场景 2:工程师创建 ClassA,ClassA 中写了 function1 (),function2 () 两个方法,现在需求是 ClassA 只想把 function1 () 对外公布,我们又该如何处理呢?


在 Java 中,提供了四种访问权限控制:默认访问权限(包访问权限),public,private 以及 protected。


注意,上述四种访问权限,只有默认访问权限和 public 能够用来修饰类。修饰类的变量和方法四种权限都可以。(本处所说的类针对的是外部类,不包括内部类)


下面就分别针对修饰类和修饰类的成员来讲述这四种访问权限控制。



2. 修饰类


默认访问权限(包访问权限):用来修饰类的话,表示该类只对同一个包中的其他类可见。


public:用来修饰类的话,表示该类对其他所有的类都可见。


2.1 直接上案例


TestMain.java


package com.qu.test1;

public class TestMain {

public static void main(String[] args) {
// TODO Auto-generated method stub
Person person = new Person("屈光乐");
System.out.println(person.getName());
}

}

Person.java


package com.qu.test1;

class Person {//默认的访问权限(包访问权限)
private String name;

public Person(String name){
this.name = name;

}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}


}

运行结果:


http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/4861fc9ea44ca2a8fb26425ab2035c5e..png


从代码可以看出,修饰 People 类采用的是默认访问权限,而由于 People 类和 Main 类在同一个包中,因此 People 类对于 Main 类是可见的。


2.2 上案例


此时 People 类和 Main 类不在同一个包中,会发生什么情况呢?


http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/9c9ffd1e8a73f64be83c7fa0c7a2678e..png


报的错误提示:The type com.qu.test2.Person is not visible


提示 Peolple 类在 TestMain 类中不可视。从这里就可以看出,如果用默认访问权限去修饰一个类,该类只对同一个包中的其他类可见,对于不同包中的类是不可见的。


正如上图的快速修正提示所示,将 People 类的默认访问权限更改为 public 的话,People 类对于 TestMain 类便可见了。



3. 修饰类的方法和变量


  1. 默认访问权限(包访问权限):如果一个类的方法或变量被包访问权限修饰,也就意味着只能在同一个包中的其他类中显示地调用该类的方法或者变量,在不同包中的类中不能显示地调用该类的方法或变量。
  2. private:如果一个类的方法或者变量被 private 修饰,那么这个类的方法或者变量只能在该类本身中被访问,在类外以及其他类中都不能显示地进行访问。
  3. protected:如果一个类的方法或者变量被 protected 修饰,对于同一个包的类,这个类的方法或变量是可以被访问的。对于不同包的类,只有继承于该类的类才可以访问到该类的方法或者变量。
  4. public:被 public 修饰的方法或者变量,在任何地方都是可见的。

3.1 直接上案例来区分


Person.java


package com.qu.test1;

class Person {//默认的访问权限(包访问权限)
private String name;

public Person(String name){
this.name = name;

}

String getName() {//默认的访问权限(包访问权限)
return name;
}
void setName(String name) {//默认的访问权限(包访问权限)
this.name = name;
}


}

TestMain.java 中的代码不变。打印结果也是:屈光乐


如果我们在将 Person 类放在另个包下,报如下错误:


person.getName () 不可见


由此可以看出,如果用默认访问权限来修饰类中的方法或者变量,则只能在同一个包的其他类中进行访问。


3.2


package com.qu.test1;

public class Person {
private String name;
protected int age = 18;

public Person(String name){
this.name = name;

}

protected String getName() {//protected的访问权限
return name;
}
protected void setName(String name) {//protected的访问权限
this.name = name;
}


}

此时是可以在 Main 中显示调用方法 getName 和 setName 的。打印结果:


姓名:屈光乐 年龄:18


3.3 如果 People 类和 Main 类处于不同包中:


则 testMain 中代码就会报错:getName () 方法不可见


当我们改成如下代码就可以了:


package com.qu.test1;

import com.qu.test2.Person;

public class Student extends Person {

public Student(String name) {
super(name);

}

public String getPerson(){
return getName();
}

public int getAge(){
return age;
}
}

TestMain.java


package com.qu.test1;
public class TestMain {

public static void main(String[] args) {
// TODO Auto-generated method stub
Student student = new Student("屈光乐");
System.out.println("姓名:"+student.getPerson() +" "+ "年龄:"+student.getAge());
}


}

打印结果:姓名:屈光乐 年龄:18


注意:对于使用 protected 访问修饰符来对某个类中的成员变量或方法进行修饰,凡是继承这个类的子类是可以直接访问这个类中的成员变量或方法,是不需要用这个类的对象去调用该方法会成员变量。


下面补充一些关于 Java 包和类文件的知识:


1)Java 中的包主要是为了防止类文件命名冲突以及方便进行代码组织和管理;


2)对于一个 Java 源代码文件,如果存在 public 类的话,只能有一个 public 类,且此时源代码文件的名称必须和
public 类的名称完全相同,另外,如果还存在其他类,这些类在包外是不可见的。如果源代码文件没有 public
类,则源代码文件的名称可以随意命名。

免责申明:

本文系转载,版权归原作者所有,如若侵权请联系我们进行删除!

《数据治理行业实践白皮书》下载地址:https://fs80.cn/4w2atu

《数栈V6.0产品白皮书》下载地址:
https://fs80.cn/cw0iw1

想了解或咨询更多有关袋鼠云大数据产品、行业解决方案、客户案例的朋友,浏览袋鼠云官网:
https://www.dtstack.com/?src=bbs

同时,欢迎对大数据开源项目有兴趣的同学加入「袋鼠云开源框架钉钉技术群」,交流最新开源技术信息,群号码:30537511,项目地址:
https://github.com/DTStack

0条评论
社区公告
  • 大数据领域最专业的产品&技术交流社区,专注于探讨与分享大数据领域有趣又火热的信息,专业又专注的数据人园地

最新活动更多
微信扫码获取数字化转型资料
钉钉扫码加入技术交流群