一、四种成员访问权限
public: 公有访问权限,在任何地方都可以访问它
protected:针对继承的访问控制,任何地方的子类可以访问父类的它,同时,包内的任何地方都可以访问它
默认:包内任何地方可以访问它
private:只能在本类中访问它,但是子类不能访问它。
二、怎样使用相应的访问权限
尽量把成员变量的访问权限定义成私有(private),然后提供公有(public)的成员方法来访问这些成员变量。
如果类中成员仅限于在该类自己的方法中使用,则声明为private;
如果类中成员允许在子类的方法继承到,则声明为protected;
如果类中成员允许在子类的方法被调用,则必须声明为public;
如果类中成员在任何地方的方法中都可以被访问,则声明为public;
如果类中成员只允许在本包中的类的方法中使用,则声明为缺省(默认)的权限。
三、随处可见的记忆表
四、随处可见的例子
四个java文件的存放结构:
对应的文件代码:
SuperClass.java:
package package1;//声明当前的java文件存放在package1中
public class SuperClass {
static int i; //"同包内"的所有类中可见
protected int j;
protected static int j1;
private static int k; //只有本类内可见
public static int m; //任何地方都可见
}
SubClass1.java
package package1;
public class SubClass1 extends SuperClass {//继承SuperClass
void limit(){
SuperClass.i++; //i在本包内可访问,super代表父类对象
SuperClass.j1--; //j在本包或子类中可访问
//SuperClass.k++; //SuperClass的私有成员在另一个类中不能访问
SuperClass.m--; //公有权限,任何地方都可访问
}
}
变量i、j、j1、k、m均是在父类SuperClass中定义的成员变量.
package1中,由于父类的静态成员变量i是默认权限,故在同一包内的子类中,可以直接用类名.静态成员变量名的方式直接访问.
j1的权限是protected,在同一包中,故也可以直接访问.
由于父类中的k是私有成员变量,只允许在父类里面直接访问,故不可在子类中直接访问.
变量m是公用权限,所以在任何地方都可以访问.
变量j拥有protected权限,同包中可以访问(只不过在SubClass1.java中没有写出来),但此处要注意访问方式,由于j是实例成员变量,不能直接用类名.静态成员变量名直接调用,可以用super.j实现访问
SubClass2.java
package package2;
import package1.*;
public class SubClass2 extends SuperClass{
void limit(){
//SuperClass.i++; //i在本包内可访问,现在是在另一个包中访问,所以不行
j++; //父类实例成员j,可以继承
super.j++; //父类实例成员j,用super可以调用
SuperClass.j1--; //父类static成员j1,用类名可以调用
j1++; //父类static成员j1,可以继承
//SuperClass.k++; //SuperClass的私有成员只能在本类访问
SuperClass.m--; //公有权限,任何地方都可访问
}
public static void main(String[] args){
SuperClass sup=new SuperClass();
//System.out.println(sup.j++);
//父类"实例"成员j,用对象不可以调用
//sup.limit();
//子类"实例"成员limit(),用对象不可以调用
System.out.println(sup.j1++);
//父类static成员j1,用对象却可调用
}
}
//未指定:不同包之间不可访问
//私有:只能在本类中访问
//protected:实例成员不可在子类中调用,static成员却可以
//public:那都能用
这次的子类SubClass2所在的包与父类的不同,查询上面的表可知,拥有默认权限的变量i在子类中也无法访问.
在main方法中,由于main方法是静态的,在静态方法中不能直接引用实例变量和方法,所以语句System.out.println(sup.j++);与sup.limit(); 在子类SubClass2的main方法中不可用.
AnotherClass.java
package package2;
import package1.*;
public class AnotherClass {
void limit(){
//SuperClass.i++;
//i在本包内可访问,现在是在另一个包中访问,所以不行
//SuperClass.j--;
//j在本包或子类中可访问,现在是在外包,而且也不是子类
//SuperClass.k++;
//SuperClass的私有成员只能在本类访问
SuperClass.m--; //公有权限,任何地方都可访问
}
}
AnotherClass 这个类与以上三个类之间没有继承关系,则查表可知,拥有protected权限的变量j也无法直接访问.