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

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

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

php とたぶん同じ。

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

インターフェイス

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

  • メンバに public しか使えないのは php と同様。インターフェイスの概念上 public 以外使えるのはおかしい。
  • 多重継承・多重実装が可能で抽象メソッドが被っても問題ない
  • インターフェイスはインターフェイスを継承できる。親をスーパーインターフェイス、子をサブインターフェイスという。
  • Java では public final (static) フィールドの定義ができる。publicfinal は省略できる。 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 扱い。

Javaphp の用語比較メモ

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