今天我们就浅谈一下 Java 中的访问权限控制,例如如下 2 个场景:
场景 1:工程师创建 ClassA, 如果现在有个需求是 ClassA 不能被应用中其他所有类访问,我们该如何处理呢?
场景 2:工程师创建 ClassA,ClassA 中写了 function1 (),function2 () 两个方法,现在需求是 ClassA 只想把 function1 () 对外公布,我们又该如何处理呢?
在 Java 中,提供了四种访问权限控制:默认访问权限(包访问权限),public,private 以及 protected。
注意,上述四种访问权限,只有默认访问权限和 public 能够用来修饰类。修饰类的变量和方法四种权限都可以。(本处所说的类针对的是外部类,不包括内部类)
下面就分别针对修饰类和修饰类的成员来讲述这四种访问权限控制。
默认访问权限(包访问权限):用来修饰类的话,表示该类只对同一个包中的其他类可见。
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;
}
}
运行结果:
从代码可以看出,修饰 People 类采用的是默认访问权限,而由于 People 类和 Main 类在同一个包中,因此 People 类对于 Main 类是可见的。
2.2 上案例
此时 People 类和 Main 类不在同一个包中,会发生什么情况呢?
报的错误提示:The type com.qu.test2.Person is not visible
提示 Peolple 类在 TestMain 类中不可视。从这里就可以看出,如果用默认访问权限去修饰一个类,该类只对同一个包中的其他类可见,对于不同包中的类是不可见的。
正如上图的快速修正提示所示,将 People 类的默认访问权限更改为 public 的话,People 类对于 TestMain 类便可见了。
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