コンストラクタと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なフィールドbにsubClassで0を入れ、その後、subClass2で40を入れました。そののち、subClassで読み取ると40です。これがstaticです。もしstaticでないとすれば、subClassで読み取る値は0になります。共通で扱うフィールドという感覚です。ただ、実際のところあまり使いません。。
コンストラクタとstatic、理解できましたでしょうか。
※厳密なカプセル化は行っていません。本来であればSubClassはpublic、メソッドもpublicとするべきです。ただ、AndroidStudioにおいて同一ファイルで行う場合はこの方法になります。