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
的任何对象都是-a
Class1
,它可以访问
Class1
的所有成员变量,其作用域为
默认值
受保护
公共

此外,试图通过处理属于您用来处理作用域/继承的类的对象来理解作用域和继承规则不是一个好主意,因为它的工作方式与通过第三方(这是最常见的用法)不同

例如,这是允许的:

public class Something {
   private int something;

   public int stealSomething(final Something otherthing) {
       return otherthing.something;
   }
} 

尝试创建第三个类,它不在您用于测试的类的层次结构中。

由于
Class2
的任何对象都是-a
Class1
,因此它可以访问
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