先看一下Java的private modifier对于相同类型的不同对象是否有限制。
public class PrivateMethod {
private StringBuilder sb;
public PrivateMethod(String sb) {
this.sb = new StringBuilder(sb);
}
private String getSB(){
return sb.toString();
}
public String invokeOtherPrivateMethod(PrivateMethod other){
return this.getSB() + other.getSB();
}
public static void main(String[] args) {
final PrivateMethod a = new PrivateMethod("a ");
final PrivateMethod b = new PrivateMethod("+ b");
System.out.println(a.invokeOtherPrivateMethod(b));
}
}
有Java基础的人都可以预料,JVM可以正常编译通过并且运行打印出:
a + b
然后,来看一下Ruby:
首先定义一个基础类型 ModifierCheckclass ModifierCheck
private
def private_check
puts "我是一个私有方法#{__id__}"
end
public
def public_check(other)
puts "我是一个公有方法#{__id__}"
other.protected_check
end
protected
def protected_check
puts "我是一个保护方法#{__id__}"
end
end
然后定义一个子类并且执行class ModifierCheckSub
def public_check
private_check
"==>你不是已经私有了么。。"
end
end
modifier = ModifierCheckSub.new
puts modifier.public_check
最后执行结果我是一个私有方法70198988112100
==>你不是已经私有了么。。
上面可以发现在子类中可以调用父类的私有方法,与Java完全不同。
这里如果要问,为何Java的例子完全不写个子类来调用一下父类的private方法?这个还用说么,还没到运行时,直接编译器都过不了。
接下来,来看一下在子类中是否可以override父类的私有方法,在子类中添加以下的部分:def private_check
puts "我是覆盖私有方法的子方法"
end
执行结果:我是覆盖私有方法的子方法
==>你不是已经私有了么。。
看,在子类中可以Override父类的私有方法。最后也许让我疑惑的私有在哪里,那么,来试一下最后这个。依然在子类中添加:def invokeOtherPrivateMethod(other)
other.private_check
end
#而执行部分修改为:
modifier = ModifierCheckSub.new
modifier2 = ModifierCheck.new
modifier.invokeOtherPrivateMethod modifier2
这个时候执行直接报错:in `invokeOtherPrivateMethod': private method `private_check' called for #<0x007f8bc2a13df8> (NoMethodError)0x007f8bc2a13df8>
最终好像看出点什么,也许借鉴于Java与Ruby的静态/动态语言之分,
private的访问级别:在Java中限制在同一个类中,而Ruby限制在同一个对象中。