2007-05-03
ruby的方法调用作用域
ruby的method作用域和Java一样,修饰词都有private,protected和public。其中public的含义都是一样的,但是private和protected却完全不一样。这一点在《Programming ruby》当中语焉不详。今天看了《ruby for rails》第7章才搞明白了。
一、Java当中的含义:
private方法在Java当中的含义是只在当前类范围之内可以调用,当前类的子类也无法访问,但能被同一类别的其他对象实例调用,例如:
protected方法在Java当中的含义是在当前类所在的整个package当中都可见,其他package类则无法访问;
二、Ruby当中的含义:
private在当前类以及子类都可以调用,其他类无法访问,比Java宽松一些,但private方法只能被当前对象隐式调用(self.),不能被同一类别的其他对象实例调用,这又比Java严格;
protected稍微宽松一些,可以被同一个类别的其他实例调用,例如:
在类别C当中使用c.name,如果name方法是private的话,只能使用self调用,即只能当前对象实例在当前类范围内调用;如果name方法是protected的话,那么可以使用同一类的对象实例显式调用,即可以引用其他对象实例的name方法。
因此private和protected的在ruby当前和Java的定义有很大的区别:
1、在不同对象实例当中的作用域不同
Java当中,不管private还是protected的方法,都可以被同一个类别的其他对象实例调用;
Ruby当中,private方法不能被同一个类别的其他对象实例调用;
2、在类继承关系当中的作用域不同
ruby当中,不管private还是protected方法,都可以被子类继承;
Java当中,private方法不能被子类继承;
这种方法调用的差异,也许来自于不同的面向对象理念:Java的面向对象来自C++,强调类继承关系,所以方法调用限定类继承的层次结构当中的作用域,却不强调对象实例作用域;而ruby的面向对象来自smalltalk,即使是类别也是对象,因此方法调用作用域都是针对对象实例调用来设置的。
一、Java当中的含义:
private方法在Java当中的含义是只在当前类范围之内可以调用,当前类的子类也无法访问,但能被同一类别的其他对象实例调用,例如:
package com.javaeye;
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的定义有很大的区别:
1、在不同对象实例当中的作用域不同
Java当中,不管private还是protected的方法,都可以被同一个类别的其他对象实例调用;
Ruby当中,private方法不能被同一个类别的其他对象实例调用;
2、在类继承关系当中的作用域不同
ruby当中,不管private还是protected方法,都可以被子类继承;
Java当中,private方法不能被子类继承;
这种方法调用的差异,也许来自于不同的面向对象理念:Java的面向对象来自C++,强调类继承关系,所以方法调用限定类继承的层次结构当中的作用域,却不强调对象实例作用域;而ruby的面向对象来自smalltalk,即使是类别也是对象,因此方法调用作用域都是针对对象实例调用来设置的。
评论
dogstar
2007-06-12
java
ruby
继承 调用 public 子类均可 均可 protected 子类均可 包内 default 包内子类 包内 private 均不可 类定义本身
ruby
继承 调用 public 子类均可 均可 protected 子类均可 子类均可 private 子类均可 self
xvridan
2007-05-11
呵呵,打错了,
D类的对象不能访问D类的private方法,对象也不能访问其蓝图类的私有属性的方法和变量
D类的对象不能访问D类的private方法,对象也不能访问其蓝图类的私有属性的方法和变量
someone
2007-05-11
xvridan 写道:
java 代码
- package test;
- public class C {
- public void test(){
- D d = new D();
- d.getA();
- }
- }
- class D{
- private int a=0;
- private int getA(){
- return a;
- }
- }
什么叫“D类的对象不对访问D类的private方法”?
d.getA(); 就是D类的对象访问D类的“getA”方法?
不理解不要瞎说啊。
xvridan
2007-05-11
java 代码
- package test;
- public class C {
- public void test(){
- D d = new D();
- d.getA();
- }
- }
- class D{
- private int a=0;
- private int getA(){
- return a;
- }
- }
JGambler
2007-05-10
“protected方法在Java当中的含义是在当前类所在的整个package当中都可见,其他package类则无法访问;”
Boss,说错了吧,缺省情况下是包访问性,对protected保护成员来说,即使子类位于不同的package中,该子类也能够通过继承访问它啊~
Boss,说错了吧,缺省情况下是包访问性,对protected保护成员来说,即使子类位于不同的package中,该子类也能够通过继承访问它啊~
nanhuan5525
2007-05-04
>Java当中,不管private还是protected的方法,
>都可以被同一个类别的其他对象实例调用;
上面的compare方法可以调用private的getName方法是因为在同一类作用域里,而不是因为"可以被同一个类别的其他对象实例调用"吧,请指教.
>都可以被同一个类别的其他对象实例调用;
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();
}
}
上面的compare方法可以调用private的getName方法是因为在同一类作用域里,而不是因为"可以被同一个类别的其他对象实例调用"吧,请指教.
- 浏览: 1677832 次
- 性别:

- 来自: 上海

- 详细资料
搜索本博客
我的相册
游乌镇
共 33 张
共 33 张
链接
最新评论
-
mod_rails尝鲜
我觉得还是mod_fcgid(不是mod_fastcgi)实际点
-- by zgd -
mod_rails尝鲜
hostingrails也已经提供mod_rails了
-- by leondu -
mod_rails尝鲜
dreamhost已经提供mod_rails了
-- by zgd -
关于JavaEye网站未来发展 ...
期待第三阶段目标的实现,但第三目标好像类似于google的云计算,建议赶紧开发, ...
-- by selectme_2008 -
总结一下大家对JavaEye网 ...
javaeye是我比较喜欢的一个网站,但盈利模式还是比较单一,让人怀疑网站是否能 ...
-- by selectme_2008






评论排行榜