Java 如何使用构造函数中实例化的超级(变量)?

Java 如何使用构造函数中实例化的超级(变量)?,java,super,Java,Super,stackoverflow的人们好 我不完全确定我的问题是否多余。但是,在构造函数中使用super()实例化变量之后,您将如何在同一类的另一个方法中使用super(variable)。我在某个地方读到,如果在父类中使用“protected”,您应该能够访问它,但是我希望避免这样做 例如: public class test extends trial{ public test (trial variable){ super(variable); } pu

stackoverflow的人们好

我不完全确定我的问题是否多余。但是,在构造函数中使用super()实例化变量之后,您将如何在同一类的另一个方法中使用super(variable)。我在某个地方读到,如果在父类中使用“protected”,您应该能够访问它,但是我希望避免这样做

例如:

public class test extends trial{
    public test (trial variable){
        super(variable);
    }

    public double testMethod(){
    return [super(variable)]; //This is where the super(variable) is going
    }
}

我认为它的轨迹有点像:

public class Trial {
   private final Trial variable;
   public Trail(Trial variable) {
      this.variable = variable;
   }
}
如果是这种情况,
Test
无法访问
super.variable
,而不将
变量
的值更改为protected(或更高)或具有
变量
的protected(或更高)getter。除此之外没有其他办法(1)

在构造函数中使用super()实例化变量后

您不是(直接)实例化变量,而是在
Trial
上调用构造函数。然后,
Trial
中的构造函数正在实例化变量


1) 你可以用邪恶的哈科里来解决这个问题。然而,这样做在99%的情况下都是错误的。

我认为Trail看起来有点像:

public class Trial {
   private final Trial variable;
   public Trail(Trial variable) {
      this.variable = variable;
   }
}
如果是这种情况,
Test
无法访问
super.variable
,而不将
变量
的值更改为protected(或更高)或具有
变量
的protected(或更高)getter。除此之外没有其他办法(1)

在构造函数中使用super()实例化变量后

您不是(直接)实例化变量,而是在
Trial
上调用构造函数。然后,
Trial
中的构造函数正在实例化变量


1) 你可以用邪恶的哈科里来解决这个问题。但是,在99%的情况下这样做是错误的。

您所做的不是初始化变量,而是调用父构造函数,即trial的构造函数。 如果超级变量是受保护的或公共的,则可以直接从子类访问它们。 比如说

public class A{
public int foo;
protected int foo2;
private int foo3;
}

public class B extends A{
public void someMethod()
{
foo=1;
foo2=3;
//foo3 cant be accessed because it is private. only and only class A can
//access it.

}
}

您所做的不是初始化变量,而是调用父构造函数,即试用的构造函数。 如果超级变量是受保护的或公共的,则可以直接从子类访问它们。 比如说

public class A{
public int foo;
protected int foo2;
private int foo3;
}

public class B extends A{
public void someMethod()
{
foo=1;
foo2=3;
//foo3 cant be accessed because it is private. only and only class A can
//access it.

}
}

如果您的超类没有将接收到的内容作为构造函数参数公开并传递给超类构造函数,那么您可以让子类自己引用它:

public class Test extends Trial {
    private Trial variable;
    public Test(Trial variable) {
        super(variable);
        this.variable = variable;
    }

    public void testMethod() {
        this.variable.doWhatever();
    }
}

如果您的超类没有将接收到的内容作为构造函数参数公开并传递给超类构造函数,那么您可以让子类自己引用它:

public class Test extends Trial {
    private Trial variable;
    public Test(Trial variable) {
        super(variable);
        this.variable = variable;
    }

    public void testMethod() {
        this.variable.doWhatever();
    }
}

super(变量)只需调用父构造函数,没有什么比“使用super()实例化变量”更重要的了。如果要在子类中访问父类的属性,必须将它们定义为受保护(或公共)。或者只需在父类
试用版
中使用公共/受保护
getter
。您在这里试图实现什么?如果您想要一个新的
测试
,您应该说
returnnewtest(variable)
。如果您想要一个
trial
的实例,请使用
return new-trial(variable)
@Idos这不是一个特定的示例,因为我没有使用任何实类型的代码,但在另一个设置中,当我不使用super(variable)时它会这样做。@Holt我看到了,我看到了是否有其他方法访问父属性。感谢
super(变量)只需调用父构造函数,没有什么比“使用super()实例化变量”更重要的了。如果要在子类中访问父类的属性,必须将它们定义为受保护(或公共)。或者只需在父类
试用版
中使用公共/受保护
getter
。您在这里试图实现什么?如果您想要一个新的
测试
,您应该说
returnnewtest(variable)
。如果您想要一个
trial
的实例,请使用
return new-trial(variable)
@Idos这不是一个特定的示例,因为我没有使用任何实类型的代码,但在另一个设置中,当我不使用super(variable)时它会这样做。@Holt我看到了,我看到了是否有其他方法访问父属性。谢谢你和mlk的解释帮助很大。我想这和你们说的差不多,但我只有30%的把握。如果我能选择两个答案,那就是你们两个,因为你们直接展示了一种可能的方式,但mlk非常详细,这对我帮助很大。你们和mlk的解释帮助很大。我想这和你们说的差不多,但我只有30%的把握。如果我能选择两个答案,那就是你们两个,因为你们直接展示了一种可能的方式,但mlk非常详细,这对我帮助很大。现在这对我来说更有意义。正如我在回答马修·休斯时所说的,我认为这可能是类似的事情,但只有30%的把握。这对我来说现在更有意义了。正如我在回答马修·休斯时所说的,我曾认为这可能是类似的事情,但只有30%的把握。