コンストラクタとstaticとは | Constructor and static | JAVA

スポンサーリンク
スポンサーリンク

コンストラクタとstaticについて

以下のコード、実行したらLogcatには何が表示されるでしょう?

前半でコンストラクタ、後半でstaticです。この結果が正解できればほぼ両者を理解したと言えるでしょう。SubClassはいわゆるカプセル化をしています。

public class MainActivity extends AppCompatActivity{
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
          Log.d("Log0__make","new SubClass()");
        SubClass subClass = new SubClass();
          Log.d("Log0__make","subClass.subClass()");
        subClass.SubClass();
          Log.d("Log0__make","new SubClass(\"StringType\")");
        subClass = new SubClass("StringType");
          Log.d("Log0__make","new SubClass(90)");
        subClass = new SubClass(90);
          Log.d("Log0__make","setAge(20) and getAge()");
        subClass.setAge(20);
          Log.d("Log0_result",""+subClass.getAge());
          Log.d("Log0__make","subClass.setB(0)");
        subClass.setB(0);
          Log.d("Log0__make","subClass2 = new SubClass()");
        SubClass subClass2 = new SubClass();
          Log.d("Log0__make","subClass2.setB(40)");
        subClass2.setB(40);
          Log.d("Log0__make","subClass.getB()");
          Log.d("Log0_result",""+subClass.getB());
    }
}
class SubClass{
    private int age;
    private static int b;
    void SubClass(){
        Log.d("Log0_result","void subClass!");
    }
    SubClass(){
        Log.d("Log0_result","subClass!");
    }
    SubClass(String subS){
        Log.d("Log0_result","subClass's "+subS+"!");
    }
    SubClass(int c){
        Log.d("Log0_result","subClass's "+c+"!");
    }
    int getAge() {
        return age;
    }
    void setAge(int age) {
        this.age = age;
    }
    int getB() {
        return b;
    }
    void setB(int b) {
        SubClass.b = b;
    }
}

結果(答え)

コンストラクタには戻り値の型を明記しない(voidも!)

 void SubClass()とSubClass()は別物!

 void SubClass()は単なるメソッドであって名称も紛らわしく不適切。

最後のsetB(int b)、bはstaticであるからthis.bでは誤り。

カプセル化(フィールドをprivate、操作はgetterとsetterで)

 直接メンバ変数(フィールド)にアクセスする書き方は好ましくない

Log0__make: new SubClass()
Log0_result: subClass!
Log0__make: subClass.subClass()
Log0_result: void subClass!
Log0__make: new SubClass(“StringType”)
Log0_result: subClass’s StringType!
Log0__make: new SubClass(90)
Log0_result: subClass’s 90!
Log0__make: setAge(20) and getAge()
Log0_result: 20
Log0__make: subClass.setB(0)
Log0__make: subClass2 = new SubClass()
Log0_result: subClass!
Log0__make: subClass2.setB(40)
Log0__make: subClass.getB()
Log0_result: 40

staticなフィールドbsubClassで0を入れ、その後、subClass2で40を入れました。そののち、subClassで読み取ると40です。これがstaticです。もしstaticでないとすれば、subClassで読み取る値は0になります。共通で扱うフィールドという感覚です。ただ、実際のところあまり使いません。。

コンストラクタとstatic、理解できましたでしょうか。

※厳密なカプセル化は行っていません。本来であればSubClassはpublic、メソッドもpublicとするべきです。ただ、AndroidStudioにおいて同一ファイルで行う場合はこの方法になります。