Javaの基本

クラス

Java のプログラムには、クラスが最低1つは必要になります。また、クラスには必ず main メソッドが必要になります。

「 public class JavaSampleClass 」の「 JavaSampleClass 」は任意で決めることができます。

public class JavaSampleClass {

    public static void main(String[] args) {

    }

}

コメントを記述するには以下のようにします。

public class JavaSampleClass {

    public static void main(String[] args) {
        // これは1行でコメントを書く方法です
        
        /* 複数行にわたって
        コメントもできます。 */

    }

}

変数

変数名は、数字で始めることができません。大文字と小文字は異なるものとして区別されます。

変数を定義するには、以下のようにします。

public class JavaSampleClass {

    public static void main(String[] args) {
        int num;
        num = 3;
        System.out.println("変数numの値は" + num + "です。");
    }

}

Java の型には、以下のようなものがあります。

boolean true or false
char 2バイト文字(\u0000~\uffff)
byte 1バイト整数(-128~127)
short 2バイト整数(-32768~32767)
int 4バイト整数(-2147483648~2147483647)
long 8バイト整数(-922337203685477808~9223372036854775807)
float 4バイト単精度浮動小数点数
double 8バイト倍精度浮動小数点数

文字列リテラル

Java で文字列リテラルを使用する場合、'(シングルクォーテーション)を使うことはできません。'(シングルクォーテーション)は、1つの文字を表す文字リテラルで使用されます。

char[] c = {'こ', 'ん', 'に', 'ち', 'は'};
String msg = new String(c);
System.out.println(msg); // こんにちは

文字列リテラルを使用する場合は、"(ダブルクォーテーション)を使います。

String msg = "こんにちは";
String msg = 'こんにちは'; // エラー

演算子

インクリメント・デクリメントは、以下のようにします。

a++;
++a;
a--;
--a;

Java の代入演算子には、以下のようなものがあります。

記号 名前
+= 加算代入
-= 減算代入
*= 乗算代入
/= 除算代入
%= 剰余代入
&= 論理積代入
|= 論理和代入
^= 排他的論理和代入
<<= 左シフト代入
>>= 右シフト代入
>>>= 符号なし右シフト代入
a += 1;

型変換

大きなサイズの型に小さなサイズの型を代入するには、以下のようにします。

public class JavaSampleClass{

    public static void main(String[] args) {
        int int_num = 100;
        
        System.out.println(int_num);
        
        double double_num = int_num;
        System.out.println(double_num);
        
    }

}

大きなサイズの型を小さなサイズの型に代入するには、キャスト演算子を使います。

double の変数を int の変数に代入すると、小数点以下が切り捨てられます。

public class JavaSampleClass{

    public static void main(String[] args) {
        double double_num = 100.5;
        
        System.out.println(double_num);
        
        int int_num = (int)double_num;
        System.out.println(int_num);
        
    }

}

異なる型どうしで演算する場合、大きなサイズの型に変換してから演算を行います。

public class JavaSampleClass{

    public static void main(String[] args) {
        double tax = 1.08;
        int price = 100;
        
        System.out.println(price*tax);
        
    }

}

同じ型どうしで演算する場合、予期せぬエラーが発生することがあります。

public class JavaSampleClass{

    public static void main(String[] args) {
        int num1 = 5;
        int num2 = 4;
        
        double div = num1 / num2;
        System.out.println(div);
        
    }

}
// 結果 1.0

1.25という結果を得るには、num1 か num2 の少なくとも、どちらか一方を double 型に変換する必要があります。

public class JavaSampleClass{

    public static void main(String[] args) {
        int num1 = 5;
        int num2 = 4;
        
        double div = (double)num1 / num2;
        System.out.println(div);
        
    }

}
// 結果 1.25

キーボードからの入力を受け付ける

import java.io.*;

public class JavaSampleClass{

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String str = br.readLine();
        System.out.println(str + "が入力されました");
    }

}

if文

if文を使うには、以下のようにします。

public class JavaSampleClass{

    public static void main(String[] args) {
        boolean bool = true;
        if(bool == true) {
            System.out.println("true です");
        }
        
    }

}

if~else if~else の使い方は、以下のようにします。

public class JavaSampleClass{

    public static void main(String[] args) {
        int num = 1;
        if(num == 1) {
            System.out.println("1 です");
        } else if(num == 2) {
            System.out.println("2 です");
        } else {
            System.out.println("1と2以外です");
        }
        
    }

}

switch文

switch文を使うには、以下のようにします。

public class JavaSampleClass{

    public static void main(String[] args) {
        int num = 1;
        switch(num) {
            case 1:
                System.out.println("1です");
                break;
            case 2:
                System.out.println("2です");
                break;
            default:
                System.out.println("1と2以外です");
                break;
        }
    }

}

for文

繰り返し処理のfor文を使うには、以下のようにします。

public class JavaSampleClass{

    public static void main(String[] args) {
        for(int i = 1;i <= 5; i++) {
            System.out.println(i + "回目です");
        }
    }

}

while文

public class JavaSampleClass{

    public static void main(String[] args) {
        int i = 1;
        while(i <= 5) {
            System.out.println(i+"回目です");
            i++;
        }
    }

}

無限ループを行うには、以下のようにします。

public class JavaSampleClass{

    public static void main(String[] args) {
        while(true) {
            System.out.println("hello");
        }
    }

}

continue文

continue文を使うと繰り返し処理をスキップできます。以下は3の処理の場合をスキップします。

public class JavaSampleClass{

    public static void main(String[] args) {
        int res = 3;
        for(int i = 1; i <= 5; i++) {
            if(i == res) {
                continue;
            }
            System.out.println(i);
        }
    }

}

配列

配列の宣言と要素の確保を定義するには、以下のようにします。

public class JavaSampleClass{

    public static void main(String[] args) {
        int[] test;
        test = new int[5];
        
        test[0] = 80;
        test[1] = 60;
        test[2] = 40;
        
        for(int i = 0; i < 5; i++) {
            System.out.println(test[i]);
        }
    }

}

// 結果
80
60
40
0
0

配列を初期化するには、以下のようにします。

public class JavaSampleClass{

  public static void main(String[] args) {
    int [] test = {80, 60, 40};
    
    for(int i = 0; i < test.length; i++) {
      System.out.println(test[i]);
    }
  }

}

配列の値を再代入するには、以下のようにします。

public class JavaSampleClass{

    public static void main(String[] args) {
        int [] test = {80, 60, 40};
        
        test[2] = 100;
        
        for(int i = 0; i < test.length; i++) {
            System.out.println(test[i]);
        }
    }

}

多次元配列

多次元配列を宣言するには、以下のようにします。また、for文を入れ子にして値を取り出します。

public class JavaSampleClass{

    public static void main(String[] args) {
        int [][] test = {
                {80, 60, 40},
                {180, 160, 140},
                {280}
        };
        
        for(int i = 0; i < test.length; i++) {
            for(int j = 0; j < test[i].length; j++) {
                System.out.println(test[i][j]);
            }
            
        }
    }

}

連想配列

Java で連想配列を使用するには、HashMap を使用します。

import java.util.HashMap;

public class JavaSampleClass{

    public static void main(String[] args) {
        HashMap<String,Integer> fruits = new HashMap<String, Integer>();
        fruits.put("apple", 100); // 値のセット
        fruits.put("orange", 90); // 値のセット
        
        System.out.println(fruits.get("apple")); // 値の取得
        
        fruits.remove("apple"); // 値の削除
        
        System.out.println(fruits.get("apple"));
        
        // キーが含まれているか。戻り値は論理値
        System.out.println(fruits.containsKey("banana"));
        
        // 値が含まれているか。戻り値は論理値
        System.out.println(fruits.containsValue(90));
        
        // マッピングのサイズ
        System.out.println(fruits.size());
        
        // すべて削除
        fruits.clear();
        
        // 連想配列がからかどうか。戻り値は論理値
        System.out.println(fruits.isEmpty());
        
    }

}

連想配列を forEach でループするには以下のようにします。

引数が1つの時は、引数をくくる()は、省略できます。

import java.util.HashMap;

public class JavaSampleClass{

    public static void main(String[] args) {
        HashMap<String,Integer> fruits = new HashMap<String, Integer>();
        fruits.put("apple", 100);
        fruits.put("orange", 90);
        fruits.put("banana", 80);
        
        fruits.forEach((key, value) -> {
            System.out.println(key + ":" + value);
        });
    }

}

拡張for文を使って、キーと値のペアをそれぞれすべて取得することができます。

また、Mapのキーと値のペアはMap.Entryインタフェースで表される為、キーと値のペアをすべて取得することがきます。

import java.util.HashMap;
import java.util.Map;

public class JavaSampleClass{

    public static void main(String[] args) {
        Map<String,Integer> fruits = new HashMap<String, Integer>();
        fruits.put("apple", 100);
        fruits.put("orange", 90);
        fruits.put("banana", 80);
        
        // キーをすべて取得する
        for(String key: fruits.keySet()) {
            System.out.println(key);
        };
        
        // 値をすべて取得する
        for(Integer value: fruits.values()) {
            System.out.println(value);
        }
        
        // キーと値をすべて取得する
        for(Map.Entry<String, Integer> entry: fruits.entrySet()) {
            System.out.println(entry.getKey() + ":" + entry.getValue());
        }
    }

}

クラス

クラスの宣言、利用方法は、以下のようにします。

class Car
{
    int number;
    String color;
}

public class JavaSampleClass{

    public static void main(String[] args) {
        Car car1; // Car型の変数の作成
        car1 = new Car(); // オブジェクトを作成し、代入
        
        // 上記を1文でまとめる場合
        // Car car1 = new Car();
        
        car1.number = 123456;
        car1.color = "red";
        
        System.out.println("車のナンバー:" + car1.number);
        System.out.println("車の色:" + car1.color);
        
    }

}

メソッドを作成するには、以下のようにします。

class Car
{
    int number;
    String color;
    
    void show() {
        System.out.println("車のナンバー:" + number);
        System.out.println("車の色:" + color);
    }
}

public class JavaSampleClass{

    public static void main(String[] args) {
        Car car1; // Car型の変数の作成
        car1 = new Car(); // オブジェクトを作成し、代入
        
        // 上記を1文でまとめる場合
        // Car car1 = new Car();
        
        car1.number = 123456;
        car1.color = "red";
        
        car1.show();
        
    }

}

void : ヴォイド

空所、空の

void は、戻り値を持たないメソッドを定義する際に使用します。

関数に引数を設定するには、以下のようにします。

class Car
{
    int number;
    String color;
    
    void setNumber(int n) {
        number = n;
        System.out.println(number);
    }
    
    void setColor(String s) {
        color = s;
        System.out.println(color);
    }
}

public class JavaSampleClass{

    public static void main(String[] args) {
        Car car1 = new Car();
        
        car1.setNumber(123456);
        car1.setColor("red");
    }

}

複数の引数をもつメソッドを定義するには、以下のようにします。

class Car
{
    int number;
    String color;
    
    void setValues(int n, String s) {
        number = n;
        color = s;
    }
    
    void show() {
        System.out.println("車のナンバー:" + number);
        System.out.println("車の色:" + color);
    }
}

public class JavaSampleClass{

    public static void main(String[] args) {
        Car car1 = new Car();
        
        car1.setValues(1234, "red");
        car1.show();
    }

}

戻り値を持つメソッドを定義するには、void を使わずに戻り値の値の型を指定します。

class Car
{
    int number;
    String color;
    
    void setValues(int n, String s) {
        number = n;
        color = s;
    }
    
    void show() {
        System.out.println("車のナンバー:" + number);
        System.out.println("車の色:" + color);
    }
    
    // void ではなく戻り値の型を指定します
    int getNumber() {
        return number;
    }
}

public class JavaSampleClass{

    public static void main(String[] args) {
        Car car1 = new Car();
        
        car1.setValues(1234, "red");
        car1.show();
        
        int getnumber = car1.getNumber();
        
        System.out.println("ナンバーを取得しました:" + getnumber);
    }

}

クラスの機能

クラスの外から勝手にアクセスできないようにするためには、private メンバとして設定しておきます。

class Car
{
    private int number;
    private String color;
}

public class JavaSampleClass{

    public static void main(String[] args) {
        Car car1 = new Car();
        
        car1.number = 123456; // アクセスできない為、エラー
        
        System.out.println("ナンバーを取得しました:" + car1.number); // アクセスできない為、エラー
    }

}

private メンバにクラスの外からアクセスできるようにするには、public メンバにした、関数を利用しアクセスします。

クラスの中にデータとメソッドをひとまとめにし、メンバにprivateをつけアクセス制限することをカプセル化といいます。

class Car
{
    private int number;
    private String color;
    
    public void setColor(String c) {
        color = c;
    }
    
    public String getColor() {
        return color;
    }
}

public class JavaSampleClass{

    public static void main(String[] args) {
        Car car1 = new Car();
        
        car1.setColor("red");
        
        System.out.println("カラーを取得しました:" + car1.getColor());
    }

}

同じクラス内に、同じ名前のメソッドを2つ以上定義することができます。これをメソッドのオーバーロードといいます。

オーバーロードの注意点としては、オーバーロードするメソッドは、引数の型や数が異なっていないといけません。同じだとどのメソッドを呼び出せばいいかわからないからです。

「 setCar 」のように1つの名前のメソッドが、その状況に応じて別々の働きを持つことを「 多態性(ポリモーフィズム)」といいます。

class Car
{
    private int number;
    private String color;
    
    public void setCar(int n) {
        number = n;
        System.out.println("ナンバーを" + number + "にしました。");
    }
    
    public void setCar(String s) {
        color = s;
        System.out.println("カラーを" + color + "にしました。");
    }
    
    public void setCar(int n, String s) {
        number = n;
        color = s;
        System.out.println("ナンバーを" + number + "、カラーを" + color + "にしました。");
    }
    
    public void show() {
        System.out.println("ナンバー:" + number);
        System.out.println("カラー:" + color);
    }
}

public class JavaSampleClass{

    public static void main(String[] args) {
        Car car1 = new Car();
        
        car1.setCar(1234);
        car1.setCar("red");
        
        car1.show();
        
        car1.setCar(7777, "blue");
        
        car1.show();
    }

}

クラスの中には、フィールドとメソッドのほかに、コンストラクタを設定することができます。

コンストラクタとは、クラスのオブジェクトが作成されたときに、定義しておいたコンストラクタ内の処理が自動的に行われます。

コンストラクタの利用方法は、オブジェクトのメンバに自動的に初期値を設定したりすることに利用されます。

コンストラクタを設定する際の注意点は、「 コンストラクタの名前は必ずクラス名と同じ 」にします。また、戻り値を設定することはできません。

class Car
{
    private int number;
    private String color;
    
    public Car() {
        number = 1234;
        color = "silver";
        System.out.println("初期値を設定しました。");
    }
    
    public void show() {
        System.out.println("ナンバー:" + number + ", カラー:" + color);
    }
}

public class JavaSampleClass{

    public static void main(String[] args) {
        Car car1 = new Car();
        car1.show();
    }

}

コンストラクタもメソッドと同じように、引数の型と数が異なっていればオーバーロードすることができます。

class Car
{
    private int number;
    private String color;
    
    public Car() {
        number = 0000;
        color = "silver";
        System.out.println("設定を初期化しました。");
    }
    
    public Car(int n, String s) {
        number = 1234;
        color = "red";
        System.out.println("ナンバー:" + number + "、 カラー:" + color + "を設定しました。");
    }
    
    public void show() {
        System.out.println("車情報");
        System.out.println("ナンバー:" + number + ", カラー:" + color);
    }
}

public class JavaSampleClass{

    public static void main(String[] args) {
        Car car1 = new Car();
        car1.show();
        
        Car car2 = new Car(1234, "red");
        car2.show();
    }

}

コンストラクタ内で別のコンストラクタを呼び出すには、this を使います。

class Car
{
    private int number;
    private String color;
    
    public Car() {
        number = 0000;
        color = "silver";
        System.out.println("設定を初期化しました。");
    }
    
    public Car(int n, String s) {
        this();
        number = 1234;
        color = "red";
        System.out.println("ナンバー:" + number + "、 カラー:" + color + "を設定しました。");
    }
    
    public void show() {
        System.out.println("車情報");
        System.out.println("ナンバー:" + number + ", カラー:" + color);
    }
}

public class JavaSampleClass{

    public static void main(String[] args) {
        Car car1 = new Car();
        car1.show();
        
        Car car2 = new Car(1234, "red");
        car2.show();
    }

}

// 結果
設定を初期化しました。
車情報
ナンバー:0, カラー:silver
設定を初期化しました。 // this()の呼び出しで引数のないコンストラクタが呼び出された結果
ナンバー:1234、 カラー:redを設定しました。
車情報
ナンバー:1234, カラー:red

コンストラクタもメソッドと同じように、public、private という修飾子を設定することができます。

private を指定した、コンストラクタは、クラスの外でコンストラクタが呼び出されるようなオブジェクトの作成ができなくなります。

class Car
{
    private int number;
    private String color;
    
    private Car() {
        number = 0000;
        color = "silver";
        System.out.println("設定を初期化しました。");
    }
    
    public Car(int n, String s) {
        this();
        number = 1234;
        color = "red";
        System.out.println("ナンバー:" + number + "、 カラー:" + color + "を設定しました。");
    }
    
    public void show() {
        System.out.println("車情報");
        System.out.println("ナンバー:" + number + ", カラー:" + color);
    }
}

public class JavaSampleClass{

    public static void main(String[] args) {
        Car car1 = new Car(); // private に指定されている為、作成できずエラー
        car1.show();
        
        Car car2 = new Car(1234, "red");
        car2.show();
    }

}

クラスでは、オブジェクトに関連されておらずクラスに関連されているフィールドを「 クラス変数 」、メソッドを「 クラスメソッド 」といいます。

クラス変数、クラスメソッドを定義するには、「 static 」を指定します。

class Car
{
    // クラス変数
    public static int sum = 0;
    
    private int number;
    private String color;
    
    public Car() {
        number = 0000;
        color = "silver";
        sum++; // クラス変数に値を追加
        System.out.println("車を作成しました。");
    }
    
    public void show() {
        System.out.println("車情報");
        System.out.println("ナンバー:" + number + ", カラー:" + color);
    }
    
    public static void showSum() {
        System.out.println("車の合計数:" + sum);
    }
}

public class JavaSampleClass{

    public static void main(String[] args) {
        Car.showSum(); // クラスメソッドの為、オブジェクトを作成していなくても呼び出せる
        
        Car car1 = new Car();
        car1.show();
        
        Car.showSum();
    }

}

クラスメソッド内では、インスタンス変数・インスタンスメソッドにアクセスすることができません。

また、クラスメソッド内では、「 this. 」を使うことができません。

class Car
{
    // クラス変数
    public static int sum = 0;
    
    private int number;
    private String color;
    
    public Car() {
        number = 0000;
        color = "silver";
        sum++;
        System.out.println("車を作成しました。");
    }
    
    public void show() {
        System.out.println("車情報");
        System.out.println("ナンバー:" + number + ", カラー:" + color);
        System.out.println("車の合計数:" + this.sum); // インスタンス変数内では、this. も利用可能。クラス変数へのアクセスも可能
    }
    
    public static void showSum() {
        System.out.println("車の合計数:" + this.sum); // クラスメソッド内では、this. は利用できない為、エラー
        System.out.println("車のナンバー:" + number); // クラスメソッド内では、インスタンス変数にアクセスできない為、エラー
    }
}

public class JavaSampleClass{

    public static void main(String[] args) {
        Car.showSum(); // クラスメソッドの為、オブジェクトを作成していなくても呼び出せる
        
        Car car1 = new Car();
        car1.show();
        
        Car.showSum();
    }

}

継承

Javaでは、すでに作成したクラスをもとにして、新しいクラスを作成することができるようになっています。

新しく作成したクラスが既存のクラスのメンバを受け継ぐことを継承といい、もとになる既存のクラスを「 スーパークラス 」、新しいクラスを「 サブクラス 」といいます。

// 車クラス(スーパークラスの宣言)
class Car
{
   private int num;
   private String color;
   
   public Car() {
       num = 0;
       color = "silver";
       System.out.println("車を作成しました");
   }
   
   public void setCar(int n, String c) {
       num = n;
       color = c;
       System.out.println("ナンバー:" + num + ", カラー:" + color +"にセットしました。");
   }
   
   public void show() {
       System.out.println("ナンバーは、" + num + "です。");
       System.out.println("カラーは、" + color + "です。");
   }
}

// スーパーカークラス(サブクラスの宣言)
class SuperCar extends Car {
    private String brand;
    
    public SuperCar() {
        brand = "";
        System.out.println("スーパーカーを作成しました");
    }
    
    public void setBrand(String b) {
        brand = b;
        System.out.println("スーパーカーのブランドを「 " + brand + " 」にしました");
    }
}

public class JavaSampleClass{

    public static void main(String[] args) {
        SuperCar rccar1;
        rccar1 = new SuperCar();
        
        rccar1.setCar(123456, "red");
        rccar1.setBrand("ランボルギーニ");
        
    }

}

スーパークラスのコンストラクタは、サブクラスに継承されない代わりに、スーパークラスの引数なしのコンストラクタが自動的に呼び出されます。

スーパークラスにコンストラクタが複数ある場合、呼び出すコンストラクタを指定したい場合があります。その場合は、「 super() 」を記述すると、スーパークラスのどのコンストラクタを呼び出すかを自分で指定できます。

// 車クラス
class Car
{
   private int num;
   private String color;
   
   public Car() {
       num = 0;
       color = "silver";
       System.out.println("車を作成しました");
   }
   
   // ※1
   public Car(int n, String c) {
       num = n;
       color = c;
       System.out.println("ナンバー:" + num + ", カラー:" + color + "の車を作成しました。");
   }
   
   public void setCar(int n, String c) {
       num = n;
       color = c;
       System.out.println("ナンバー:" + num + ", カラー:" + color +"にセットしました。");
   }
   
   public void show() {
       System.out.println("ナンバーは、" + num + "です。");
       System.out.println("カラーは、" + color + "です。");
   }
}

// スーパーカークラス
class SuperCar extends Car {
    private String brand;
    
    public SuperCar() {
        System.out.println("スーパーカーを作成しました");
    }
    
    // ※2
    public SuperCar(int n, String c, String b) {
        super(n, c); // ※1 のスーパークラスの引数2個のコンストラクタが呼び出される
        brand = b;
        System.out.println("ブランドを" + brand + "にしました。");
    }
    
    public void setBrand(String b) {
        brand = b;
        System.out.println("スーパーカーのブランドを「 " + brand + " 」にしました");
    }
}

public class JavaSampleClass{

    public static void main(String[] args) {
        SuperCar rccar1 = new SuperCar(1234, "blue", "ランボルギーニ"); // ※2 のサブクラスの引数3個のコンストラクタが呼び出される
        
        
    }

}

サブクラス内からメンバにアクセスする

スーパークラスのprivateメンバには、サブクラスからもアクセスすることができません。

スーパークラスで「 protected 」を指定したメンバは、サブクラスからアクセスすることができます。

// 車クラス
class Car
{
   protected int num;
   protected String color;
   
   public Car() {
       num = 0;
       color = "silver";
       System.out.println("車を作成しました");
   }
   
   public Car(int n, String c) {
       num = n;
       color = c;
       System.out.println("ナンバー:" + num + ", カラー:" + color + "の車を作成しました。");
   }
   
   public void setCar(int n, String c) {
       num = n;
       color = c;
       System.out.println("ナンバー:" + num + ", カラー:" + color +"にセットしました。");
   }
   
   public void show() {
       System.out.println("ナンバーは、" + num + "です。");
       System.out.println("カラーは、" + color + "です。");
   }
}

// スーパーカークラス
class SuperCar extends Car {
    private String brand;
    
    public SuperCar() {
        System.out.println("スーパーカーを作成しました");
    }
    
    public SuperCar(int n, String c, String b) {
        super(n, c);
        brand = b;
        System.out.println("ブランドを" + brand + "にしました。");
    }
    
    public void setBrand(String b) {
        brand = b;
        System.out.println("スーパーカーのブランドを「 " + brand + " 」にしました");
    }
    
    public void newShow() {
        System.out.println("スーパーカーのナンバーは" + num + "です。");
        System.out.println("カラーは" + color + "です。");
        System.out.println("ぶらんどは" + brand + "です");
    }
}

public class JavaSampleClass{

    public static void main(String[] args) {
        SuperCar rccar1 = new SuperCar(1234, "blue", "ランボルギーニ");
        
        rccar1.newShow();
    }

}

メソッドのオーバーライド

サブクラスで新しくメソッドを定義するときには、スーパークラスとまったく同じメソッド名・引数の数・型を持つメソッドを定義することができます。

class Car
{
   public void show() {
       System.out.println("スーパークラスのメソッドです");
   }
}

class SuperCar extends Car {
    
    public void show() {
        System.out.println("サブクラスのメソッドです。");
    }
}

public class JavaSampleClass{

    public static void main(String[] args) {
        SuperCar rccar1 = new SuperCar();
        
        rccar1.show();
    }

}

まとめ

オーバーロードは、「 メソッド名が同じで引数の形式が異なるメソッドを定義すること 」です。

オーバーライドは、「 サブクラスで、スーパークラスのメソッドとメソッド名・引数の形式がまったく同じであるメソッドを定義すること 」です。

スーパークラスと同じ名前のメンバを使う

サブクラス内で、スーパークラスのメソッドを呼び出すには、「 super. 」をつけてメソッドを呼び出します。

class Car
{
   public void show() {
       System.out.println("スーパークラスのメソッドです");
   }
}

class SuperCar extends Car {
    
    public void show() {
        super.show(); // スーパークラスのメソッドの呼び出し
        System.out.println("サブクラスのメソッドです。");
    }
}

public class JavaSampleClass{

    public static void main(String[] args) {
        SuperCar rccar1 = new SuperCar();
        
        rccar1.show();
    }

}

フィールドにも「 super. 」をつけることでスーパークラスの変数にアクセスすることができます。

class Car
{
   int x = 20;
   
   public void show() {
       System.out.println("スーパークラスのメソッドです");
   }
}

class SuperCar extends Car {
    int x = 10;
    
    public void show() {
        x = 10;
        System.out.println("サブクラスのフィールド:" + x);
        System.out.println("スーパークラスのフィールド:" + super.x);
    }
}

public class JavaSampleClass{

    public static void main(String[] args) {
        SuperCar rccar1 = new SuperCar();
        
        rccar1.show();
    }

}

オーバーライドできないようにする

スーパークラスのメソッドの先頭にfinalをつけると、オーバーライドされないようにすることができます。

class Car
{
   public final void show() {
       System.out.println("スーパークラスのメソッドです");
   }
}

class SuperCar extends Car {
    public void show() {
        System.out.println("サブクラスのメソッドです");
    }
}

public class JavaSampleClass{

    public static void main(String[] args) {
        SuperCar rccar1 = new SuperCar();
        
        rccar1.show();
    }

}

上記のコードを実行すると以下のようなエラーが発生します。

Exception in thread "main" java.lang.IncompatibleClassChangeError: class sample.SuperCar overrides final method sample.Car.show()

java.lang.IncompatibleClassChangeError: クラス sample.SuperCar が final メソッド sample.Car.show() をオーバーライドしています

サブクラス自体を作ってほしくないクラスを設計することがあるかもしれません。その場合、クラスの先頭に final をつけておきます。

final class Car
              {
                 public void show() {
                     System.out.println("スーパークラスのメソッドです");
                 }
              }
              
              class SuperCar extends Car {
                  public void show() {
                      System.out.println("サブクラスのメソッドです");
                  }
              }
              
              public class JavaSampleClass{
              
                  public static void main(String[] args) {
                      SuperCar rccar1 = new SuperCar();
                      
                      rccar1.show();
                  }
              
              }

上記のコードを実行すると以下のようなエラーが発生します。

Exception in thread "main" java.lang.Error: Unresolved compilation problem: 型 SuperCar は final クラス Car をサブクラス化できません

フィールドにfinalをつけた場合は、フィールドの値を変更することができなくなります。そのフィールドは、宣言したときに必ず初期化をする必要があります。

決まった数を表すフィールドを、定数といいます。

class Car
{
   final String COLOR = "red";
   
   public void show() {
       COLOR = "blue";
       System.out.println("スーパークラスのメソッドです");
   }
}

public class JavaSampleClass{

    public static void main(String[] args) {
        Car car1 = new Car();
        
        car1.show();
    }

}

上記のコードを実行すると以下のようなエラーが発生します。

Exception in thread "main" java.lang.Error: Unresolved compilation problem: final フィールド Car.COLOR には代入できません