在java里private方法在Java当中的含义是只在当前类范围之内可以调用,当前类的子类也无法访问,但能被同一类别的其他对象实例调用.protected方法在Java当中的含义是在当前类所在的整个package当中都可见,其他package类则无法访问;
ruby里private,protected都可以被子类继承,但是都不能被实例调用.
protected可以被同类的(含子类)的其他对象中调用.
ruby里private,protected都可以被子类继承,但是都不能被实例调用.
protected可以被同类的(含子类)的其他对象中调用.
irb(main):001:0> class AccessTest
irb(main):002:1> def test
irb(main):003:2> "test private"
irb(main):004:2> end
irb(main):005:1> def test_other(other)
irb(main):006:2> "other object" + other.test
irb(main):007:2> end
irb(main):008:1> end
=> nil
irb(main):009:0> t1=AccessTest.new
=> #<AccessTest:0xb773e620>
irb(main):010:0> t2=AccessTest.new
=> #<AccessTest:0xb7737334>
irb(main):011:0> t1.test
=> "test private"
irb(main):012:0> t1.test_other(t2)
=> "other objecttest private"
irb(main):013:0> class AccessTest
irb(main):014:1> private :test
irb(main):015:1> end
=> AccessTest
irb(main):016:0> t1.test
NoMethodError: private method `test' called for #<AccessTest:0xb773e620>
from (irb):16
from :0
#private 实例是调用不到的
irb(main):017:0> class AccessTest
irb(main):018:1> def tt
irb(main):019:2> 'tt'
irb(main):020:2> end
irb(main):021:1> protected :tt
irb(main):022:1> end
=> AccessTest
irb(main):023:0> t1.tt
NoMethodError: protected method `tt' called for #<AccessTest:0xb773e620>
from (irb):23
from :0
#protected 实例也调用不到(包括子类)
irb(main):024:0> class Sun < AccessTest
irb(main):025:1> end
=> nil
irb(main):026:0> s=Sun.new
=> #<Sun:0xb770f564>
irb(main):027:0> class Sun
irb(main):028:1> def tt2
irb(main):029:2> tt
irb(main):030:2> end
irb(main):031:1> end
=> nil
irb(main):032:0> s.tt2
=> "tt"
irb(main):033:0> class Sun
irb(main):034:1> def tt3
irb(main):035:2> test
irb(main):036:2> end
irb(main):037:1> end
=> nil
irb(main):038:0> s.tt3
=> "test private"
#protected可以被子类继承
irb(main):039:0> class AccessTest
irb(main):040:1> protected :test
irb(main):041:1> end
=> AccessTest
irb(main):042:0> s.test_other(s)
=> "other objecttest private"
#protected可以在同类(含子类)的其它对象的内部中使用
irb(main):043:0> s.test
NoMethodError: protected method `test' called for #<Sun:0xb770f564>
from (irb):43
from :0
irb(main):047:0> class Sun
irb(main):048:1> public :test
irb(main):049:1> end
=> Sun
irb(main):050:0> s.test
=> "test private"
#可以单独改变子类的方法的作用域