zoukankan      html  css  js  c++  java
  • Variable shadowing

    Variable shadowing

     

    Today we’ll look into a rare feature of Java: variable shadowing

    First, let’s define what is a shadowed field or method:

    A field is considered shadowed when

    • a subclass of its declaring class declares a field with the same name and same
    • a variable having the same name and type is declared in the local scope
    • a method argument/parameter is declared with a same name and type

    I Local variable shadowing

    The above code will output

    count = 5

    because the count local variable declared at line 7 shadows the variable count declared at class level. If we want to access the instance variable, we need to add the thiskeyword.

    II Method argument shadowing

    This situation is very common even though we do not pay much attention to it. Below is a simple getter definition

    The this keyword is mandatory to resolve the ambiguity. Without this, the compiler cannot know whether we are assigning the count method argument value to itself. If you remove the this keyword, you would get a compilation warning anyway.

    III Superclass field shadowing

    Let’s consider the following classes:

    The execution gives:

    val = SUPER_VAL

    The val field has been declared in the SuperClass but is shadowed in the ChildClassbecause the latter declares another field with same name and type. Although theChildClass has been instantiated with “CHILD_VAL”, the execution of child.display()gives you “SUPER_VAL”.

    The reason is simple. When the child instance is created, there are 2 variables val. The one from SuperClass with value “SUPER_VAL” and the one from ChildClass with injected value “CHILD_VAL” through constructor.

    When the display() method is called, since it is define in the SuperClass, it is the val field in the context of SuperClass which is used. Not surprising that the output shows “SUPER_VAL”.

    In the above modified code, we force the value for the hidden val field in SuperClasswith super.val = value, and the output gives:

    val = CHILD_VAL

    Now let’s add another class in the hierarchy

    Obviously, the output will display

    val = SUPER_VAL

    The question now is: what if we want to display the val value of AncestorClass ? Obviously the super keyword only refers to the first parent class up in the class hierarchy.

    Casting comes to the rescue. Indeed we can force the this keyword representing the current class instance to a particular type in the class hierarchy !

    This time, we do have

    val = ANCESTOR_VAL

  • 相关阅读:
    ZT Android Debuggerd的分析及使用方法
    使用信号进行同步 sem_post
    linux c编程调用系统的动态库时,要使用dlopen等函数吗?
    Android系统的智能指针(轻量级指针、强指针和弱指针)的实现原理分析
    linux的pthread_self与gettid的返回值和开销的区别
    转贴:参禅与悟道》——浅谈人生
    my target
    转贴:如何学好C++语言.docx
    [EffectiveC++]item24:若所有参数皆需类型转换,请为此采用non-member函数
    [EffectiveC++]item23:Prefer non-member non-friend functions to member functions
  • 原文地址:https://www.cnblogs.com/hephec/p/4556602.html
Copyright © 2011-2022 走看看