JAVA中成员的访问权限

一、四种成员访问权限

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也无法直接访问.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值