对于java中访问权限的理解与解析
程序员文章站
2024-03-19 14:23:22
...
对于刚开始学习java的“程序员”来说,或者说是刚刚接触面向对象编程的人,对于四个访问权限的理解刚开始难免会有所困难,话不多说,进入正题,看我的总结:
1、首先呢,对于java的访问权限共有4个
private 默认default protected public
他们的权限范围也按照以上的顺序逐渐增大,解释一下默认default的类型,就是什么都不写,由系统默认
2、其次,用法:类前面允许使用两种,即 public 和 default(默认),类成员变量,类成员函数,实例成员变量,实例成员函数,4种都可以使用,都符合要求
3、理解:private (当前类访问权限) default(包访问权限) protected(子类访问权限) public(公共访问权限)
private : 只允许被当前的类访问
default(默认):可以被当前的类,也可以被同一个包下的所有类访问
protected:可以被当前的类访问,也可以被同一个包下的所有类访问,还可以被不同的包下的有继承实现关系的子类访问
public:可以被当前的类访问,也可以被同一个包的所有类访问,还可以被不同包下的类访问。。。。换言之,public 属于完全暴露,完全透明的权限。
4、文字看不懂,看看代码,帮助理解下。
被public修饰的类Persion1;
package encapsulation;
public class Persion1 {
private static int priVai;
protected static int proVai;
public static int pubVai;
static int defaultVai;
private static void priTest(){
System.out.println("我是一个私有(当前类访问权限)的方法!");
}
protected static void proTest(){
System.out.println("我是一个保护(protected子类访问权限)的方法");
}
public static void pubTest(){
System.out.println("我是一个public(公共访问权限)的方法");
}
static void defaultTest(){
System.out.println("我是一个默认(包访问权限)的方法");
}
}
与Persion1在同一个包下;
package encapsulation;
public class Persion2 {
public static void main(String[] args) {
Persion1 p = new Persion1();
//可以看出在同一个包下,调用public修饰的类的成员(变量和方法)只有 私有的 变量和方法不能被调用
//同一个包下可以访问3种
System.out.println(p.proVai);
System.out.println(p.pubVai);
System.out.println(p.defaultVai);
p.pubTest();
p.proTest();
p.defaultTest();
}
}
与Persion1在不同的包下;
package encapsulation2;
import encapsulation.Persion1;
public class Persion3 {
public static void main(String[] args) {
Persion1 p = new Persion1();
//可以看出在不同的包下,调用 public修饰的类 的成员(变量和方法)只有 共有的(public) 变量和方法能被调用
System.out.println(p.pubVai);
p.pubTest();
}
}
与Persion1在不同的包下,但继承了Persion1,成为其子类;
package encapsulation2;
import encapsulation.Persion1;
public class Persion4 extends Persion1 {
public static void main(String[] args) {
//不同的包下,在有继承的关系的情况下,能访问public 和 protected 修饰的变量和方法
//注意不要用父类的一个对象在这里调用,那是父类的作用域 问题!!!
System.out.println(pubVai);
System.out.println(proVai);
pubTest();
proTest();
}
}
package encapsulation;
class Persion10 {
private static int priVai;
protected static int proVai;
public static int pubVai;
static int defaultVai;
private static void priTest(){
System.out.println("我是一个私有(当前类访问权限)的方法!");
}
protected static void proTest(){
System.out.println("我是一个保护(protected子类访问权限)的方法");
}
public static void pubTest(){
System.out.println("我是一个public(公共访问权限)的方法");
}
static void defaultTest(){
System.out.println("我是一个默认(包访问权限)的方法");
}
}
package encapsulation;
public class Persion20 {
public static void main(String[] args) {
Persion1 p = new Persion1();
//可以看出在同一个包下,调用public修饰的类的成员(变量和方法)只有 私有的 变量和方法不能被调用
//同一个包下可以访问3种
System.out.println(p.proVai);
System.out.println(p.pubVai);
System.out.println(p.defaultVai);
p.pubTest();
p.proTest();
p.defaultTest();
}
}
和Persion10在不同的包下;
package encapsulation2;
import encapsulation.Persion1;
public class Persion30 {
public static void main(String[] args) {
Persion1 p = new Persion1();
//可以看出在不同的包下,调用 public修饰的类 的成员(变量和方法)只有 共有的(public) 变量和方法能被调用
System.out.println(p.pubVai);
p.pubTest();
}
}
package encapsulation2;
//以下的两行代码是错误的:
//import encapsulation.Persion10;
//class Persion40 extends Persion10 {
//}
/*错误的原因:
The type encapsulation.Persion10 is not visible
default只是包的访问权限!!
*/
下面这个是一个简单的布局
这东西还是自己亲手试一下,脑海里立马就清楚了 ^ - ^