繁体   English   中英

Java:将对象扩展到另一个对象

[英]Java: extending an object to another

例如我有这个:

class A{
    private int mine = 0; //Some field...
    public A(int a){mine+=a; /*Some operation1...*/}
}


class B extends A{
    private int mine = 0; //Some field...
    public B(int a){mine-=a; /*Some operation2...*/}
}

我得到:

error: constructor A in class A cannot be applied to given types;
    public B(int a){}
    required: int
    found: no arguments
    reason: actual and formal argument lists differ in length
    1 errors

我不明白这个错误? 什么告诉我做什么?

但是,如果“A”的构造函数没有参数,则代码可以工作。
但我需要做Operation1(又名mine+=a; ),所以我需要A的参数,但后来我失败了。

我在这个神奇的圈子里关闭了。 我该怎么办?

每个构造函数的第一条指令总是调用它的一个超类构造函数。 如果您没有明确地执行此操作,编译器会为您插入此实例。 构造函数

 public B(int a) {
     mine-=a; 
     /*Some operation2...*/
 }

因此相当于

public B(int a) {
    super(); // invoke the no-arg super constructor
    mine-=a; 
    /*Some operation2...*/
}

由于A没有no-arg构造函数,因此编译失败。 在这种情况下,您必须明确地调用其中一个超级构造函数:

public B(int a) {
    super(a);
    mine-=a; 
    /*Some operation2...*/
}

每个构造函数都必须调用超类构造函数作为它的第一件事。 如果你没有通过super()显式地执行它,编译器将隐式调用超类中的no-arts构造函数。 但在你的情况下,超类没有no-args构造函数,此时编译器放弃了。

顺便说一下,在子类中重新声明一个字段通常是一个非常糟糕的主意,因为它会隐藏超类字段,但仍然会有两个字段。

我认为你需要从B构造函数中调用类A的构造函数,如下所示: super(a);

如果B扩展A,则B的构造函数的第一个操作是,调用A的构造函数。

如果A中没有显式定义构造函数,则调用标准构造函数。 如果不明确调用ctor,则会隐式调用它。

但是如果有一个明确的ctor,它接受参数,它就不会被自动调用 - 它应该如何 - 使用哪些参数? 你必须自己打电话。

但你的班级hierarchie有点神秘。 如果要在子类中访问我的,请将其保护或保持默认状态 - 不要将其设为私有。

如果将其设为私有,则具有相同名称的新引入属性会隐藏父属性,但这是错误的并且令人恼火。

在大多数情况下,可能通过方法(getter / setter)访问会更好,或者打开可见性。

或者子类中的东西的不同名称。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM