コンストラクタと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において同一ファイルで行う場合はこの方法になります。