The concept of shadowing

前端 未结 2 1888
走了就别回头了
走了就别回头了 2020-12-20 00:53

Given the following code:

public class A {
 static final long tooth = 1L;

 static long tooth(long tooth){
  System.out.println(++tooth);
  return ++tooth;
          


        
相关标签:
2条回答
  • 2020-12-20 01:21

    There's nothing magical about shadowing as a concept. It's simply that a reference to a name will always be referencing the instance within the nearest enclosing scope. In your example:

    public class A {
     static final long tooth#1 = 1L;
    
     static long tooth#2(long tooth#3){
      System.out.println(++tooth#3);
      return ++tooth#3;
     }
    
     public static void main(String args[]){
      System.out.println(tooth#1);
      final long tooth#4 = 2L;
      new A().tooth#2(tooth#4);
      System.out.println(tooth#4);
    }
    

    }

    I've annotated each instance with a number, in the form "tooth#N". Basically any introduction of a name that is already defined somewhere else will eclipse the earlier definition for the rest of that scope.

    0 讨论(0)
  • 2020-12-20 01:28

    When you are at this point

    System.out.println(tooth);
    

    the class property (static final long tooth = 1L;) is used, then a new tooth is declared, which shadows the class property, meaning that it is used instead of that.

    Inside the tooth method the tooth variabile is passed as value, it will not be modified, you can see this by executing the main which gives:

    1
    3
    2
    
    0 讨论(0)
提交回复
热议问题