0. 访问控制权限1
在考虑一个字段/方法是否能被访问时,需要考虑:1.在哪个类中2.使用哪个对象3.访问哪个字段/方法,个人觉得这样比较好理解。
1. private
私有的,被private修饰的字段和方法只能在本类中被本类的对象访问,即便是子类也不能访问超类中的private字段和方法。private一般用来保证封装性,很多时候最好将字段都设置成private的,以防止对字段的任意修改,同时提供一个public的访问器方法和修改器方法来对外提供一个访问该字段的接口(如果需要的话)。private不能用来修饰类。
2.default
当不使用任何访问控制的修饰符时,访问权限就默认为default,表示对本包可见,即在本包中可以被本类的对象访问。这一特性可以用在字段、方法和类上。
package AccessControlStudy;
class DefaultClass{
String str2 = "Default";
}
public class DefaultTest {
String str = "default";
public static void main(String[] args){
DefaultTest defaultTest = new DefaultTest();
System.out.println(defaultTest.str);
}
}
在AccessControlStudy的包中声明了一个访问权限为默认的类DefaultClass,并声明了一个访问权限为默认的字段str2。
package AccessControlStudy;
public class DefaultTest2 {
public static void main(String[] args){
DefaultTest defaultTest = new DefaultTest();
DefaultClass defaultClass = new DefaultClass();
System.out.println(defaultTest.str);
System.out.println(defaultClass.str2);
}
}
在同一个包的其它类中可以创建这个DefaultClass的对象,并且可以访问它的str2字段,也可以访问DefaultTest的str字段。说明了访问控制权限为default时,对本包可见。
同时,尝试在其它包中创建DefaultClass的对象,但是报错,因为DefaultClass类是Default的。可以在其他包的类中创建DefaultTest的对象,因为它是public的,但是,不能访问它的default字段str:
如上图,报错str is not public.Cannot be accessed from outside package,说明了访问权限为default的字段(以及方法)不能在其他包中被访问。
因此可以看到,不加任何修饰符的情况下,默认仅本包可见
3. protected
可以把protected理解为default的拓展,被protected修饰的字段和方法(注意:protected不能修饰类)可以在本包中被本类的对象访问,这是与default相同的地方。同时,protected修饰符还拓展了另一方面:对所有子类可见。
这意味着如果一个类A是类B的子类,那么类B中所有被protected修饰的字段和方法都可以在类A中被访问。即在子类中被子类的对象访问。
考虑下面的代码:
先在一个包中定义一个ProtectedTest类
package AccessControlStudy;
public class ProtectedTest {
protected String str3 = "protected";
}
再在另一包中进行访问:
package TempTest;
import AccessControlStudy.ProtectedTest;
public class ProtectedTest2 extends ProtectedTest {
public static void main(String[] args){
ProtectedTest protectedTest = new ProtectedTest();
//本行报错:protectedTest.str3 = "";
/*
首先,不符合在本包中被本类的对象的访问,不在本包中
其次,不符合在子类中被子类的对象访问,使用的是父类对象而不是子类对象。因此,本行报错。
*/
ProtectedTest2 protectedTest2 = new ProtectedTest2();
protectedTest2.str3 = "successfully access";
/*
符合在子类中被子类的对象访问。
*/
}
}
再考虑另一种情形:
package FinalStudy;
public class FinalKeyWords {
public static void main(String[] args){
ProtectedTest2 protectedTest2 = new ProtectedTest2();
//本行报错:protectedTest2.str3 = "";
/*
首先,不符合在本包中被本类的对象的访问,不在本包中
其次,不符合在子类中被子类的对象访问,不在子类中而在另一个类中。
*/
}
}
看起来很奇怪的是,protected修饰符字面意思是受保护的,但是它的限制比默认情况下还要宽松。。。
protected不能用来修饰类。
4. public
被public修饰的字段或方法可以在任意位置被本类的对象或者子类的对象访问,和default一样,public可以用来修饰类,表明这个类对所有类可见。
文章内容参考自《Java核心技术》,网络以及自己的思考,主要作为自己整理的笔记使用。理解上表达上可能存在错误,欢迎指正。 ↩︎