Java的方法調用作用域
private方法在Java當中的含義是只在當前類范圍之內可以調用,當前類的子類也無法訪問,但能被同一類別的其他對象實例調用,例如:
package com.robbinfan; public class C { private String name; private String getName() { return name; } public C(String name) { this.name = name; } public boolean compare(C c) { return this.name == c.getName(); } }
protected方法在Java當中的含義是在當前類所在的整個package當中都可見,其他package類則無法訪問。
ruby的方法調用作用域
private在當前類以及子類都可以調用,其他類無法訪問,比Java寬松一些,但private方法只能被當前對象隱式調用(self.),不能被同一類別的其他對象實例調用,這又比Java嚴格;protected稍微寬松一些,可以被同一個類別的其他實例調用,例如:
class C def initialize(name) @name = name end def compare(c) c.name == @name end protected def name @name end end class D < C end d1 = D.new("fankai") d2 = D.new("hello") puts d1.compare(d2)
在類別C當中使用c.name,如果name方法是private的話,只能使用self調用,即只能當前對象實例在當前類范圍內調用;如果name方法是protected的話,那么可以使用同一類的對象實例顯式調用,即可以引用其他對象實例的name方法。
因此private和protected的在ruby和Java的定義有很大的區(qū)別:
1、在不同對象實例當中的作用域不同
Java不管private還是protected的方法,都可以被同一個類別的其他對象實例調用;
Ruby的private方法不能被同一個類別的其他對象實例調用;
2、在類繼承關系當中的作用域不同
ruby不管private還是protected方法,都可以被子類繼承;
Java的private方法不能被子類繼承;
這種方法調用的差異,也許來自于不同的面向對象理念:Java的面向對象來自C++,強調類繼承關系,所以方法調用限定類繼承的層次結構當中的作用域,卻不強調對象實例作用域;而ruby的面向對象來自smalltalk,即使是類別也是對象,因此方法調用作用域都是針對對象實例調用來設置的。