Progate Java

C++ と文法がかなり近いので, 比較してまとめる。

Java I

  • C++ との共通点
    • 文字, 文字列のクォーテーション
    • 文末セミコロン
    • コメント
    • 四則演算
    • 文字列の連結
    • 変数, 変数の=による初期化, 代入
    • ODR
    • int
    • +=, ++
    • 暗黙の型変換(ルールが同じかは分からない)
    • (int)x 等のキャスト
    • インデントできるが文法的な強制力はない
  • C++ との相違点
    • String
    • 変数名は camelCase 推奨
    • 下記基本型(Javaは速度ではなく汎用性重視)
  • 基本型
    • 論理型: boolean
    • 整数型: byte, short, int, long
      • これらは 1,2,4,8 バイト符号付き整数 と確定している
    • 浮動小数点型: float, double (4,8バイト)
    • 文字型: char (Unicode (UTF-16) と決まっている)
class Main {
  public static void main(String[] args) {
    System.out.println("Hello World"); // 末尾は改行される
  }
}

Java II

  • C++ との共通点
    • true, false, 比較演算子
    • &&, ||, !
    • if, switch, while, do, for (おそらく構文が完全に一致)
    • break, continue
    • [] による配列アクセス
  • C++ との相違点
    • boolean 型 (C++bool 型)
    • int[] v = {0,1,2} (C++int v[] = {0,1,2} など)
    • v.length (C++sizeof(v)/sizeof(v[0]))
  • 拡張for文
    • for(int item: intlist) pythonにおける for item in intlist: 値渡しらしい。
    • cf. C++ の範囲 for と同じ
      • C++ で使えるのは コンテナ, 配列, {0,1,2}(初期化リスト)
      • C++ では書き換えるなら for(auto &item: intlist) と参照渡しにすればよい。

Java III

  • C++ との相違点(クラス)

    • Java には関数はない(多分)ので, まとまった処理はクラス内でメソッドとして定義する。
    • クラス内のメソッドは メソッド名() で呼び出せる。
    • クラス外のメソッドは クラス名.メソッド名() で呼び出す
    • main メソッドの戻り値の型は int ではなく void ?
    • Java は「 1 ファイル 1 クラス 」を原則とする (ので, 以下はその場合を想定)
      • Javaはファイルではなくクラスを実行する。
      • ファイル名を クラス名.java とする(必須)
        • 外部ファイルのクラスはローカルにあれば import 不要(コンパイル時に指定)
        • 外部ライブラリのクラスは import クラス名; と, 使用するファイル内で import する。
          • import java.lang.Math; としたときは, クラス名は Math なので Math.round(3.5) のように呼び出せる。
          • ただし, java.lang にあるクラスは import 不要
      • クラスを実行すると, そのクラスの main メソッドが実行される。
        • ゆえに, main メソッドを持つクラスしか実行できない。
        • クラス名に関係なく, クラスの実行時には main メソッドが呼ばれる。
  • C++との共通点(の抜粋)

    • メソッドは多重定義可能
    • クラス名は PascalCase
// Main.java <-- クラス名が Main だから。
class Main {
  public static void main(String[] args) { // この main とクラス名の Main は関係ない。
    String added = hello("ABC"); // クラス内メソッドの呼び出しではクラス名は指定不要
    Hoge.hoge(); // クラス外メソッドの呼び出し
  }
  public static String hello(String name) {
    return "Hello "+name;
  }
}
// Hoge.java
import java.util.Scanner; // import は利用するファイルで。
class Hoge { // クラス定義
  public static void hoge() {
    Scanner scanner = new Scanner(System.in); // Scanner クラスのインスタンス生成
    String name = scanner.next(); // 空白までの入力を受け付けて, 文字列として格納する
    // scanner.nextLine() は改行までの一行を受け付ける。
    // scanner.nextInt()
    // scanner.nextDouble()
    System.out.println(name);
  }  
}

Java IV

  • C++との相違点
    • インスタンスの生成 new クラス名()
      • クラス型 変数名 = new クラス名() のクラス型はクラス名に同じ。
    • フィールド
      • インスタンスフィールド
        • インスタンスに属する。宣言に static はつけない.
        • クラス中でのアクセスは this.変数名, this.メソッド名() とする
      • クラスフィールド
        • クラスに属する。宣言に static をつける
        • クラス中でのアクセスは this をつけない
    • コンストラクタを(他のコンストラクタ中で)呼び出す
      • this() とすると、コンストラクタから同一クラス内の他のコンストラクタを呼び出せる。括弧内には適当な引数を与える(コンストラクタも多重定義できるので。)
      • this() はコンストラクタの先頭でしか呼び出せない。
    • 変数の定義時に値を代入しなかった場合, 固定的なデフォルト値が変数に代入される。
      • String: null
      • int: 0
      • double: 0.0
      • boolean: false
  • C++との共通点
    • コンストラクタ定義
      • コンストラクタ名はクラス名と同じにする
      • 戻り値を書いてはいけない(voidも書かない)
      • public もつけない
      • インスタンスを生成したときに、コンストラクタが呼び出される。
    • カプセル化:
      • public はクラスの外部からアクセス可能
      • private はクラスの外部からアクセス不可能
class Person {
    // 変数の定義(クラスの最初に書く)
    public String name; // python と違い, クラス側に定義が必要?
    public static int id = 0; // クラスフィールドは static を付ける。Person.id++ のように使う
    // コンストラクタの定義
    Person(String name) {
        this.name = name;
    }
    // インスタンスメソッドの定義
    public void hello() { // static がない 
        System.out.println("hello"+this.name);
    }
    // クラスメソッドの定義
    public static void hoge(){ // static がある
        System.out.println("hoge");
    }
}
Person person1 = new Person();
person1.hello(); // インスタンスメソッドは インスタンス名.メソッド名() としてよびだす。
Person.hoge(); // クラスメソッドは クラス名.メソッド名() としてよびだす。

Java V

  • 継承: class サブクラス名 extends スーパークラス名
    • スーパークラスインスタンスメソッドなどはそのまま使える。
    • 同名であればサブクラスで定義されたものが優先される(オーバーライド)。
    • サブクラス内で, スーパークラスで定義された private なものは参照できない(ゲッタやセッタ使う)
      • private の代わりに, protected を使えばサブクラス内からはアクセスできるようになる。
    • サブクラス内で, スーパークラスで定義されたメソッドを使うとき,
      • 同名のものが同じサブクラス内で定義されていない場合: メソッド名() でよい
      • 同名のものが同じサブクラス内で定義されている場合: super.メソッド名()
    • サブクラスでコンストラクタを定義するとき, 必ずコンストラクタの先頭でスーパークラスのコンストラクタを呼びださなければならない。スーパークラスのコンストラクタは super(); で呼び出せる(括弧内には実引数を与える).
    • 抽象メソッド: abstract public void hello(String name) ; のようにメソッドの先頭にabstractをつける。; に注意。
      • 具体的な処理が未確定なメソッドであることを示す。
      • サブクラスでそのメソッドをオーバーライドしていなければエラーになる。
        • つまり, サブクラスがオーバーライドし処理内容を定義することを強制できる。
      • 抽象メソッドを1つでも持つクラスは「抽象クラス」と呼ばれ、クラス定義を abstract class Hoge {} とする。
  • クラスの変数として他のクラスのインスタンスを持たせることもできる。
  • 多態性(要素が複数の型に属することを許すという性質):
    • つまり, クラス B が クラス A を継承する場合, クラス B のインスタンス b は, B型でもあると同時に A型でもある。よって, A b = new B() が許される。このとき, b は B型でもあるので, Bでオーバーライドされる場合はそちらが優先される。