JavaとC++はどちらも純粋なオブジェクト指向言語ではない?その理由を解説
JavaとC++は、どちらもオブジェクト指向プログラミング(OOP)をサポートする代表的な言語ですが、「純粋なオブジェクト指向言語」という観点で比較すると、両者には重要な違いがあります。
Javaのエントリーポイントは必ずクラスの中にある
Javaでは、プログラムの実行開始点となるmain()メソッドでさえ、必ずクラスの内部に定義しなければなりません。staticキーワードを付けることで、オブジェクト(インスタンス)を生成せずにJVMがmain()メソッドを直接呼び出せる仕組みになっていますが、それでもクラスの定義自体は省略できません。
つまり、Javaではすべてのコードが何らかのクラスに属するという設計思想であり、言語構造全体がオブジェクト指向を中心に組み立てられています。
C++はクラス外に関数を書ける柔軟な言語
一方のC++では、main()関数をクラスの外部に記述できますし、そもそもクラスを定義すること自体が必須ではありません。関数だけを並べた手続き型的なコードでもそのまま動作します。
この柔軟性こそが、C++が「手続き型・オブジェクト指向・ジェネリックなど複数のスタイルを支援するマルチパラダイム言語」と呼ばれる理由です。結果として、C++は純粋なオブジェクト指向言語とは見なされないことが一般的です。
それでもJavaを「100%純粋」と言い切れない理由
以上の点から、Javaの方がC++よりもオブジェクト指向の色が濃いと言われることが多いです。ただし、厳密に考えると話は少し複雑です。
Javaにはintやcharといったプリミティブ型(基本データ型)が存在し、これらはオブジェクトではありません。さらに、staticメソッドやstaticメンバーはオブジェクトを介さずに利用できます。このため、「Javaも厳密には純粋なオブジェクト指向ではない」という指摘がよく行われます。Smalltalkのように「すべてがオブジェクト」で構成される言語と比べると、その差は明確です。
まとめ:両言語のオブジェクト指向度の違い
- C++:
main()をクラス外に書け、クラス定義も任意。オブジェクト指向以外のスタイルも許容するため、純粋なOOP言語とは言えない。 - Java:
main()を含むすべてのコードをクラス内に書く必要があり、オブジェクト指向度は非常に高い。ただしプリミティブ型やstatic要素の存在により、厳密には100%純粋とも言い切れない。
結論として、JavaはC++よりも強くオブジェクト指向に寄った設計を持つ言語です。しかし「純粋さ」の定義をどう取るかによっては、どちらの言語も完全な純粋オブジェクト指向言語とは呼べない――これが多くの開発者に共有されている見方です。
-
Javaで多重継承がサポートされていない理由とは?曖昧性の問題をわかりやすく解説
Javaでは、1つのクラスが複数のクラスを同時に継承(extends)することはできません。そのため、次のようなコードはコンパイルエラーとなり、不正な記述として扱われます。不正なコードの例public class extends Animal, Mammal{}一方で、Javaのクラスは1つ以上のインターフェースを実装(implements)することが可能です。この仕組みによって、多重継承が持つ利点の多くを補完できるようになっています。多重継承が禁止されている理由最大の理由は、曖昧性(あいまいさ)の発生を防ぐためです。具体的に考えてみましょう。仮にクラスBがクラスAとクラスCの両方を継承できる
-
【Java】「メインクラスが見つからないか、ロードできませんでした」エラーの原因と解決方法
コマンドプロンプトでjavaコマンドを使用し、ターミナルでクラス名を指定してJavaプログラムを起動しようとすると、「Could not find or load main class(メインクラスが見つからないか、ロードできませんでした)」というエラーが発生することがあります。このエラーの主な原因は、ユーザーがクラスを宣言する際に犯すプログラミング上のミスです。前述のとおり、このエラーはシステム自体の問題ではなく、主にユーザー側のミスによって引き起こされます。本記事では、典型的なミスのシナリオとその対処法を順番に解説していきます。なお、読者の皆様がJavaプログラミングの基礎知識とその仕組み