Java:继承、实例变量和

Java:继承、实例变量和,java,inheritance,this,Java,Inheritance,This,我知道,这个是对当前正在执行的对象的引用。如果是这种情况,您能否解释以下代码的行为 public class Inherit { public static class ClassA { private String privateInstanceVar = "Private"; public void classAMethod() { System.out.println("In class: " + t

我知道,
这个
是对当前正在执行的对象的引用。如果是这种情况,您能否解释以下代码的行为

public class Inherit {

    public static class ClassA
    {
        private String privateInstanceVar = "Private";
        public void classAMethod()
        {
            System.out.println("In class: " + this.getClass().getName());
            System.out.println("Can access: " + this.privateInstanceVar);
        }
    }

    public static class ClassB extends ClassA
    {
    }

    public static void main(String[] args)
    {
        ClassB b = new ClassB();
        b.classAMethod();
        //Outputs:
        //In class: Inherit$ClassB
        //Can access: Private

        //System.out.println(b.privateInstanceVar); // Fails to compile
    }   
}
classAMethod
的第一行报告了
是对
ClassB
的引用。但是,在下一行中,我使用
this
访问
ClassA
的私有实例变量
privateInstanceVar
,我不应该访问该变量。(注释掉的
main
的最后一行表明情况确实如此。)

因此,我的问题是:

  • 如果
    this
    确实是对
    ClassB
    的引用,我如何从属于
    ClassB
    的方法访问
    ClassA
    上的私有实例变量
  • 执行时,
    classAMethod
    实际上是
    ClassA
    ClassB
    的成员吗
  • 如果答案是2。如果是,确定方法中任何给定行将在哪个上下文中执行的规则是什么
  • 如果答案是2。如果没有,那么对于代码的行为有什么其他解释呢
  • 这里是否有我无法欣赏的更大的图景或微妙之处
  • 如果这确实是对ClassB的引用,我如何访问私有 是否从属于ClassB的方法中获取ClassA上的实例变量

    因为您从classA继承了方法,并且该方法访问私有变量

    ClassMethod实际上是ClassA和ClassB的成员吗 处决

    如果答案是2。是的,什么是确定的规则 方法中的任何给定行将执行哪个上下文

    编译时上下文:将选择从正在编写的代码中可见的方法或字段。例如:

    public static class ClassA{
        private String foo = "bar";
        public String getFoo(){return foo;}
    }
    public static class ClassB extends ClassA{
        private String foo = "phleem";
    }
    
    newclassb().getFoo()
    将返回“bar”,而不是“freeem”,因为ClassA不知道ClassB

    如果这确实是对ClassB的引用,我如何访问私有 是否从属于ClassB的方法中获取ClassA上的实例变量

    因为您从classA继承了方法,并且该方法访问私有变量

    ClassMethod实际上是ClassA和ClassB的成员吗 处决

    如果答案是2。是的,什么是确定的规则 方法中的任何给定行将执行哪个上下文

    编译时上下文:将选择从正在编写的代码中可见的方法或字段。例如:

    public static class ClassA{
        private String foo = "bar";
        public String getFoo(){return foo;}
    }
    public static class ClassB extends ClassA{
        private String foo = "phleem";
    }
    

    new ClassB().getFoo()
    将返回“bar”,而不是“freeem”,因为ClassA不知道ClassB的情况。

    我不确定您困惑的根源是什么。它的工作原理完全符合人们的预期:

    子类不继承其父类的私有成员。但是,如果超类具有访问其私有字段的公共或受保护方法,则子类也可以使用这些方法


    我不确定你困惑的根源是什么。它的工作原理完全符合人们的预期:

    子类不继承其父类的私有成员。但是,如果超类具有访问其私有字段的公共或受保护方法,则子类也可以使用这些方法

  • 是,
    引用ClassB实例,它也是一个
    ClassA
    实例。方法
    classAMethod
    ClassA
    中定义,因此可以访问所有
    ClassA
    的私有成员
  • 是的,
    classAMethod
    ClassA
    的一种方法,由
    ClassB
  • 一行在定义该行的类的上下文中执行
  • 不适用
  • 是,
    引用ClassB实例,它也是一个
    ClassA
    实例。方法
    classAMethod
    ClassA
    中定义,因此可以访问所有
    ClassA
    的私有成员
  • 是的,
    classAMethod
    ClassA
    的一种方法,由
    ClassB
  • 一行在定义该行的类的上下文中执行
  • 不适用
  • 1) 因为ClassB继承自ClassA,所以ClassA的所有公共、受保护的方法对ClassB实例都是可见的

    2) 对

    3) 除非重写ClassB中的ClassMethod,否则ClassB将只执行CLassA.ClassMethod()

    5) 这是Java中继承的正常工作方式

    1)因为ClassB继承自ClassA,所以ClassA的所有公共、受保护的方法对ClassB实例都是可见的

    2) 对

    3) 除非重写ClassB中的ClassMethod,否则ClassB将只执行CLassA.ClassMethod()


    5) 这是Java中继承的正常工作方式

    ClassB
    有权访问
    classAMethod()
    ,但无权访问
    privateInstanceVar
    。因此,如果您试图重写
    classAMethod()
    或者甚至定义一些其他方法来尝试访问
    privateInstanceVar
    ,您将得到一个错误。为此,必须声明变量受保护。

    ClassB
    有权访问
    classAMethod()
    ,但它无权访问
    privateInstanceVar
    。因此,如果您试图重写
    classAMethod()
    或者甚至定义一些其他方法来尝试访问
    privateInstanceVar
    ,您将得到一个错误。要做到这一点,必须将变量声明为受保护。

    classAMethod属于类A。如果在类B中重写此方法,“privateInstanceVar”将不再可用于此方法。classAMethod属于类A。如果在类B中重写此方法,“privateInstanceVar”无法再访问此方法。谢谢Brian。这就是我的观点——我不应该访问