为什么我可以在测试中访问受保护的方法?

时间:2014-11-12 18:34:34

标签: java

我们说我有一个这样的课程:

public class ClassA
{
    [...]

    protected void methodIWantToTest()
    {
        [...]
    }

    [...]
}

当我在IntelliJ Idea 13中编写单元测试时,当我写下这样的内容时,我不会遇到编译器错误:

public class ClassATest
{
    @Test
    public void test()
    {
        final ClassA objectUnderTest = new ClassA();

        objectUnderTest.methodIWantToTest(); // Why can I access a protected method here?
    }
}

methodIWantToTest受到保护。为什么我可以在测试中访问它?

3 个答案:

答案 0 :(得分:12)

因为这些类在同一个包中(即使是不同的文件夹)。同一个包中的类以及子类可以访问受保护的方法。

答案 1 :(得分:4)

这不是一个单一的奇怪或与ide有关。只有protected执行protected所做的事情,当你在同一个包中有这些类时(可能你必须这样做)。

Access Levels
Modifier    Class   Package Subclass World
public      Y       Y       Y        Y
protected   Y       Y       Y        N
no modifier Y       Y       N        N
private     Y       N       N        N

https://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html

这与protected的其他语言定义不同,例如c#,例如protected仅表示类及其子类型。

答案 2 :(得分:0)

受保护的访问修饰符: 在超类中声明受保护的变量,方法和构造函数只能由其他包中的子类或受保护成员的包中的任何类访问。类。

受保护的访问修饰符无法应用于类和接口。方法,字段可以声明为protected,但是接口中的方法和字段不能声明为protected。

受保护的访问权使子类有机会使用辅助方法或变量,同时防止非相关类尝试使用它。