保护和默认成员(protected)
1、保护和默认访问控制级别几乎完全相同,但只有一点主要区别,只有当访问默认成员的类属于同一个包时,才能访问默认成员。而对于protected类成员而言,只要继承了父类,即使子类位于不同的包中,该子类也能访问它。而默认则不同,如果在不同的包中就无法访问。
例如:
package parent;
public class Parent{
protected int x = 10;
}
package child;
class Child extends Parent{
public void testIt(){
System.out.println("x is:" + x);
}
}
这个Child类通过继承访问这个保护变量,无论何时当子类访问父类成员时,都是在谈论子类继承成员,而不是通过父类的引用访问该成员。
如果把上面的代码改成
Parent p = new Parent();
System.out.println(p.x);
这样将会报错
包外子类能继承保护成员,并且包外子类不能使用父类引用访问保护成员,对于包外子类,只能通过继承来访问保护成员。
2、倘若包外子类,例如刚刚的Child类,如果和Child类在同一个包下有一个Child2类,那么如果该Child2类有Child类的引用,并且访问变量x,那么此时将会报错。因为子类一旦继承了保护成员,该保护成员对这一子类的任何代码都便成为了私有的了。那么即使Child2与Child在同一个包下,Child2也不能访问该继承的变量。
3、private public protected这样的访问修饰符是用来修饰成员变量的而不能修饰局部变量,事实上只有一个修饰符final能用来修饰局部变量。
class Foo{
void doSomething(){
private int x = 7;
this.otherMethod(x);//这样是错误的
}
}