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; }
|
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
|
- 说明:本例中定义的一个静态属性number的访问修饰符定义为protected,在其他包中只有子类才能访问该属性。
总结
控制等级 |
同一类中 |
同一包中 |
不同包的子类中 |
其他 |
private |
可直接访问 |
|
|
|
默认 |
可直接访问 |
可直接访问 |
|
|
protected |
可直接访问 |
可直接访问 |
可直接访问 |
|
public |
可直接访问 |
可直接访问 |
可直接访问 |
可直接访问 |
- 注意:上表中所说的访问限制是指类的修饰符为public的情况下,对成员变量的访问限制,如果类的修饰符默认,则只限于在本包中的类才能访问,可以想象,JavaAPI所提供的类均由public修饰,否则,在其他包中不能访问其任何成员,即使是public成员,如果类的修饰不是public也限制了其访问。