Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
不允许通过不同包的子类中的对象访问JAVA保护变量_Java - Fatal编程技术网

不允许通过不同包的子类中的对象访问JAVA保护变量

不允许通过不同包的子类中的对象访问JAVA保护变量,java,Java,给定两个文件: package pkgA; public class Foo { int a = 5; protected int b = 6; } 结果如何?(选择所有适用的选项。) A.5.6 B.5.6后接例外情况 C.编译失败,第6行出现错误 D.编译失败,第7行出现错误 E.编译失败,第8行出现错误 F.编译失败,第9行出现错误 参考:SCJP 1.6 Kathy_Sierra: 根据书,答案是C、D、E 为什么不使用“F”? 有人能解释一下吗?我想第9行应该是这一行: Syste

给定两个文件:

package pkgA;
public class Foo {
int a = 5;
protected int b = 6;
}

结果如何?(选择所有适用的选项。)

A.5.6
B.5.6后接例外情况
C.编译失败,第6行出现错误
D.编译失败,第7行出现错误
E.编译失败,第8行出现错误
F.编译失败,第9行出现错误

参考:SCJP 1.6 Kathy_Sierra: 根据书,答案是C、D、E

为什么不使用“F”?
有人能解释一下吗?我想第9行应该是这一行:

System.out.println(" " + new Fiz().b);

子类可以访问受保护的变量
Fiz
Foo
的子类,因此它可以访问
b
。它可以在静态上下文中执行此操作。

protected
在Java中有点有趣。虽然我们总是说“protected”允许访问不同包的子类,但这并不是全部

例如,如果您有
子级
扩展
父级
,并且在
父级
中有一个受保护的成员。在
Child
中,您可以访问
Child
的受保护成员,而不是
Parent
的受保护成员。听起来有点奇怪,对吧,虽然它们听起来是一样的

引用自核心Java第9版:

但是,管理器类方法可以窥视hireDay字段内部 仅适用于经理对象,不适用于其他员工对象。这 设置了限制,这样您就不会滥用受保护的机制 形成子类只是为了访问受保护的字段

(class
Manager
扩展
Employee
,并且
Employee
中有一名
hireDay
受保护的成员)

比如说,

public class Manager extends Employee {
    // accessing protected member of itself
    public void foo1() {   
        System.out.println("" + this.hireDay);  // OK
    }

    // access protected member of instance of same type
    public void foo2(Manager manager) {  
        System.out.println("" + manager.hireDay);  // OK
    }

    // access protected member of instance of super-class
    public void foo3(Employee employee) {
        System.out.println("" + employee.hireDay);  // NOT ALLOWED!
    }
}

将它复制到IDE并通过自己查看结果第9行:
公共类Fiz extends Foo{
是一行完全有效的代码,因此没有理由在那里出现编译错误(只要它位于文件中的正确位置,本例就是这样)我实际上认为这是一个很好的问题,大多数人在谈论Java中受保护的
时可能会忽略。指责OP没有在IDE中进行测试是不合理的,因为他没有问SCJP问题的正确答案是什么,他问的是“为什么不“F”,我认为这是一个有效的问题(虽然OP可以提供更多的背景信息,说明为什么他认为F也应该是答案的一部分)这并不能解释为什么
F.b
会失败。
public class Manager extends Employee {
    // accessing protected member of itself
    public void foo1() {   
        System.out.println("" + this.hireDay);  // OK
    }

    // access protected member of instance of same type
    public void foo2(Manager manager) {  
        System.out.println("" + manager.hireDay);  // OK
    }

    // access protected member of instance of super-class
    public void foo3(Employee employee) {
        System.out.println("" + employee.hireDay);  // NOT ALLOWED!
    }
}