Java protected

Ⅰ权限

关于java类中的成员访问权限:

  • default:仅本类和同一个 package 中的类可以访问
  • public:都可以访问
  • private:仅本类可以访问
  • protected:仅本类,派生类及同一个 package 中的类可以访问

Ⅱ 测试

首先给出一个 base 类,这个类包含于 test1 这个包中:

package test1;

// this is the base class for protected member of both variable and function testing

public class TestProtectedBase {
	
	protected int _protected_member = 0;
	
	
	protected int getProtectedMember() {
		return this._protected_member;
	}

}

可以看到这个类中包含了一个受保护的成员变量以及一个返回这个变量的受保护的成员函数。

① 同一个包内的访问

显然,此时不管是不是这个 base 类的派生类,包含在 test1 中的任意一个类中的函数都可以访问成员变量或者是函数:

public class SamePackageProtectedTest {
	
	public static void main(String args[]) {
		
		// test 1
		// 在同一个包中的类中访问变量
		TestProtectedBase base = new TestProtectedBase();
		System.out.println(base._protected_member);
		System.out.println(base.getProtectedMember());
		
	}
}

如下图:

图 1 无报错

② 不同包内的访问

这个时候需要分两种情况:

  • 不同包中的非派生类对 test1.base 中的受保护成员的访问
  • 不同包中的派生类对 test1.base 中的受保护成员的访问

当此时该类为 base 的派生类时,可以进行访问:

package test2;

import test1.TestProtectedBase;

public class TestProtectedDerivedA extends TestProtectedBase{
	
	// test4
	// 不同包中的派生类内部可以访问
	protected void print() {
		System.out.println(super._protected_member);
	}
}

如下图:

图 2 不同包的派生类访问,无报错

当此时该类为非派生类时,即使在这个类中利用同样在 test2 包中的派生类 TestProtectedDerivedA 也不可以访问:

package test2;

import test1.TestProtectedBase;

public class DiffPackageProtectedTest {
	
	public static void main(String args[]) {
		
		
		// test2
		// 报错,不同包中的非派生类内部不可以访问
		TestProtectedBase base = new TestProtectedBase();
		System.out.println(base._protected_member);
		System.out.println(base.getProtectedMember());
		
		// test3
		// 报错,不同包中的非派生类内部利用同个包中的派生类也不可以访问
		TestProtectedDerivedA derivedA = new TestProtectedDerivedA();
		System.out.println(derivedA._protected_member);
		System.out.println(derivedA.getProtectedMember());
	}
}

如下图:

图 3 全部报错

可以看到,不管是在这个类中直接访问 test1.base 中的成员,还是利用 test2.TestProtectedDerivedA 进行访问,结果都不能通过编译,抛出该字段不可见的错误信息。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值