目录
上图是最常见的Java四种访问权限区分的表格,但对于本人来说,没有将类和类的对象区分开是不太方便的,因此特整理归纳如下:
private:
public class Base1 {
private int myprivate;
}
public class object {
public static void main() {
//对于对象来说:
Base1 base1=new Base1();
//base1.myprivate 类的对象始终无法访问private
}
}
default:
-
类
package TestA;
public class Base1 {
private int myprivate;
int mydefault;
protected int myprotected;
public int myint;
}
package TestA;
public class Base2 extends Base1 {
//同包、继承
public void test() {
mydefault=0;//同包,能够访问
}
}
-
类的对象
package TestA;
public class Base1 {
int mydefault;
}
package TestA;
public class object2 {
public void test() {
Base1 base1=new Base1();
base1.mydefault=0;
//包可见,对象所在类与对像所属类同包
}
}
protected:
-
类
package TestA;
public class Base1 {
private int myprivate;
int mydefault;
protected int myprotected;
public int myint;
}
package TestA;
public class Base2 extends Base1 {
//同包、继承
public void test() {
myprotected=0;
}
}
-
类的对象
package TestA;
public class Base1 {
protected int myprotected;
}
package TestA;
public class object2 {
public void test() {
Base1 base1=new Base1();
base1.myprotected=0;
//包可见,对象所在类与对象所属类同包
}
}
package Object;
import TestA.Base1;
public class object {
public static void main() {
//对于对象来说:
Base1 base1=new Base1();
//base1.protected 对于对象来说,必须是同包;报错!
}
}
public:
-
类
package TestA;
public class Base1 {
public int myint;
}
package TestB;
public class Base2 extends Base1 {
//不同包、继承
public void test() {
myint=0;//能够访问public
}
}
-
类的对象
package TestA;
public class Base1 {
public int myint;
}
package Object;
import TestA.Base1;
public class object {
public static void main() {
//对于对象来说:
Base1 base1=new Base1();
base1.myint=0;//类的对象始终可以访问public
}
}
总结:
private只能在本类的作用域中被访问,public在所有类树中都可访问。default在继承时,子类需与父类同包才能访问;protected在继承时,将限制要求放松,只要是子类就能访问。
当实例化对象时,通过对象.成员这种方式,private无法访问,public任意访问;default和protected所在类被实例化为对象时,对象所在类需要与对象所属类同包,如此才能访问default和protected成员。
继承时如果要访问父类default成员,继承类需要与父类同包;
继承时如果要访问父类protected成员,继承类无需与父类同包,这是由于protected赋予了更宽松的限制。
综上,使用对象要想访问default和protected,都需要对象所在类与对象所属类同包。