Java 访问控制修饰符

本文最后更新于:2024年3月18日 凌晨

Java 访问控制修饰符

  • 访问控制符是一组限定类,域或方法是否可以被程序其他部分访问和调用的修饰符,Java用来修饰类的访问控制符只有public,表示类对外"开放",类定义时也可以无访问修饰,则表示类只限于同一包中访问使用,修饰属性和方法的访问修饰符有public,protected和private3种,还有一种是无修饰符的默认情况,外界能访问某个类的成员的条件是:先要能访问类,其次还要能访问类的成员。

公共访问控制符(public)

  • 访问控制符public可以用于两个地方,首先是作为类的修饰符,将类声明为公共类,表明它可以被所有的其他类所访问,否则该类只限在同一包的类种访问,其次,可以作为类的成员的访问修饰符,表明在其他类中可以无限制地访问该成员。
  • 要真正做到类成员可以在任何地方访问,在进行类设计时必须同时满足两点:一是类被定义为public,二是类的成员被定义为public

默认访问控制符

  • 默认的访问控制指在属性或方法定义前没有给出访问控制符情形,在这种情况下,该属性或方法只能在同一个包的类种访问,而不可以在其他包的类中访问。

私有访问控制符(private)

  • 访问控制符private用来声明类的私有成员,它提供了最高的保护级别,用private修饰的域或方法只能被类自身所访问和修改,而不能再任何其他类(包括该类的子类)中访问,通常,出于系统设计的安全性考虑,将类的成员属性定义为private形式保护起来,而将类的成员方法定义为public形式对外公开,这是类封装特性的一个体现。

[例6-7]:测试对私有成员的访问。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class Myclass {
private int a;// 私有变量。

void set(int k) {
a = k;
}

void display() {
System.out.println(a);
}
}

class Ex6_7 {
public static void main(String[] args) {
Myclass my = new Myclass();
my.set(4);
my.display();
my.a = 5;
}
}
  • 以上程序在编译时将产生访问违例的错误提示。
  • 说明:由于私有成员a只限于在本类访问,所以,在另一个类中不能直接对其访问,第18行将报错,但第16,17行通过非私有成员方法set()display()间接访问a是允许的。

保护访问控制符(protected)

  • 访问控制符protected修饰的成员可以被以下3种类所引用:
    • 该类本身。
    • 与它在同一个包中的其他类。
    • 在其他包中的该类的子类。
  • [例6-8]:测试包的访问控制的一个简单程序。
  • 文件1:PackageData.java(该文件存放在sub子目录下)
1
2
3
4
package sub;
public class PackageData{
protected static int number = 1;
}
  • 文件2:Mytest.java
1
2
3
4
5
6
import sub.*;
public class Mytest{
public static void main(String args[]){
System.out.println("result="+PackageData.number);
}
}
  • 程序编译将显示如下错误:
1
2
3
Mytest.java:4: number has protected access in sub.PackageData
System.out.println("result=”+PackageData.number);
1 error
  • 如果将程序Mytest.java的类头部作如下修改再测试:
1
public class Mytest extends PackageData
  • 则程序编译通过,运行结果如下:
1
result=1
  • 说明:本例中定义的一个静态属性number的访问修饰符定义为protected,在其他包中只有子类才能访问该属性。

总结

控制等级 同一类中 同一包中 不同包的子类中 其他
private 可直接访问
默认 可直接访问 可直接访问
protected 可直接访问 可直接访问 可直接访问
public 可直接访问 可直接访问 可直接访问 可直接访问
  • 注意:上表中所说的访问限制是指类的修饰符为public的情况下,对成员变量的访问限制,如果类的修饰符默认,则只限于在本包中的类才能访问,可以想象,JavaAPI所提供的类均由public修饰,否则,在其他包中不能访问其任何成员,即使是public成员,如果类的修饰不是public也限制了其访问。

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!