【学习串讲】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实例 可见 不可见

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

猜你喜欢

转载自blog.csdn.net/kiramario/article/details/123962826