北大青鳥:Java和ruby的方法調(diào)用作用域差別

Java的方法調(diào)用作用域

private方法在Java當(dāng)中的含義是只在當(dāng)前類范圍之內(nèi)可以調(diào)用,當(dāng)前類的子類也無(wú)法訪問(wèn),但能被同一類別的其他對(duì)象實(shí)例調(diào)用,例如:

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當(dāng)中的含義是在當(dāng)前類所在的整個(gè)package當(dāng)中都可見(jiàn),其他package類則無(wú)法訪問(wèn)。

ruby的方法調(diào)用作用域

private在當(dāng)前類以及子類都可以調(diào)用,其他類無(wú)法訪問(wèn),比Java寬松一些,但private方法只能被當(dāng)前對(duì)象隱式調(diào)用(self.),不能被同一類別的其他對(duì)象實(shí)例調(diào)用,這又比Java嚴(yán)格;protected稍微寬松一些,可以被同一個(gè)類別的其他實(shí)例調(diào)用,例如:

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當(dāng)中使用c.name,如果name方法是private的話,只能使用self調(diào)用,即只能當(dāng)前對(duì)象實(shí)例在當(dāng)前類范圍內(nèi)調(diào)用;如果name方法是protected的話,那么可以使用同一類的對(duì)象實(shí)例顯式調(diào)用,即可以引用其他對(duì)象實(shí)例的name方法。

因此privateprotected的在rubyJava的定義有很大的區(qū)別:

1、在不同對(duì)象實(shí)例當(dāng)中的作用域不同

Java不管private還是protected的方法,都可以被同一個(gè)類別的其他對(duì)象實(shí)例調(diào)用;

Rubyprivate方法不能被同一個(gè)類別的其他對(duì)象實(shí)例調(diào)用;

2、在類繼承關(guān)系當(dāng)中的作用域不同

ruby不管private還是protected方法,都可以被子類繼承;

Javaprivate方法不能被子類繼承;

這種方法調(diào)用的差異,也許來(lái)自于不同的面向?qū)ο罄砟睿?/SPAN>Java的面向?qū)ο髞?lái)自C++,強(qiáng)調(diào)類繼承關(guān)系,所以方法調(diào)用限定類繼承的層次結(jié)構(gòu)當(dāng)中的作用域,卻不強(qiáng)調(diào)對(duì)象實(shí)例作用域;而ruby的面向?qū)ο髞?lái)自smalltalk,即使是類別也是對(duì)象,因此方法調(diào)用作用域都是針對(duì)對(duì)象實(shí)例調(diào)用來(lái)設(shè)置的。

北大青鳥網(wǎng)上報(bào)名
北大青鳥招生簡(jiǎn)章