java保护为什么通过非继承工作?
我显然忽略了这一点,但考虑到:java保护为什么通过非继承工作?,java,protected,Java,Protected,我显然忽略了这一点,但考虑到: package a; public class Class1 { protected int a=1; } package b; import a.*; public class Class2 extends Class1 { Class2() { Class1 c1=new Class1(); Class2 c2=new Class2(); System.out.println(a);
package a;
public class Class1 {
protected int a=1;
}
package b;
import a.*;
public class Class2 extends Class1 {
Class2() {
Class1 c1=new Class1();
Class2 c2=new Class2();
System.out.println(a); //1
System.out.println(c1.a); //2
System.out.println(c2.a); //3
}
}
我知道//1可以通过继承使用,而//2失败是因为它不能通过继承访问,但是为什么//3也可以呢?我以为变量a是通过一个新对象访问的,而a驻留在Class1中
谢谢。由于
Class2
的任何对象都是-aClass1
,它可以访问Class1
的所有成员变量,其作用域为默认值,受保护和公共
此外,试图通过处理属于您用来处理作用域/继承的类的对象来理解作用域和继承规则不是一个好主意,因为它的工作方式与通过第三方(这是最常见的用法)不同
例如,这是允许的:
public class Something {
private int something;
public int stealSomething(final Something otherthing) {
return otherthing.something;
}
}
尝试创建第三个类,它不在您用于测试的类的层次结构中。由于Class2
的任何对象都是-aClass1
,因此它可以访问Class1
的所有成员变量,其作用域为default
,protected
和public
此外,试图通过处理属于您用来处理作用域/继承的类的对象来理解作用域和继承规则不是一个好主意,因为它的工作方式与通过第三方(这是最常见的用法)不同
例如,这是允许的:
public class Something {
private int something;
public int stealSomething(final Something otherthing) {
return otherthing.something;
}
}
尝试创建第三个类,它不在您用于测试的类的层次结构中。我不理解这个问题
Class1有一个名为“a”的变量。因为它是“受保护的”,所以该变量在Class1的任何对象和扩展Class1的类的任何对象中都是可见的
如果“a”是私有的,那么它在扩展Class1的类的对象中就不会以这种方式可见。我不理解这个问题
Class1有一个名为“a”的变量。因为它是“受保护的”,所以该变量在Class1的任何对象和扩展Class1的类的任何对象中都是可见的
如果“a”是私有的,那么它在扩展Class1的类的对象中就不会以这种方式可见
为什么//3也可以
为什么不可以呢?鉴于Class2
是Class1
的子类,因此可以通过Class2
的实例访问Class1
的protected
字段。这就是你在这里所做的c2
是Class2
的一个实例,并且a
字段对其可见
注意:任何直接子类都可以访问受保护的成员,无论是在同一个包中还是在不同的包中
我以为变量a是通过一个新对象访问的
没错
a在一班吗
这在这里真的不重要。只要Class2
实例可以访问a
,它就是有效的
仅供参考,您的代码将死于StackOverflowerError
。你需要照顾它
为什么//3也可以
为什么不可以呢?鉴于Class2
是Class1
的子类,因此可以通过Class2
的实例访问Class1
的protected
字段。这就是你在这里所做的c2
是Class2
的一个实例,并且a
字段对其可见
注意:任何直接子类都可以访问受保护的成员,无论是在同一个包中还是在不同的包中
我以为变量a是通过一个新对象访问的
没错
a在一班吗
这在这里真的不重要。只要Class2
实例可以访问a
,它就是有效的
仅供参考,您的代码将死于StackOverflowerError
。您需要处理它。当您在其类中操作对象时,您可以完全访问该对象的所有属性,包括私有属性。由于c2
是Class2
的一个实例,并且您在Class2
代码中操作它,您可以看到受保护的属性。当您在其类中操作对象时,您可以完全访问其所有属性,包括私有属性。由于c2
是Class2
的一个实例,并且您正在Class2
代码中操作它,因此您可以看到受保护的属性。与实际问题无关,但是调用此构造函数将导致StackOverflower
错误。是的,谢谢。我把它放在main中,然后取出它以节省代码行数,并允许我放入与实际问题无关的第//1:)行,但调用此构造函数将导致出现堆栈溢出错误。
。是的,谢谢。我把它放在main中,然后取出它以节省代码行数,并允许我放入第//1:)行干杯。我认为这是因为在创建子类和观察错误时通常使用基类作为引用类型。我认为这是因为在创建子类和观察错误时通常使用基类作为引用类型。是的,谢谢。我把它放在main中,然后取出它以节省代码行数,并允许我放在第//1:)行中。这只是测试代码,不是真正的代码code@Neil. 好啊那就好了。是的,谢谢。我把它放在main中,然后取出它以节省代码行数,并允许我放在第//1:)行中。这只是测试代码,不是真正的代码code@Neil. 好啊那就好了,谢谢。因此,假设没有数据隐藏类2继承所有类1,那么“a”作为受保护的成员有效地成为类2的一部分。包括私有成员。
->抱歉???@RohitJain,如果您有一个名为Test
的类,并且您有一个属性d