プログラミングマガジン

プログラミングを中心にIT技術をできるだけわかりやすくまとめます。

  • ホーム
  • オブジェクト指向
  • 【Java】オブジェクト指向:インスタンス変数の初期化(コンストラクタ)、thisキーワー…
 
 
     
  • サーバー言語  
    • Python
    • Ruby
    • PHP
    • SQL
  •  
  • インフラ  
       
    • AWS
    •  
    • 基本
    • Git
  • Web
       
    • Web開発
    • JavaScript
    • Vue.js
    • React
  •  
  • 設計  
       
    • 実装設計
    • DB設計
  • 問い合わせ
  

【Java】オブジェクト指向:インスタンス変数の初期化(コンストラクタ)、thisキーワード

04.30

  • miyabisan2
  • コメントを書く

この記事は2分で読めます

インスタンス変数を初期化する場合は、「コンストラクタ」を使うのが一般的です。

コンストラクタの動作タイミングとしては、「インスタンスが生成されるのと同タイミング」になります。

コンストラクタの構文

1
2
3
4
5
public class クラス名(){
クラス名(){
  ★ここに、初期化したい値を記述していく。
}
}

コンストラクタの構文を見ればわかりますが、「引数」や「戻り値」は定義しないです。

実装例

コンストラクタを使う前のプログラム

1
2
3
4
5
6
7
8
9
10
public class People {
 
String name = "太郎"; //名前
int weight = 60;  //体重
 
void weightAsk() {
System.out.println("私の体重は" + this.weight + "kgです。");
}
 
}

コンストラクタ適用後のプログラム

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class People {
 
String name; //名前
int weight;  //体重
 
//コンストラクタ
People(){
this.name = "太郎"; //名前
this.weight = 60;  //体重
}
 
void weightAsk() {
System.out.println("私の体重は" + this.weight + "kgです。");
}
 
}

ただ、上記の例であれば、別にコンストラクタを使うメリットはないですよね。

コンストラクタのメリットとしては、下記のように引数を渡すコンストラクタを使用する場合です。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class People {
 
String name; //名前
int weight;  //体重
 
//コンストラクタ
People(String name,int weight){
this.name = name; //名前
this.weight = weight;  //体重
}
 
void weightAsk() {
System.out.println("私の体重は" + this.weight + "kgです。");
}
 
}

上記、プログラムを下記のように呼んであげれば、インスタンス生成時に、Peopleクラスの値を個々の値に書き換えることができます。

1
2
3
4
5
6
7
8
9
10
11
12
13
public class Main {
 
public static void main(String args[]) {
 
People taro = new People("太郎",60);
taro.weightAsk();
 
People hanako = new People("花子",40);
hanako.weightAsk();
 
}
 
}

実行結果

引数なしのコンストラクタも、引数ありと同時に宣言できる。

また、もちろん、引数なしのコンストラクタも同時に宣言できます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class People {
 
String name; //名前
int weight;  //体重
 
//コンストラクタ(引数なし)
People(){
this.name = "テスト"; //名前
this.weight = 100;  //体重
}
 
//コンストラクタ(引数あり)
People(String name,int weight){
this.name = name; //名前
this.weight = weight;  //体重
}
 
void weightAsk() {
System.out.println("私の体重は" + this.weight + "kgです。");
}
 
}

このメリットとしては、毎回newする際に、引数を与えると、テストが大変だったりするので、なくても生成できます。

thisとは?

また、上記処理だとコンストラクタの処理が一部重複してしまっています。その場合は「this」を使うことですっきり書くことができます。

thisとは「自分自身のインスタンス」のこと。

フィールドにアクセスする場合

例えば、下記のように、「ローカル変数」や「メソッドの引数」と名前がかぶっていたとしても、「インスタンスの変数」を使うことができます。

もし、「インスタンスの変数」を使う場合は、明示的に「this」をつけるようにしましょう!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package opp;
 
public class People {
 
String name; //名前
int weight = 60;  //体重
 
void weightAsk() {
int weight = 50; //ローカル変数
System.out.println("私の体重は" + this.weight + "kgです。");
}
 
 
}

別コンストラクタを呼び出す場合

下記のように記述すれば、別コンストラクタを呼び出すことができます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class People {
 
String name; //名前
int weight;  //体重
 
//コンストラクタ(引数なし)
People(){
this("テスト",100);
}
 
//コンストラクタ(引数あり)
People(String name,int weight){
this.name = name; //名前
this.weight = weight;  //体重
}
 
void weightAsk() {
System.out.println("私の体重は" + this.weight + "kgです。");
}
 
}

thisを使うことで、「引数なしのコンストラクタ」と「引数ありのコンストラクタ」で、初期化処理が重複しないようにできます。

まとめ

コンストラクタのメリットとしては、主に「個々のインスタンスごとに、動的に初期化することができる点」です。

クラスから、個々のインスタンスを作成する場合は、個々のインスタンスごとに、値が異なるのが当たり前ですからね。

スポンサーリンク
  • 2018 04.30
  • miyabisan2
  • コメントを書く
  • Java, オブジェクト指向
  • Tweets Twitter
  • このエントリーをはてなブックマークに追加
  • LINEで送る

関連記事

  1. 2018 04.15

    【サーブレット】サーブレットフィルターの初期化パラメータについて

  2. 2021 08.28

    【オブジェクト指向】「SOLIDの原則」の概要

  3. 2018 04.30

    【Java】オブジェクト指向:継承の考え方や注意点

  4. 2018 05.04

    【Java】ロギング(ログ出力)ライブラリの比較

  5. 2022 03.26

    【オブジェクト指向】「集約」、「継承」、「委譲」の使い分け

  6. 2018 04.30

    【Java】オブジェクト指向:カプセル化

  • コメント ( 0 )
  • トラックバック ( 0 )
  1. この記事へのコメントはありません。

  1. この記事へのトラックバックはありません。

返信をキャンセルする。

【Java】オブジェクト指向:継承の考え方や注意点

【Java】オブジェクト指向:静的(static)メン…

RETURN TOP

著者プロフィール

エンジニア歴10年で過去に業務系、Webデザイン、インフラ系なども経験あります。現在はWeb系でフロントエンド開発中心です。

詳細なプロフィールはこちら

スポンサーリンク

カテゴリー

  • Android
  • AngularJS
  • API
  • AWS
  • C++
  • CSS
  • cursor
  • C言語
  • DDD
  • DevOps
  • Django
  • Docker
  • Figma
  • Git
  • GitLab
  • GraphQL
  • gRPC
  • Hasura
  • Java
  • JavaScript
  • Kubernetes
  • Laravel
  • linux
  • MySQL
  • Next.js
  • nginx
  • Node.js
  • NoSQL
  • Nuxt.js
  • Oracle
  • PHP
  • Python
  • React
  • Redux
  • Rspec
  • Ruby
  • Ruby on Rails
  • Sass
  • Spring Framework
  • SQL
  • TypeScript
  • Unity
  • Vue.js
  • Webサービス開発
  • Webデザイン
  • Web技術
  • インフラ
  • オブジェクト指向
  • システム開発
  • セキュリティ
  • その他
  • データベース
  • デザインパターン
  • テスト
  • ネットワーク
  • プログラミング全般
  • マイクロサービス
  • マイクロソフト系技術
  • マルチメディア
  • リファクタリング
  • 副業
  • 未分類
  • 業務知識
  • 生成AI
  • 設計
  • 関数型言語
RETURN TOP

Copyright ©  プログラミングマガジン | プライバシーポリシー