publicなどの修飾子
publicなどの修飾子を付けるのは面倒と思う人もいるでしょう。 小さい趣味のプログラムでなどでは付けなくて全然OKです。
すべての定数、メソッドがpublicで扱われます。自由に改変が できます。ところが複数の人間で大きなソフトを開発するとき 問題が起きます。例えば消費税のデータを間違って書き換えて しまった。また、変更すべき関数を間違えてしまった。などいろいろ あります。そこで自由に改変してもいいデータや関数とダメな ものを区別するとトラブルが少なくなります。区別するための 修飾子を説明します。


public
自由改変できます。文字通り公のデータ・関数です。誰でも公園を 使えるようなイメージです。これは自由でいいように感じますが こまることがあります。家がpublic,お金もpublicなら誰でも 使えてしまいます。これは困ったことです。
publicをどうするか?

データにpubulicを使うのはやめましょう

データを公にしたら間違った改変をされてしまいます。

メソッドは入出力に関するものなどをpublicにします
そのクラスでだけ使っているようなメソッドはpublicにしません。
getXXX(),setXXX()のような関数はpublicになります。

private
基本的にデータ・メソッドにprivateします。必要に応じてpublicにします。
privateを付加したデータやメソッドを使うとエラーになります。
final
これは非常に分かりやすいですね。最終的に決めたデータで後から改変できません。 円周率などの不変な定数を定義します。メソッドも付加できます。final を 付加したメソッドはオーバーライトできません。

static
文字からは何だか想像できません。普通クラスのインスタンスを作成してから クラスを使いますが、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;
    }

}