Ruby中的private modifier与Java中的对比

先看一下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:

  1. 首先定义一个基础类型 ModifierCheck

    class 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
  2. 然后定义一个子类并且执行

    class ModifierCheckSub < ModifierCheck
      def public_check
        private_check
        "==>你不是已经私有了么。。"
      end
    end
    
    modifier = ModifierCheckSub.new
    puts modifier.public_check
  3. 最后执行结果

    我是一个私有方法70198988112100
    ==>你不是已经私有了么。。
  4. 上面可以发现在子类中可以调用父类的私有方法,与Java完全不同。

    这里如果要问,为何Java的例子完全不写个子类来调用一下父类的private方法?这个还用说么,还没到运行时,直接编译器都过不了。

  5. 接下来,来看一下在子类中是否可以override父类的私有方法,在子类中添加以下的部分:

    def private_check
      puts "我是覆盖私有方法的子方法"
    end
  6. 执行结果:

    我是覆盖私有方法的子方法
    ==>你不是已经私有了么。。
  7. 看,在子类中可以Override父类的私有方法。最后也许让我疑惑的私有在哪里,那么,来试一下最后这个。依然在子类中添加:

    def invokeOtherPrivateMethod(other)
      other.private_check
    end
    #而执行部分修改为:
    modifier = ModifierCheckSub.new
    modifier2 = ModifierCheck.new
    modifier.invokeOtherPrivateMethod modifier2
  8. 这个时候执行直接报错:

    in `invokeOtherPrivateMethod': private method `private_check' called for #<ModifierCheck:0x007f8bc2a13df8> (NoMethodError)
  9. 最终好像看出点什么,也许借鉴于Java与Ruby的静态/动态语言之分,

    private的访问级别:在Java中限制在同一个类中,而Ruby限制在同一个对象中。




转载于:https://my.oschina.net/elleneye/blog/406612

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值