JAVAやJavascript、最近オブジェクト指向的な記述が可能になったphpなどの言語で次のようなクラス定義が可能です。
<JAVAの場合>
class A {
public int i1 = 1;
public int i2;
A() {
i2 = 2;
}
}
しかし最近覚えたC++では、例の「public int i1 = 1;」のようなクラスのスコープ内で代入を行うことは出来ず、その場所では「public int i2;」のように宣言のみ、代入はコンストラクタで行うようになっています。この場合はなぜ「public int i1 = 1;」はダメなのかと疑問に思っても「そういう仕様だ」と言われれば納得できます(やり方が1つだけなので)。
ではJAVAなどの言語で、例のような場所で「public int i1 = 1;」のような宣言と代入を行うことは、代入をコンストラクタを用いて行うこととどのような違いがあるのでしょうか?また、どちらが推奨されるのでしょうか?
A 回答 (4件)
- 最新から表示
- 回答順に表示
No.4
- 回答日時:
No2さんの内容をちょっと補足。
フィールドの初期化は、スーパークラスのコンストラクタより後、自分自身のコンストラクタの処理より先です。
コンストラクタの起動後ですが、コンストラクタの初期化処理より先に動きます。
コンストラクタで行っているフィールドへの代入を当てにして初期化を書くと変なことになります。
No.3
- 回答日時:
No.2の回答の方が言うとおり、違いはわずかでどちらにすべきという強い理由はないと思います。
ただ、自分はコンストラクタが大きくなるのを嫌って可能な限りフィールドの宣言と同時に初期化するのが好きです。これはローカル変数の宣言と初期化を1ステートメントで行う理由と同じです。もちろんフィールドの初期化にコンストラクタの引数が必要な場合はコンストラクタで初期化せざるをえません。No.2
- 回答日時:
記述上の制限という言葉で片付けてしまうのもやや乱暴ですが
varable initializeによるインスタンス変数の初期化はConstractor
の起動より先に実行されることはありません。
記述上「宣言」と「代入」を同時に行っているようにみえますが違います。
実際にはコンパイラがConstractor内にvarable initializeを内部展開し
Constractorが*起動した後で*その初期化が実行されます。
なので結局はConstractor内に初期化コードを記述することと差異はないのです。
実際にjavap -cでJavaを実行してみるとその順序が明確ですので
確認してみるとよいかもしれません。
JLS文書の「8.3.2 Initialization of Fields」も参照のこと。
結局のところコード標準や周囲のソースコードとの比較を元に
もっとも「らしい」記述を心がけるのがよいでしょう。
この手の課題に今のところ「べき論」はありません。
No.1
- 回答日時:
どーなんでしょうねえ。
基本的に、static や final 以外は コンストラクタで代入するのがスジだと思います。
final変数は書き換えできないので、宣言時に指定するしかありませんし、
static変数はインスタンス化の影響を受けないので、宣言時に指定するのが妥当だと思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- Ruby 【JAVA】数字をひし形に出力するプログラムについて 2 2022/07/11 23:32
- Java JavaのSingletonパターンのprivateの持つ意味が分かりません。 5 2022/06/12 10:38
- Java Java プログラム public class Main { public static void 3 2023/08/10 23:46
- Java Java 配列<選挙> 4 2023/07/31 15:07
- Java 直し方について教えて頂きたいです。 4 2022/08/13 02:11
- C言語・C++・C# C++プログラミングコードにポリモーフィズムを取り入れ方を教えてください。 2 2023/06/09 11:17
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- Java java final 1 2022/06/10 22:49
- Java javaのクラスの分け方について質問です。 APIの内部用と外部用でクラスを分けたいのですがインター 2 2022/04/26 16:06
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAでダブルコーテーション入り...
-
エラーの意味は? Lvalue req...
-
C言語 列挙型(enum型)変数について
-
Variant型で宣言してるのにEmpt...
-
テキストボックスの値を変数に...
-
EXCEL/VBA 変数の値をクリップ...
-
java final
-
jsp~jspにhiddenを使って変数...
-
[VBS]変数を定数に変換する方法...
-
変数にオフセットが付いている...
-
VBAでコマンドプロンプトの結果...
-
StringReaderのサンプルプログ...
-
processing エラーで、 "cannot...
-
vba 最大値 条件分岐
-
DataTableの値を変数に代入したい
-
i++と++i ってどう違うのですか?
-
数値計算??
-
インクリメント演算子の前置(+...
-
var aaa=bbb?cccl:ddd; の意味...
-
C# String str ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAでダブルコーテーション入り...
-
エラーの意味は? Lvalue req...
-
C言語 列挙型(enum型)変数について
-
EXCEL/VBA 変数の値をクリップ...
-
整数xxxが大き過ぎますというエ...
-
テキストボックスの値を変数に...
-
[VBS]変数を定数に変換する方法...
-
Variant型で宣言してるのにEmpt...
-
jsp~jspにhiddenを使って変数...
-
processing エラーで、 "cannot...
-
python の 連鎖代入の文法
-
i++と++i ってどう違うのですか?
-
プログラミングで変数と関数の...
-
C言語 アロー演算子について質...
-
「%」を使って、偶数か奇数かを...
-
JavaScriptをURLから直接実行し...
-
VBA 1行で複数の代入を行った...
-
ExcelのVBAでをA列に第0〜19項...
-
コマンドプロンプト バッチ|結...
-
無名関数のメリットがよくわか...
おすすめ情報