【学习串讲】java中protected方法的可见性规则

平时对java中protected方法的可见性理解有偏差,通过这次实验,对其可见性规则进行一次记录,以便温故。

Java中protected方法可见性解释

protected的方法权限,一般说法如下:

  1. 基类的protected成员是包内可见的,并且对子类可见。
  2. 若子类与基类不在同一包中,那么在子类中,子类实例可以访问其从基类继承而来的protected方法,而不能访问基类实例的protected方法。

我们对如上规则,进行实验,将创建2个包,将父类放入包1中,然后在两个包中分别创建其子类,并且在2个包中验证其实例是否有访问protected方法的权限。

实验

我们创建包1package com.kiramario.protectedActionScope_1,包2package com.kiramario.protectedActionScope_2。在包1中创建基类Father,子类1Son1,在包2创建子类2Son2

包1:

package com.kiramario.protectedActionScope_1;

public class Father {
	
	protected void parent_method() {
		System.out.println("parent_method");
	}
}
package com.kiramario.protectedActionScope_1;

public class Son1 extends Father{
	public void inner() {
		parent_method(); //在子类1中,可以顺利调用到基类的protected方法
	}
}

包2:

package com.kiramario.protectedActionScope_2;

import com.kiramario.protectedActionScope_1.Father;

public class Son2 extends Father {
	public void inner() {
		parent_method(); //在子类2中,可以顺利调用到基类的protected方法
	}
}

在包1中进行实例调用:

package com.kiramario.protectedActionScope_1;

import com.kiramario.protectedActionScope_2.Son2;

public class Scope_1_Test {

	public static void main(String[] args) {
		Son1 son1 = new Son1();
		son1.parent_method();	//子类1实例可以方法protected方法
		
		Father f = new Father();
		f.parent_method();	//基类实例可以方法protected方法
		
		Son2 son2 = new Son2();
		son2.parent_method();	//子类2实例可以方法protected方法
	}
}

在包2中进行实例调用:

package com.kiramario.protectedActionScope_2;

import com.kiramario.protectedActionScope_1.Father;
import com.kiramario.protectedActionScope_1.Son1;

public class Scope_2_Test {

	public static void main(String[] args) {
		Son2 son2 = new Son2();
		son2.parent_method();	// 编译Error,子类2实例不可以方法protected方法
		
		Son1 son1 = new Son1();
		son1.parent_method();	// 编译Error,子类1实例不可以方法protected方法
		
		Father f = new Father();
		f.parent_method();	// 编译Error,基类实例不可以方法protected方法
	}
}

结论

通过上述实验,我们知道,方法的调用可以在类内部实现,也可以通过类的实例进行调用,但是对于基类的protected方法,其可见性如下。

  1. 类内部调用的可见性:

    包1(基类所在)包2
    子类可见可见
  2. 实例调用的可见性:

    包1(基类所在)包2
    基类实例可见不可见
    子类1实例可见不可见
    子类2实例可见不可见

最后手画一张图:
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值