java的访问属性控制

java的访问属性控制,第1张

        同一包中                               不同包中
  同一类中  同一包中[的子类]     不同包中的子类       不同包中的非子类
public        √               √                 √                    √
protected        √               √                 √                    ×
default        √               √                 ×                    ×
private        √               ×                 ×                    ×

1、public

在自己类中可以随便调用;同一包下不同类中不用import,创建类对象后随便调用;不同包下import后创建类对象随便调用,无论是不是子类。

2、protected

区分于public:在不同包下的非子类不能调用。

 模板1) test包下的父类test2:

package test;
public class test2
{
	int number = 0;
	public test2(int number)
	{
		this.number = number;
	}
	protected void getNumber()
	{
		System.out.println(number);
	}
	public static void main(String[] args)
	{
		test2 test = new test2(1);
		test.getNumber();
	}
}

模板2) test3包下的test3子类,调用test2的protected方法(注意这里是通过其子类对象来间接调用,因为不同包下的父类和子类,不能直接通过父类对象去访问子类的非public成员):

package test3;
import test.test2;
public class test3 extends test2
{
    //继承构造函数带有参数需要重写构造函数,并在函数体中调用父类构造函数
	public test3(int number)
	{
		super(number);
	}
	public static void main(String[] args)
	{
		test3 t3 = new test3(1);
		t3.getNumber();
	}
}                                                                                                                                 

编译运行一下:

javac -d . test2.java
javac -d . test3.java
java test3.test3

 运行结果:

1

将模板2)中的test3改成非子类,调用test2的protected方法:

package test3;
import test.test2;//两个包在同一级可以这样调用
public class test3
{
	public static void main(String[] args)
	{
		test2 t2 = new test2(1);
		t2.getNumber();
		
	}
}                                                                                                                                 

编译报错:

错误: getNumber() 在 test2 中是 protected 访问控制
                t2.getNumber();

说明protected修饰的成员在不同包的非子类中不能调用。

3、default(默认)

区分于protected:在不同包下的子类不能调用。

把模板1)中的getNumber方法改为默认修饰符

package test;
public class test2
{
	int number = 0;
	public test2(int number)
	{
		this.number = number;
	}
	void getNumber()
	{
		System.out.println(number);
	}
	public static void main(String[] args)
	{
		test2 test = new test2(1);
		test.getNumber();
	}
}

模板2)不变 

编译一下:

javac -d . test2.java
javac -d . test3.java

在编译test3.java时报错:

 错误: 找不到符号
                t3.getNumber();

说明默认修饰的成员在不同包的子类中不能调用。

4、private

 只能在自己类中调用。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/724585.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-26
下一篇 2022-04-26

发表评论

登录后才能评论

评论列表(0条)

保存