クラス拡張時のスーパークラスのprivate修飾子
拡張クラスのエラーがでたから、その理解のメモ。
[Calc.java]
public class Calc { private Calc(){ } static int add(int n1, int n2){ return n1 + n2; } static int substract(int n1, int n2){ return n1 - n2; } static int multiply(int n1, int n2){ return n1 * n2; } static double divide(int n1, int n2){ return (n1*1.0) / (n2*1.0); } }
[Main.java]
public class Main{ public static void main(String[] args) throws NumberFormatException{ int n1 = Integer.parseInt(args[0]); int n2 = Integer.parseInt(args[1]); int a = Calc.add(n1,n2); int s = Calc.substract(n1,n2); int m = Calc.multiply(n1,n2); double d = Calc.divide(n1,n2); //System.out.println(greeting.ohayo()+greeting.konnichiwa()+greeting.konbannwa()); System.out.println(a+","+s+","+m+","+d); } }
うえのMain.javaファイルを、
public class Main extends Calc
のように
あやまって、Calcクラスを確証してしまったところ、以下のコンパイルエラー。
Main.java:1: エラー:Calc()はCalcでprivateアクセスされます
原因は、拡張していたから。
main関数を実行するとき、その実装クラスであるMainクラスのオブジェクトが生成される。
そのとき実行されるのが、コンストラクタ。
Mainクラスの関数がじっこうされるとき、その親クラスであるCalcクラスのコンストラクタも実行される。
明記されてはいないが、
super();
という親クラスのコンストラクタがMainクラスのコンストラクタのなかでいちばん最初に実行されるからだ。
それなのに、private修飾子のせいで、Mainクラスコンストラクタが親クラスのコンストラクタにアクセスできない(つまり、super();が実行されない)ので、エラーがでてたということ。