【问题标题】:Java implicit methods/parameters?Java隐式方法/参数?
【发布时间】:2012-04-08 19:55:36
【问题描述】:

我目前正在阅读一本关于 Android 编程的书,并且在开始的章节中有一个很好的 Java 参考指南。但是,我偶然发现了一些我不太了解的隐式参数。

他定义了Car类:

public class Car {
  public void drive() {
    System.out.println("Going down the road!");
  }
}

然后他继续说:

public class JoyRide {
 private Car myCar;

 public void park(Car auto) {
   myCar = auto;
 }

 public Car whatsInTheGarage() {
   return myCar;
 }

 public void letsGo() {
   park(new Ragtop()); // Ragtop is a subclass of Car, but nevermind this.
   whatsInTheGarage().drive(); // This is the core of the question.
 }
}

我只想知道当 JoyRide 不是 Car 的扩展时,我们如何从 Car 类调用 drive()。是因为方法 whatsInTheGarage() 的返回类型为 Car,因此它“以某种方式”继承自该类?

谢谢。

【问题讨论】:

    标签: java parameters implicit


    【解决方案1】:

    想想这段代码:

    whatsInTheGarage().drive();
    

    作为这个的简写:

    Car returnedCar = whatsInTheGarage();
    returnedCar.drive();
    

    现在清楚了吗?所有具有-like 语法的 C-like 语言的行为都是这样的。

    更新:

    myCar.drive();  //call method of myCar field
    
    Car otherCar = new Car();
    otherCar.drive();  //create new car and call its method
    
    new Car().drive()  //call a method on just created object
    
    public Car makeCar() {
      return new Car();
    }
    
    Car newCar = makeCar();  //create Car in a different method, return reference to it
    newCar.drive();
    
    makeCar().drive();  //similar to your case
    

    【讨论】:

    • 我不会说 Java 是一种类似 C 的语言。
    • @AshBurlaczenko:我说的是语法,我指的是像 C、C++、C#、Java、JavaScript 这样的语言...... - 我会澄清一下
    • 所以你的意思是;由于 myCar 类型的 Car 是从 whatsInTheGarage 中返回的,我们可以从返回的值中调用 Car 类型的方法..?但我不明白...... whatsInTheGarage 也没有返回一个对象,也不是(在你的例子中)returnCar 是 Car 的一个实例......它只是一个 Car 类型的变量。
    • @yackyackyack:我在回答中添加了大量示例,请仔细研究它们。还可以考虑从一本纯 Java 的书开始学习基础知识。 Android 书籍中关于 Java 的小章节可能不足以学习编程基础知识。
    • 我确实学习了基础知识。我刚刚读错了代码......我认为 myCar 没有被实例化(忽略 park(new Ragtop())):D。但是非常感谢你,伙计......愚蠢的事情要忽略,但添加的例子对我来说很有价值。已收藏!
    【解决方案2】:

    whatsInTheGarage 返回一个Car。您在它返回的实例上调用drive。不是JoyRide继承了方法,JoyRide是在完全独立的对象上调用方法。

    【讨论】:

      【解决方案3】:

      排队

      whatsInTheGarage().drive()
      

      您正在对从whatsInTheGarage 返回的对象调用drive 方法。 JoyRide 本身与 Car 无关的事实在这里无关紧要,因为您不是试图在 JoyRide 对象上调用 drive。由于whatsInTheGarage 返回一个Car,并且您在从whatsInTheGarage 返回的对象上调用drive,这将在Car 对象上调用drive;具体来说,whatsInTheGarage 返回的 Car。这与继承没有任何关系 - 相反,您只是在一个对象上调用一个方法,该对象属于专门声明该方法的类类型。

      希望这会有所帮助!

      【讨论】:

      • 这对我来说很有意义,谢谢兄弟。我意识到我忽略了对象实际上是在代码中实例化的......这就是为什么我无法弄清楚如何从未实例化的对象调用 drive()。 :)
      【解决方案4】:

      您的假设是正确的,因为该方法返回一个 Car,它可以调用 Car 方法。

      【讨论】:

        【解决方案5】:

        不要忘记 Joyride 类有一个 Car 类型的字段。由于这个原因,您可以使用该字段调用 Car 类的方法。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-11-09
          • 2016-12-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-02-10
          • 1970-01-01
          相关资源
          最近更新 更多