北大青鸟:Java和ruby的方法调用作用域差别

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方法。

因此privateprotected的在rubyJava的定义有很大的区别:

1、在不同对象实例当中的作用域不同

Java不管private还是protected的方法,都可以被同一个类别的其他对象实例调用;

Rubyprivate方法不能被同一个类别的其他对象实例调用;

2、在类继承关系当中的作用域不同

ruby不管private还是protected方法,都可以被子类继承;

Javaprivate方法不能被子类继承;

这种方法调用的差异,也许来自于不同的面向对象理念:Java的面向对象来自C++,强调类继承关系,所以方法调用限定类继承的层次结构当中的作用域,却不强调对象实例作用域;而ruby的面向对象来自smalltalk,即使是类别也是对象,因此方法调用作用域都是针对对象实例调用来设置的。

北大青鸟网上报名
北大青鸟招生简章