![]() |
publicなどの修飾子 |
publicなどの修飾子を付けるのは面倒と思う人もいるでしょう。
小さい趣味のプログラムでなどでは付けなくて全然OKです。 すべての定数、メソッドがpublicで扱われます。自由に改変が できます。ところが複数の人間で大きなソフトを開発するとき 問題が起きます。例えば消費税のデータを間違って書き換えて しまった。また、変更すべき関数を間違えてしまった。などいろいろ あります。そこで自由に改変してもいいデータや関数とダメな ものを区別するとトラブルが少なくなります。区別するための 修飾子を説明します。 ![]() 自由改変できます。文字通り公のデータ・関数です。誰でも公園を 使えるようなイメージです。これは自由でいいように感じますが こまることがあります。家がpublic,お金もpublicなら誰でも 使えてしまいます。これは困ったことです。 publicをどうするか? データにpubulicを使うのはやめましょう データを公にしたら間違った改変をされてしまいます。 メソッドは入出力に関するものなどをpublicにします そのクラスでだけ使っているようなメソッドはpublicにしません。 getXXX(),setXXX()のような関数はpublicになります。 ![]() 基本的にデータ・メソッドにprivateします。必要に応じてpublicにします。 privateを付加したデータやメソッドを使うとエラーになります。 ![]() これは非常に分かりやすいですね。最終的に決めたデータで後から改変できません。 円周率などの不変な定数を定義します。メソッドも付加できます。final を 付加したメソッドはオーバーライトできません。 ![]() 文字からは何だか想像できません。普通クラスのインスタンスを作成してから クラスを使いますが、staticを使うとインスタンスなしでメソッドなどを 使えます。 Math.PI のような使い方です。 これらの使い方です。 MainActivity.java public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //自前のクラスを使う //インスタンスの取得 myClass mc = new myClass(); //public の関数はインスタンスから呼び出せる int c = mc.add10(5); Log.i("myClass", "result is " + String.valueOf(c)); //private の関数はインスタンスから呼び出せない //c = mc.add20(5); //エラー: add20(int)はmyClassでprivateアクセスされます // c = mc.add20(5); // ^ //修飾子のつかない変数はpublic c = mc.noModifier; Log.i("myClass", "result is " + String.valueOf(c)); //修飾子のつかない関数はpublic c = mc.add30(30); Log.i("myClass", "result is " + String.valueOf(c)); //finalの修飾子なし mc.pub1 = 12;//代入できる //finalの修飾子あり //mc.fi = 60; //エラー: final変数fiに値を代入することはできません // mc.fi = 60; // ^ myChild mcld = new myChild(); c = mcld.add10(3); Log.i("myClass", "result is " + String.valueOf(c)); //static を使いクラスのインスタンスを作成しないで使う例 Log.i("myClass",String.valueOf(Formula.SALES_TAX)); float surface = Formula.Triangle(20, 10); Log.i("myClass",String.valueOf(surface)); surface = Formula.Rectangle(40, 50); Log.i("myClass",String.valueOf(surface)); double length = Formula.Circle(10); Log.i("myClass",String.valueOf(length)); } } myClass.java public class myClass { //コンストラクタ何も処理なし public myClass(){} int noModifier = 0; public int pub1 = 10; private int pri1 = 20; public final int fi = 30; //適当に作ったメソッド public int add10(int a){ int b = a + 10; return b; } private int add20(int a){ int b = a + 20; return b; } int add30(int a){ int b = a + 30; return b; } final int add40(int a){ int b = a + 40; return b; } } myClassを継承したmyChild.java public class myChild extends myClass{ //コンストラクタ何も処理なし public myChild(){} public int add10(int c){ int a = super.add10(c); a += 10; return a; } // public int add40(int a){ // return a + 44; // } //エラー: myChildのadd40(int)はmyClassのadd40(int)をオーバーライドできません // public int add40(int a){ // ^ // オーバーライドされたメソッドはfinalです } staticの例 Formula.java public class Formula { //消費税は勝手に変えられてはいけないのでfinal static final double SALES_TAX = 0.1; //三角形の面積 static float Triangle(float b, float h){ return b * h / 2; } //四角形の面積 static float Rectangle(float a, float b){ return a * b; } //円周 static double Circle(double r){ return 2 * Math.PI * r; } } |