Javaのコンストラクタとの継承 -- java フィールド と inheritance フィールド と constructor フィールド 関連 問題

Inheritance with constructor in Java












0
vote

問題

日本語

次のコードに問題を教えてください。

<事前> <コード> class boxdemo1 { public static void main(String args[]) { boxweight weightbox = new boxweight(2, 3, 5, 4); System.out.println(weightbox.volume()); } } class boxinfo { int l, b, h; /* * boxinfo() { l=b=h=-1; } */ boxinfo(int a, int b, int c) { l = a; this.b = b; h = c; } int volume() { return l * b * h; } } class boxweight extends boxinfo { int w; boxweight(int a, int b, int c, int w) { l = a; this.b = b; h = c; this.w = w; } }

コンパイル時には、次のエラーが表示されます。 "クラスBoxInfoのコンストラクタBoxInfoは与えられた型には適用できません。 必須:int、int、int。見つかった:引数なし。実際の引数リストと正式な引数リストは長さが異なります。 "

しかし、コメントされているコードを含めてコンパイルしたとき(すなわちboxinfo()コンストラクタ)、コンパイルされます。デフォルトコンストラクタを含める必要があるのはなぜですか?

英語

Can you please tell me the problem in following code?

class boxdemo1 {     public static void main(String args[]) {         boxweight weightbox = new boxweight(2, 3, 5, 4);         System.out.println(weightbox.volume());     } }  class boxinfo {     int l, b, h;      /*      * boxinfo() { l=b=h=-1; }      */     boxinfo(int a, int b, int c) {         l = a;         this.b = b;         h = c;     }      int volume() {         return l * b * h;     } }  class boxweight extends boxinfo {     int w;      boxweight(int a, int b, int c, int w) {         l = a;         this.b = b;         h = c;         this.w = w;     } } 

When I compile it,it shows following error: "constructor boxinfo in class boxinfo cannot be applied to given types; required:int,int,int; found:no arguments; actual and formal argument lists differ in length."

But when I compile it including the code which is commented(i.e. boxinfo() constructor), it gets compiled. Why is it necessary to include default constructor?

</div
        
     
     

回答リスト

0
 
vote
vote
ベストアンサー
 

boxinfo(int a, int b, int c) コンストラクタを設定すると、 boxinfo for boxinfo で設定されたデフォルトのNoパラメーター・コンストラクターが削除されます。次に、 boxweight(int a,int b,int c,int w) コンストラクターを呼び出すと、 boxweight classは boxinfo から継承しているため、暗黙的にからデフォルトのコンストラクタを呼び出します。 boxinfoを超えたばかりのコード>

これを回避するには、 boxinfo では、引数のないコンストラクターを作成するか、または明示的に super(a, b, c)

で作成します。
 

By setting your boxinfo(int a, int b, int c) constructor, the default no-parameters constructor set by java for boxinfo gets deleted. Then, when you call the boxweight(int a,int b,int c,int w) constructor, since the boxweight class inherits from boxinfo, you're implicitly calling the default constructor from boxinfo which just got overrided.

To avoid this, either create yourself a no-argument constructor in boxinfo or call explicitly super(a, b, c) in boxweight

</div
 
 
1
 
vote

これは、インスタンスのスーパークラス部分を作業するために必要なので、スーパーコンストラクタの呼び出しが必要です。

super() super() がない場合(<コード> super() で終わる this() )、コンパイラはデフォルトのコンストラクタ( super(); )。

パラメータなしコンストラクタはありませんので、このステートメントと一致するコンストラクターがないためコンパイルできません。

同じように、クラスがコンストラクターを定義しない場合は、デフォルトのコンストラクタは

のように実装されています <事前> <コード> public MyClass(){ super(); }

MyClass のスーパークラスが、 JLS

デフォルトのコンストラクタが暗黙的に宣言されている場合、スーパークラスに引数を取らず、スロー句がないアクセス可能なコンストラクタ(⁠6.6)がない場合は、コンパイル時エラーです。

問題を解決するには、正しいスーパーコンストラクタを呼び出したり、パラメーターなしでコンストラクタを定義したりしてください(デフォルトのコンストラクタと呼ばれない(デフォルトのコンストラクタと呼ばれず、コンパイラーで定義されているものだけがデフォルトのものです))。)

 

As this is necessary to build the super class part of the instance to get something working, the call of a super constructor is necessary.

If there is no statement calling super() in first statement of a constructor (or this() that would end up with a super()), the compiler will add a call to the default constructor (super();).

Since you don't have a constructor with no parameter, this can't compile as there is no constructor that match this statement.

In the same way, if a class don't define any constructor, a default constructor is implemented like

public MyClass(){ super(); } 

Giving the same kind of problem if the superclass of MyClass only provide a constructor with parameters like said in the JLS

It is a compile-time error if a default constructor is implicitly declared but the superclass does not have an accessible constructor (§6.6) that takes no arguments and has no throws clause.

To correct your problem, simply call the correct super constructor or define a constructor with no parameter (not called a default constructor anymore, only the one defined by the compiler is the default one ;) )

</div
 
 
1
 
vote

エラーの理由 -

子クラスコンストラクタは、親のコンストラクタを呼び出します。 4つのパラメータを取ります。

4をとる boxinfo クラスにコンストラクタはありません パラメータ

さらに

Javaコンパイラ super() コンストラクタを子クラスに自動的に挿入します。このスーパーコンストラクタの意味は GoとExecduteパラメータを取得しない親クラスのコンストラクタを実行します。

あなたのプログラムに従って:

<事前> <コード> boxinfo(int a, int b, int c) { l = a; this.b = b; h = c; }

親クラスのコンストラクタは3つのパラメータを取りますので、プログラムコンストラクタを削除するとデフォルトのコンストラクタを削除します。

<コード> boxweight Class Javaコンパイラにコンストラクタを追加しない場合は、デフォルトコンストラクタを自動的に挿入します。 4つのパラメータコンパイラを追加したので、4つのパラメータコンストラクタを確認します。コンストラクター内の別のクラス( 998877611 this()0 の他のクラス( 998877611 )が最初の行の最初の行で自動的に挿入されたときに言ったように。

このようなものです:

<事前> <コード> this()3

親クラスの既存のコンストラクターと一致するように、 this()4 を子クラスのコンストラクタに追加することができます。

あなたのQUSTIONの解決策、

子クラスのコンストラクタ(1行目)で 998877766615 を追加し、親クラスコンストラクターと一致する値を追加します。

これと同じように:

<事前> <コード> boxinfo16

今すぐこれらの割り当て<コード> 998876617 、<コード> this()8 、<コード> 998876619 、<コード> 9988876619 。 注: super()0 を追加すると、子クラスコンストラクターの最初の行でなければなりません。

 

Reason for the error-

Child class constructor calls the constructor of the parent which takes four parameters.

There is no constructor in the boxinfo class which takes four parameters.

Furthermore,

Java compiler automatically insert super() constructor to the child class. Meaning of this super constructor is Go and execdute a constructor in the parent class which takes no parameters.

According to your program:

boxinfo(int a, int b, int c) {         l = a;         this.b = b;         h = c;     } 

When you run your program compiler remove the default constructor because constructor in parent class takes three parameters.

If you do not add constructor for your boxweight class Java compiler automatically insert default constructor. Since you have added four parameters compiler will check for four parameter constructor . As I said before when you extends another class(boxinfo) in the constructor also Java compiler automatically insert the super() in the first line of constructor.

It's look like this:

class boxweight extends boxinfo{    boxweight (int a, int b, int c, int w){      super();      //.....    } } 

We can add super() to child class's constructor in a way that it matches an existing constructor in the parent class.

Solution for your qustion,

Add super() in constructor(first line) of child class and add values to match the parent class constructor.

Like this:

boxweight(int a, int b, int c, int w) {    super(a, b, c);    this.w = w; } 

Now you dont need these assign l = a;, this.b = b;, and h = c; because through the constructor you send it to the parent class.

Note: when you add super() must be the first line in child class constructor.

</div
 
 
0
 
vote

デフォルトのコンストラクタを過負荷にすると、デフォルトのものが存在しません。

例えば:

<事前> <コード> class boxweight extends boxinfo { boxweight(int a, int b, int c, int w) { ... } }

は実際には:

<事前> <コード> class boxweight extends boxinfo { boxweight(int a, int b, int c, int w) { super(); ... } }

しかし boxinfo のこのようなコンストラクタはもう存在しません。これにより、カスタムコンストラクタが作成されます。あなたはそれを呼び出すためにコードでそれを保つ必要があります。

 

It's necessary this when you overload the default constructor, the default one doesn't exist anymore.

eg:

class boxweight extends boxinfo {      boxweight(int a, int b, int c, int w) {          ...      } } 

is actually the same as :

class boxweight extends boxinfo {      boxweight(int a, int b, int c, int w) {          super();          ...      } } 

but in boxinfo such constructor doesn't exist anymore this you create a custom constructor. You need to keep it in code to make it callable.

</div
 
 
0
 
vote

サブクラスコンストラクタは、スーパークラスのコンストラクタの少なくとも1つを呼び出すことによって、スーパークラスメンバーを初期化する必要があります。

スーパークラスに例のようなデフォルトのコンストラクタがない場合は必須になります。

この場合、<コード> boxweight boxinfo が宣言する他のメンバーをintiriazeしなければなりません。そのため、 boxinfo を初期化するには、 super(...) を呼び出す必要があります。

だから、<コード> boxweight コンストラクタは次のようになります。

<事前> <コード> boxweight(int a, int b, int c, int w) { super(a,b,c); // put this call here and remove other lines. this.w = w; // this is sufficient }

PS:クラス、メソッド、およびその他のJavaアーティファクトに名前を付けるための命名規則に従うことをお勧めします。

http://www.oracle.com/technetwork/java/codeconventions. -135099.html

 

A subclass constructor must initialize it's super class members by calling at least one of the constructors of its super class.

This becomes mandatory if the superclass does not have a default constructor such as the one in your example.

In this case, Your boxweight constructor must initliaze the other members that boxinfo declares. So you must invoke super(...) to initialize boxinfo.

so, your boxweight constructor would become:

boxweight(int a, int b, int c, int w) {     super(a,b,c); // put this call here and remove other lines.     this.w = w; // this is sufficient } 

PS: I recommend that you follow naming conventions to name your classes, methods and other Java artifacts.

http://www.oracle.com/technetwork/java/codeconventions-135099.html

</div
 
 
       
       
-2
 
vote

サブクラスのオブジェクトを使用してクラスを拡張すると、サブクラスのコンストラクタはその親クラスのコンストラクタを呼び出します。あなたが以下のコンストラクタを使用していますあなたはデフォルトのコンストラクタを呼び出します。その場合は、宣言されたコンストラクターを親クラスで呼び出すことができます。

<事前> <コード> boxweight(int a, int b, int c, int w) { super(a, b, c); //or declared default constructor l = a; this.b = b; h = c; this.w = w; }
 

When you extend a class using inheritance and create object of subclass the constructor of subclass will call its parent class constructor.In your case you are using below constructor it will call default constructor.In your class you have not specify the default constructor.In that case you can use super to call the declared constructor in parent class.

boxweight(int a, int b, int c, int w) {        super(a, b, c); //or declared default constructor         l = a;         this.b = b;         h = c;         this.w = w;     } 
</div
 
 
 
 

関連する質問

23  Perlのベースコンストラクタを呼び出す  ( Calling base constructor in perl ) 
Perlのクラスコンストラクタからベースコンストラクタを呼び出す正しい方法は何ですか? 私はこのような構文を見ました: <事前> <コード> my $class = shift; my $a = shift; my $b = shift; my ...

1  C ++のクラスに配列を渡す方法  ( How to pass an array into a class in c ) 
クラスを作成すると、そのクラスに配列を保存できたいと思います。これは可能ですか? たとえば。マイメイン関数から配列を保存するためのアレイと呼ばれるクラスがある場合 <事前> <コード> int main() { double nums[3] = {1 ...

18  以下のコードはC ++でメモリリークを引き起こしますか  ( Will the below code cause memory leak in c ) 
<事前> <コード> class someclass {}; class base { int a; int *pint; someclass objsomeclass; someclass* psomeclass; publ...

1  C ++オブジェクトコンストラクターはConst参照コピーによるパスです  ( C object constructor pass by const reference copying ) 
Constリファレンスとして他のオブジェクトにオブジェクトを渡すと、コピーがありますか?参考にオブジェクトに渡されてから、メンバーオブジェクト自体が実際にはコピーではなく渡されたオブジェクトであるため、常に想定しました。参照オブジェクトの渡しを範囲の最後に破...

2  ヘルプw / codeigniter __construct()  ( Help w codeigniter construct ) 
ユーザーがログインしているかどうかを確認しています。ここでのクラスのすべての私の関数で利用できるいくつかの変数を設定したい場合は、これまでのコードです。 $ LOGGED_INまたは$ user_nameから、Viewの結果から未定義の変数になりますか?助けて...

3  親クラスのコンストラクタ(C ++)に基づくコンストラクタの自動作成  ( Automatic creation of constructor based on parent class constructor c ) 
これは私が仕事をしたいコードです: <事前> <コード> template <class A> class B : public A { public: // for a given constructor in A, create constructor...

11  「新規」を使用する代わりに、作成方法を作成するのはなぜですか?  ( Why have a create method instead of using new ) 
利点とは何ですか、静的コンストラクターを使用するのが適切ですか? <事前> <コード> public class MyClass { protected MyClass() { } public static MyClass ...

13  C ++コンストラクター:この仮想関数はなぜコールされないのですか?  ( C constructors why is this virtual function call not safe ) 
これはC ++ 11規格SEC 12.7.4からです。これはかなり混乱しています。 テキストの最後の文は正確に意味がありますか? B::B 未定義の最後のメソッド呼び出しはなぜですか? a.A::f を呼び出すだけではありませんか? 4つのメンバ...

56  新しく作成されたオブジェクトの操作方法は?  ( How to chain method on a newly created object ) 
PHPの新しく作成されたオブジェクトにメソッドをチェーンする方法があるかどうかを知りたいですか? 何かのようなもの: <事前> <コード> class Foo { public function xyz() { ... return $this; }...

7  テンプレートはconstを無視します(なぜ?)  ( Template neglects const why ) 
誰かが知っている、なぜこれがコンパイルするのか? <事前> <コード> template< typename TBufferTypeFront, typename TBufferTypeBack = TBufferTypeFront> class FrontB...




© 2022 cndgn.com All Rights Reserved. Q&Aハウス 全著作権所有