如果在修饰的元素上面没有写任何访问修饰符,用default表示
作用域 | 当前类 | 同一包(package) | 同一包下子类 | 不同包下子类 | 其它包 |
public | √ | √ | √ | √ | √ |
protected | √ | √ | √ | √ | × |
default | √ | √ | √ | × | × |
private | √ | × | × | × | × |
同一package可以理解为在同一个村庄。
public 可以理解为无论是否在一个村,谁都可以访问;
protected 可以理解为,只有自己一个村的邻居和子女,以及远嫁出去的子女可以访问;
default 可以理解为,只有自己同村的可以范围,如果子女和自己是同村,也可以使用。如果子女远嫁出去,不在自己的村庄了,很抱歉,远水解不了近渴,远亲不如近邻;
private 可以理解为私有财产不可侵犯,有些事情,除了自己,绝不能让其他人访问,例如银行密码。
上面参考https://blog.youkuaiyun.com/qq_31686787/article/details/52553974
同一包和同一包下子类访问权限作用域一样,于是:
作用域 | 当前类 | 同一包 | 不同包下子类 | 其它包 |
public | √ | √ | √ | √ |
protected | √ | √ | √ | × |
default | √ | √ | × | × |
private | √ | × | × | × |
下面举个例子:
(框中黑色为可访问权限)
# Main类 为当前类
package com.one;
//当前类
public class Main {
public void test() {
//当前类中四种都可以访问到
System.out.println(this.pub);
System.out.println(this.pro);
System.out.println(this.def);
System.out.println(this.pri);
this.pub();
this.pro();
this.def();
this.pri();
}
//成员变量
public int pub;
protected int pro;
int def;
private int pri;
//成员函数
public void pub()
{System.out.println( "public"); }
protected void pro()
{System.out.println( "protected"); }
void def()
{System.out.println( "default"); }
private void pri()
{System.out.println( "private"); }
}
# a类 为同一包下的类,无继承关系
package com.one;
//同一包下 无继承关系
//同一包下和同一包下子类访问权限作用域一样
public class a {
public void test() {
Main m=new Main();
System.out.println(m.pub);
System.out.println(m.pro);
System.out.println(m.def);
//private只有当前类可以访问
System.out.println(m.pri);
m.pub();
m.pro();
m.def();
//private只有当前类可以访问
m.pri();
}
}
# b类 为同一包下的子类
package com.one;
//同一包下子类
//同一包下和同一包下子类访问权限作用域一样
public class b extends Main {
public void test() {
System.out.println(super.pub);
System.out.println(super.pro);
System.out.println(super.def);
System.out.println(super.pri);
super.pub();
super.pro();
super.def();
super.pri();
}
}
# c类为不同包下子类
package com.two;
import com.one.Main;
//不同包下子类
public class c extends Main {
public void test() {
System.out.println(super.pub);
System.out.println(super.pro);
System.out.println(super.def);
System.out.println(super.pri);
super.pub();
super.pro();
super.def();
super.pri();
}
//不通过super
public void test1() {
Main m=new Main();
System.out.println(m.pub);
System.out.println(m.pro);
System.out.println(m.def);
System.out.println(m.pri);
m.pub();
m.pro();
m.def();
m.pri();
}
}
# d类 为不同包 不同包中的类且无继承关系
package com.two;
import com.one.Main;
//其它包下
//与Main不同包下且无继承关系
public class d {
public void test() {
Main m=new Main();
System.out.println(m.pub);
System.out.println(m.pro);
System.out.println(m.def);
System.out.println(m.pri);
m.pub();
m.pro();
m.def();
m.pri();
}
}