【问题标题】:Accessing outer class from within inner class using outerClass.this使用 outerClass.this 从内部类中访问外部类
【发布时间】:2017-08-18 22:32:55
【问题描述】:

-non-static- 内部类可以完全访问外部类的所有常规成员。但是还有另一种方法可以使用 (outerClass.this.regularMember).. 访问这些成员,请查看以下代码:

public class Car {
  int x = 3;
  public static int hp =6;
  public void move()
  {
    System.out.println(hp);
  }

  public  class Engine{
     public int hp =5;
     public int capacity; 
     public void start()
     {
        Car.this.move(); // or we can use only move();
     }

  }
}
  1. 能否解释一下使用Car.this.move();move(); 之间是否存在任何实际区别?
  2. 你如何解释这种 Car.this. 的语法,因为据我了解 this 这里指的是 Type Engine 的对象 但是,如果我使用另一个参考,例如 Engine smallEngine = new Engine();then this 关键字不能被 smallEngine 替代。

【问题讨论】:

    标签: java this inner-classes outer-classes


    【解决方案1】:
    1. 如果您的Engine 类有move 方法,那么move() 将不同于Car.this.move()

    2. this 表示当前实例。当您想引用外部类时,您可以使用外部类限定this 关键字来引用外部类的实例。要记住的重要一点是Engine 的实例(因为它不是静态的)总是伴随着Car 的实例,因此您可以参考它。

    您不能说OuterClass.smallEngine.move(),因为这会与访问OuterClass 的静态公共字段的语法冲突。

    如果OuterClass 有这样的字段:

     public static String smallEngine;
    

    ...那么上面的语法将是模棱两可的。因为this 是一个关键字,所以你不能有一个名为this 的字段,因此OuterClass.this 的语法永远不会有歧义。

    【讨论】:

    • 但是我是否理解(outerClass.this)在这种情况下只是一个关键字(例如:super)? ...,以及您对“这个关键字不能被 smallEngine 替代”的更多看法 - 在最初的问题中..,请提前帮助我。
    • OuterClass.this 基本上表示“OuterClass 的当前实例”(仅当您在该类的内部类中时才有效)。澄清了答案中的另一种情况。
    猜你喜欢
    • 1970-01-01
    • 2011-01-02
    • 1970-01-01
    • 2014-02-11
    • 1970-01-01
    • 2017-05-31
    • 2011-02-13
    • 2021-03-13
    相关资源
    最近更新 更多