[Java]とphpの比較 - 抽象クラス、インターフェイス、継承、可視性、修飾子、メモ

Java学習のためPHPのクラス周りの仕様を比較してみる。

抽象クラス、抽象メソッド

phpとたぶん同じ。

  • 抽象クラスと抽象メソッドの定義には abstract 修飾子をつかう
  • 抽象クラス中に 非抽象クラスを含めることができる
  • 抽象クラスのインスタンスは生成できない
  • 抽象クラスの 非抽象staticメンバ はコール可能

インターフェイス

phpとだいたい同じだけど細かい部分は異なる。

  • メンバにpublicしか使えないのはphpと同様。インターフェイスの概念上public以外使えるのはおかしい。
  • 多重継承・多重実装が可能で抽象メソッドが被っても問題ない
  • インターフェイスはインターフェイスを継承できる。親をスーパーインターフェイス、子をサブインターフェイスという。
  • Javaでは public final (static) フィールドの定義ができる。public と final は省略できる。phpではプロパティは定義できないけど、クラス定数をconstで宣言することは可能
  • フィールドに使用できる修飾子は public, static, final の3種類で、組み合わせは自由
  • phpではabstract修飾子は省略必須だけど、Javaでは省略してもしなくてもOK

可視性

PHPとかなり使い方が違う。

クラスメンバの可視性

package-private (指定なし)
  • 同じパッケージ内のみで使える。
  • 別パッケージから直接利用できない。この点を除けば protected と等価?
  • 同じパッケージ内でつかうのみなら public と等価?
  • phpで言えば…なんだろう? use 演算子に制限とかなかった気がするし、存在しない機能かな?
public
  • アクセスや継承の制限はない
  • phpでも同じ
protected
  • 同じパッケージ内で使うなら public と等価
  • パッケージ外から protectedメンバへのアクセスはできない
  • 継承の制限はないため、パッケージ外のprotectedメンバは自由に継承できる
  • パッケージ外から使いたいときは継承して使う必要がある
private
  • オブジェクト内部でのみ使用することができる
  • 継承は不可能
  • 別オブジェクトのprivateフィールドにアクセスするためには、そのオブジェクトがアクセサを備えている必要がある

クラスの可視性/修飾子

package-private (指定なし)
  • パッケージ内のみで使える。違うパッケージからは呼び出せない。
public
  • アクセスや継承の制限はない。
  • 同じファイル内に複数の public 修飾子付きのクラス・インターフェイスを定義できない。 そのクラスファイル名と同じ名前のクラス・インターフェイスである必要がある。
final
  • 継承不可な package-privateなクラスになる。当然インターフェイスには使えない。

phpではクラスに可視性を設定できない、常にpublic扱い。

Java と php の用語比較メモ

Javaphp
メンバ同じ
フィールドプロパティ。Javaにおけるプロパティは別物っぽい?まだよくわからない。
メソッド同じ
オーバーロードphpにはJavaでいうオーバーロードは存在しない
コンストラクタphpでは __constructor も使える
デフォルトコンストラクタ存在しない機能
final (フィールド)プロパティに対してfinal修飾子は使えない
static final (フィールド)const クラス定数
abstract同じ
finally存在しない機能
throws存在しない
. (ドット)-> or ::
extends implements細かい違いはあるが だいたい同じ
super()parent::
関連があるかもしれない記事