Java继承-找不到要在对象上调用的方法?

Java继承-找不到要在对象上调用的方法?,java,inheritance,methods,Java,Inheritance,Methods,首先,我有三节课。其中一个是: 温度(超类) 天气(子类超类) UseTempture(保存main方法的子类) 对于该程序,主要方法仅应以摄氏度和风速显示温度。但是我不知道问题出在哪里 我的问题是在UseTimperature中找不到setWindSpeed/getWindSpeed。 //TEMPERATURE: public class Temperature { private double degrees; public void setDegrees (doub

首先,我有三节课。其中一个是:

  • 温度(超类)

  • 天气(子类超类)

  • UseTempture(保存main方法的子类)

  • 对于该程序,主要方法仅应以摄氏度和风速显示温度。但是我不知道问题出在哪里

    我的问题是在UseTimperature中找不到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");
    
        }
    }
    

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

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

    您需要在TEMPAVALIURE类中声明setWindSpeed/getWindSpeed,或者

    Weather temp = new Weather ();
    
    原因是当你这样做的时候

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

    编译器只需查看getWindSpeed是否位于Temperature类内部。事实并非如此。因此它给出了编译错误

    温度
    类确实没有
    getWindSpeed
    setWindSpeed
    方法。只有子类
    Weather
    拥有这些方法。超类对子类一无所知。与其创建
    温度
    的实例,不如创建
    天气的实例

    使用温度实际上并没有扩展天气,而且无论如何它将无法访问(私有)setWindSpeed方法。如果要使其成为嵌套类,则可以访问它(有关详细信息,请参见),但这可能不是一个好的设计选项

    相反,如果UseTemperature是你的应用程序访问点,并且永远不会被实例化(比如在你发布的代码段中),考虑将SETWORKSTEEP的访问修饰符更改为更许可的东西,比如受保护甚至默认。这将允许您从同一个包中的类访问它,而无需对其进行子类化


    编辑:正如Reimeus指出的,必须实例化天气对象而不是温度对象。

    如何从
    温度
    访问
    设置风速
    获取风速
    。记住,所有的子类都是超类,但所有的超类都不是子类。您需要在
    Temperature
    中定义
    setWindSpeed
    getWindSpeed

    在定义access之后,像这样设置getWindSpeed和setWindSpeed

    Temperature t = new Weather();
    
    t.设置风速()等等


    也不要让这些方法在天气条件下成为私人的。只有在
    Temperature

    中将它们设置为public
    或至少设置为protected时,才能访问它们。您需要声明要在其他地方调用的public/protected方法。这是继承的一个非常糟糕的用法。它不认为天气就是温度。