オブジェクト指向
Rubyでは、数値、変数、メソッドなどすべてがオブジェクトです。Javaでは、クラスのみがオブジェクトになります。たとえば、Class1型のオブジェクトは次のようにして作成します。
Class1 class1=new Class1();
メンバ変数
Rubyでは、メンバ変数はすべてプライベートです。Javaでは、メンバ変数はデフォルトでパッケージアクセスとなり、public、private、protectedの各識別子を使用してパブリック、プライベート、プロテクトとして宣言できます。プライベートメンバにはそのクラス自体の内部からのみアクセスできます。Javaのパブリックメンバには他のどのクラスからもアクセスできます。Javaのプロテクトメンバには、クラスがそのメンバを宣言しているのと同じパッケージの内部およびそのクラスのサブクラスの内部からアクセスできます。Javaのデフォルトパッケージアクセスでは、クラスがそのメンバを宣言しているのと同じパッケージの内部およびそのクラス自体の内部からアクセスできます。
キャスト
Javaでは、ある条件を満たす場合に、オブジェクトを他のオブジェクトにキャストできます。その条件とは、「キャストしようとするオブジェクトの型が、キャスト先オブジェクトの型の拡張である」というものです。たとえば、LinkedHashSet型のオブジェクトlinkedHashSetはHashSet型にキャストできます。LinkedHashSet型はHashSet型の拡張であるためです。
HashSet hashSet=(HashSet)linkedHashSet;
Rubyでは、変数の型指定が動的に行われ、任意の他の型に代入できるので、キャストは使用しません。
クラスとメソッドの定義
Rubyでは、クラスとメソッドのブロックをendキーワードで区切ります。Javaでは、クラスとメソッドのブロックを中括弧{}で区切ります。たとえば、RubyでCatalogというクラスを定義するには、class修飾子を使用して次のように記述します。
class Catalog end
Rubyのクラス名は先頭を大文字にする必要があります。Javaのクラスも、class修飾子を使用して定義し、名前の先頭を大文字にする必要があります。
class Catalog{
}
Rubyでは、クラスの宣言にアクセス修飾子は使用しませんが、Javaでは、クラスにpublicアクセス修飾子を指定でき、デフォルトのクラスアクセスはパッケージレベルになります。たとえば、JavaではCatalogというクラスを次のように宣言できます。
public class Catalog{ }
Rubyのメソッドは、defで開始し、endで終了します。たとえば、getCatalogIdというメソッドを次のように定義できます。
def getCatalogId return 1 end
デフォルトでは、Rubyのメソッドはパブリックです。Rubyのメソッドには、public、private、protectedの修飾子を指定できます。Rubyのメソッドでは値を返すことができますが、メソッド定義で戻り値の型は指定しません。Javaのメソッドはデフォルトでパッケージアクセスになり、戻り値の型を指定する必要があります。たとえば、JavaではgetCatalogIdメソッドを次のように宣言できます。
int getCatalogId(){return 1;}
Javaのメソッドにはpublic、private、protectedの修飾子を指定できます。Rubyでは、メソッド呼び出しに丸括弧を使用するかどうかは任意です。たとえば、引数nameを受け取ってHelloメッセージを返すhelloというメソッドを定義したとします。
class Hello def hello(name) return "Hello " +name end end
このhelloメソッドを呼び出すときに、次のように丸括弧を付けることも付けないこともできます。
helloObj=Hello.new helloObj.hello("John") helloObj.hello "John"
Javaでは、メソッド呼び出しの丸括弧は必須です。たとえば、Helloメッセージを返すhelloというメソッドを定義したとします。
public class Hello{ public String hello(String name){ return "Hello "+ name; } }
このHelloクラスのhelloメソッドを呼び出すときは、引数を囲む丸括弧を省略できません。
Hello helloObj=new Hello(); helloObj.hello("John");
クラスのコンストラクタ
Javaでは、クラス名がコンストラクタになります。たとえば、Helloというクラスを定義し、そのクラスのコンストラクタを定義します。
public class Hello{ String defaultMsg; public Hello(String msg){ defaultMsg=msg; } }
このコンストラクタは、String型変数defaultMsgの値を設定します。Rubyでは、クラスのインスタンス化はinitialize関数で行います。たとえば、クラスを定義し、そのクラス内で変数をインスタンス化するには、次のようにinitialize関数を使用します。
class Hello @defaultMsg def initialize(msg) @defaultMsg=msg end end
クラスのインスタンス化
Rubyでは、クラスをインスタンス化するときにクラスメソッドnewを使用します。たとえば、前の例のHelloクラスは次のようにしてインスタンス化できます。
hello=Hello.new("Hello Ruby")
newメソッドに渡した引数はinitialize関数に渡されます。Javaでは、クラスのインスタンス化にJava演算子newを使用します。
Hello hello=new Hello();
new演算子は、クラス内で定義したどのコンストラクタにも使用できます。たとえば、String型の引数を受け取りデフォルトのHelloメッセージを設定するコンストラクタがHelloクラスにある場合、このクラスは次のようにしてインスタンス化できます。
Hello hello=new Hello("Hello Java");
Javaでは複数のコンストラクタを宣言できますが、Rubyのクラスに含めることのできるinitializeメソッドは1つのみです。Rubyで複数のinitializeメソッドを宣言しても例外は発生しませんが、その場合使用されるのは最後のinitializeメソッドのみです。
