ruby,javaの言語間の違い、同機能の別名とか、混乱した事につて。

■破壊的メソッド、mutable,immutable
rubyには破壊的メソッドという者がある。例えばStringオブジェクトの場合、メソッド名に!をつけると破壊的メソッド。破壊的メソッドの場合、Stringオブジェクトの中身が変わる。mutableね。

ただ、Object#freezeを呼び出せば、破壊的メソッドを使用不可のfreeze状態にできる。freeze状態かどうかは#frozen?で確認できる。

■インスタンス変数、attr_accessor: hoge , setter,getter
rubyのインスタンス変数は、外から参照、更新する事はできない。必ずあくせさが必要。javaのpublicフィールドとは違う。
attr_accessorにインスタンス変数の値を渡せば、アクセサ(setter,getter)が自動的に定義される。hogeの場合、hoge=がセッタ、hogeがゲッタ。attr_reader,attr_writerで片方だけの定義もできる。attr_accessor:hoge1, hoge2のように複数インスタンス変数を指定できる。

■インスタンス変数、@、クラス変数、@@
rubyのインスタンス変数は@、暮らす変数は@@を前につける

■クラスメソッド、staticメソッド、self
rubyでクラスメソッドを定義する場合、メソッドの定義でメソッド名に前にself.をつける。また、クラスメソッドを複数定義したい場合、class << self ~ endの~にまとめてかける。

■メソッド呼び出し、変数、定数アクセス
rubyは.(ドット)だけじゃなく、::でもおっけ。

■コンストラクタ,initialize

■呼びだし制限、private,protected,public
rubyの呼び出し制限の書き方は、private :method_name  public:method_name2
method_name,method_name2は省略してまとめてかく事もできる。
呼び出し制限を書かない場合、defで定義したメソッドはpublicになる。
javaと比べてprotectedだけ意味が異なる。rubyのprotectedは、そのメソッドが定義された同じ暮らす、またはそのサブクラスしかから呼び出せない。
initialize,トップレベルで定義したメソッドはprivate。

■特異メソッド
rubyにはクラスでメソッドを定義できるだけじゃなくて、特定のオブジェクトにメソッドが定義できる。これを特異メソッドという。特異メソッドは、クラスで定義したメソッドをオーバーライドできる。

■モジュール
javaは完全なオブジェクト指向言語だけど、rubyは違い。rubyにはクラスだけじゃなく、モジュールというものがある。モジュールはnewしてオブジェクトを作成できない。トップレベルやクラス内でモジュールをincludeし、オブジェクト名.メソッド名で呼び出す。cのライブラリみたいなもの。ちなみにクラスからincludeする事をmix-inと言うらしい。
あと継承はできない。名前空間を作れる。名前空間が作れるってことで、モジュール内でモジュールやクラスの定義はできる。
あとextendを使って、オブジェクトの特異メソッドに取り込む事も出来る。クラス内でincludeでmoduleをmix-inせず、moduleをextendsするとモジュールのメソッドをクラスメソッドとして取り込む事ができる。このあたりはjavaと比べて自由すね・・・

■import,require,autoload
javaのimportに対する物は、rubyのrequireやatuoload。

■継承ツリー,Object
irb(main):027:0* class MyClass
irb(main):028:1> end
irb(main):035:0> MyClass.ancestors
=> [MyClass, Object, Math, Kernel, BasicObject]
irb(main):036:0> MyClass.superclass
=> Object

irb(main):039:0* String.superclass
=> Object
irb(main):040:0> String.ancestors
=> [String, Comparable, Object, Math, Kernel, BasicObject]

■オブジェクトのコピー
Object#dup,Object#cloneは浅いコピー(shallow copy)