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
的成员吗李>
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
5) 这是Java中继承的正常工作方式
ClassB
有权访问classAMethod()
,但无权访问privateInstanceVar
。因此,如果您试图重写classAMethod()
或者甚至定义一些其他方法来尝试访问privateInstanceVar
,您将得到一个错误。为此,必须声明变量受保护。ClassB
有权访问classAMethod()
,但它无权访问privateInstanceVar
。因此,如果您试图重写classAMethod()
或者甚至定义一些其他方法来尝试访问privateInstanceVar
,您将得到一个错误。要做到这一点,必须将变量声明为受保护。classAMethod属于类A。如果在类B中重写此方法,“privateInstanceVar”将不再可用于此方法。classAMethod属于类A。如果在类B中重写此方法,“privateInstanceVar”无法再访问此方法。谢谢Brian。这就是我的观点——我不应该访问