rubyのprivate、protectedについて誤解していた。

rubyのprivate、protectedについて、かなり誤解していたことに気付いた。

private とは

明示的なレシーバを付けて呼び出す事はできない。
つまり、他のオブジェクトから呼び出すことはできず、
自オブジェクトからのみ呼び出す事ができる。
継承を行っている場合、
継承元に定義されたprivateメソッドは、継承先から呼び出す事ができる。
呼び出すときに、明示的にレシーバを指定する必要がないからだ。
これって、Javaでいうprotectedに相当するのでは。

じゃあ、rubyのprotectedは?

privateとほぼ同じだが、
同一クラスまたはサブクラスのインスタンスからであれば、レシーバを指定して呼び出す事ができる。 ちょっとirbで試してみると、

>> class Test
>>   protected
>>   def test; puts 'test'; end
>> end
=> nil
>> class SubTest < Test
>>   def subtest1; test; end
>>   def subtest2(o) o.test; end
>> end
=> nil
>> st = SubTest::new
=> #<SubTest:0x101220a40>
>> st.subtest1
test
=> nil
>> st.subtest2(Test::new)
test
=> nil
>> st.test
NoMethodError: protected method `test' called for #<SubTest:0x101220a40>
from (irb):13

なるほど。
そうすると、Javaでいうprivateのような狭いスコープは無いということか。