Progate Java
C++ と文法がかなり近いので, 比較してまとめる。
Java I
- C++ との共通点
- 文字, 文字列のクォーテーション
- 文末セミコロン
- コメント
- 四則演算
- 文字列の連結
- 変数, 変数の
=
による初期化, 代入 - ODR
int
+=
,++
- 暗黙の型変換(ルールが同じかは分からない)
(int)x
等のキャスト- インデントできるが文法的な強制力はない
- C++ との相違点
String
- 変数名は camelCase 推奨
- 下記基本型(Javaは速度ではなく汎用性重視)
- 基本型
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++ との相違点
- 拡張for文
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++との相違点
- C++との共通点
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でオーバーライドされる場合はそちらが優先される。
- つまり, クラス B が クラス A を継承する場合, クラス B のインスタンス b は, B型でもあると同時に A型でもある。よって,