Java 我可以从位于超类中的私有字段的派生类调用super()吗?
我有两个类在不同的文件中Java 我可以从位于超类中的私有字段的派生类调用super()吗?,java,inheritance,Java,Inheritance,我有两个类在不同的文件中 public class A { private int _x; public A (int x) { _x = x; } public int getX() { return _x; } public int doubleX() { return 2 * getX(); } } public class B extends A { private int
public class A
{
private int _x;
public A (int x)
{
_x = x;
}
public int getX()
{
return _x;
}
public int doubleX()
{
return 2 * getX();
}
}
public class B extends A
{
private int _x;
public B(int xA, int xB)
{
super(xA);
_x = xB;
}
}
主方法在一个单独的文件中
public static void main(String[] args)
{
A a = new A(1);
A b = new B(2,22);
System.out.println(b.doubleX());
}
有相同的名字可以吗。这叫隐藏,对吗?
但是类B不能从a继承私有字段
在B的构造函数中调用super可以吗
我读过很多关于继承的文章和研究。
我只是想把事情弄清楚
这叫隐藏,对吗
不,A的x只对B隐藏,因为它在A中是私有的。它可以被保护或公开,因此B可以作为超级访问。因为你在B中用声明对它进行了跟踪,它不会改变任何东西
但是类B不能从a继承一个私有字段,它可以在B的构造函数中调用super吗
B看不到A中的私有x,因为它是私有的,但它确实继承了它。B也可以有自己的x private或其他类型,两者根本不冲突——B实例两者都有。记住,B是A
这可能有助于为您澄清一些事情:
public class Example {
public static final void main(String[] args) {
(new B(42, 67)).show();
}
static class A
{
private int x;
protected A(int arg) {
this.x = arg;
}
protected int getX() {
return this.x;
}
}
static class B extends A
{
private int x;
public B(int arg1, int arg2) {
super(arg1);
this.x = arg2;
}
public void show() {
System.out.println("this.getX() = " + this.getX() + ", this.x = " + this.x);
}
}
}
运行的输出是:
this.getX() = 42, this.x = 67
如您所见,该实例同时包含x个成员,A$x和B$x。注意:它们是否在不同的文件中一点也不重要。是的,这很好。有两个不同的_x字段,每个类一个,每个类只访问自己的一个。所有这些都不会影响从派生类调用父方法(包括super)的能力。这是将属性设置为私有的原因之一。在这种情况下,它有助于避免许多糟糕的混乱。我不知道你说的“还好吗”是什么意思。我想这取决于你想做什么。至少从编译器的角度来看,它没有错。@T.J.Crowder,this.getX和supergetX是一样的吗?还有。这是有效的吗?->超级的getX@idandi:this.getX与supergetX相同吗?不,supergetX将尝试调用超类的构造函数,并传递调用getX的结果。还有。这是有效的吗?->是的,这是有效的。这是在重写超类的方法时如何调用该超类的方法版本。不过,在上面的代码中不需要它,因为B不重写getX。