【问题标题】:Java Inheritance - cannot find method to invoke on object?Java继承-找不到在对象上调用的方法?
【发布时间】:2013-02-09 16:59:16
【问题描述】:

首先,我有三门课。一个叫:

  1. 温度(超类)

  2. 天气(子类超类)

  3. UseTemperature(包含 main 方法的子类)

对于这个程序,主要方法应该只显示摄氏温度和风速。虽然不知道是什么问题..

我的问题是在 UseTemperature 中找不到 setWindSpeed/getWindSpeed。

//TEMPERATURE:

public class Temperature
{
    private double degrees;


    public void setDegrees (double degrees)
    {
        this.degrees = degrees;
    }


    public double getDegrees ()
    {
        return degrees;
    }

/////////////////////////////////////////////////////////////////////////////////////////
//WEATHER:

public class Weather extends Temperature
{
    private double windspeed; // Number + km/h

    private void setWindSpeed (double windspeed) //setter
    {
        this.windspeed = windspeed;
    }


    public double getWindSpeed ()  //getter
    {
        return windspeed;
    }
}
/////////////////////////////////////////////////////////////////////////////////////////
//USE TEMPERATURE:

class UseTemperature // can be public but makes no diffrence
{
    public static void main (String args[])
    {
        Temperature temp;

        temp = new Temperature ();

        temp.setDegrees (40.0);      
        temp.setWindSpeed (70.0); // NOT FOUND IN TEMPERATURE

        System.out.print (temp.getDegrees ());
        System.out.print (" degrees ");

        System.out.println (temp.getWindSpeed()); // NOT FOUND IN TEMPERATURE
        System.out.println (" km/h");

    }
}

【问题讨论】:

  • 您需要声明要在其他地方调用的公开/受保护方法。
  • 这里对继承的使用非常糟糕。它不支持天气 IS_A 温度。

标签: java inheritance methods


【解决方案1】:

Temperature 不包含方法setWindSpeedgetWindSpeed。您需要创建一个 Weather 对象并让这些方法可以访问以调用它们。

Weather myWeather = new Weather();
// set/get ...

【讨论】:

    【解决方案2】:

    您需要在温度类中声明 setWindSpeed/getWindSpeed 或这​​样做

    Weather temp = new Weather ();
    

    原因是当你这样做的时候

    Temperature temp;
     temp = new Temperature ();
     temp.getWindSpeed()
    

    编译器只是查看 getWindSpeed 是否位于 Temperature 类中。它不是。所以它给出了编译错误

    【讨论】:

      【解决方案3】:

      Temperature 类确实没有getWindSpeedsetWindSpeed 方法。只有子类Weather 拥有这些方法。超类对子类一无所知。不要创建Temperature 的实例,而是创建Weather 的实例

      【讨论】:

        【解决方案4】:

        UseTemperature 实际上并没有扩展 Weather,而且无论如何它都无法访问(私有)setWindSpeed 方法。如果要将其设为嵌套类,您可以访问它(有关详细信息,请参阅http://docs.oracle.com/javase/tutorial/java/javaOO/nested.html),但这可能不是一个好的设计选项。

        相反,如果 UseTemperature 是您的应用程序访问点并且永远不会被实例化(就像在您发布的 sn-p 中一样),请考虑将 setWindSpeed 的访问修饰符更改为更宽松的内容,例如 protected 甚至 默认。这将允许您从同一个包中的类访问它,而无需对其进行子类化。

        编辑:另外,正如 Reimeus 指出的,必须实例化 Weather 对象而不是 Temperature 对象。

        【讨论】:

          【解决方案5】:

          如何从Temperature 访问setWindSpeedgetWindSpeed。请记住,所有子类都是超类,但所有超类都不是子类。您需要在Temperature 中定义setWindSpeedgetWindSpeed

          像这样定义访问getWindSpeed和setWindSpeed之后。

          Temperature t = new Weather();
          

          t.setWindSpeed(); 等等。

          也不要在 Weather 中将这些方法设为私有。只有在 public 或至少在 Temperature 中创建 protected 时才能访问它们。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-10-17
            • 2013-01-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-10-17
            相关资源
            最近更新 更多