【问题标题】:How to use the public variables in parent to child?如何使用父子中的公共变量?
【发布时间】:2016-08-09 05:14:18
【问题描述】:

我正在尝试从其子类访问父类中的变量,但我不知道如何使用它。

父类是ATempSensor:

public abstract class ATempSensor {  // abstract=can have children inherit
                                    //  from this class, but no instantiation.
    static String cmd ;        // command to send to shell.
    static String cmd_result ; // Line returned by command.
    static int    cmd_number ; // if command just returned a number, here it is. 

    public void runCmd() {
        try {
            Runtime run = Runtime.getRuntime(); // get runtime shell.
            Process pr = run.exec(cmd);         // start command.
            pr.waitFor() ;                       // wait for command to finish.       
            BufferedReader buf = new BufferedReader  // get output from command.
            ( new InputStreamReader( pr.getInputStream() ) );
            cmd_result = buf.readLine();
            cmd_number = Integer.parseInt(cmd_result);
        }
        catch (Exception e ) { // can get exceptions for exec, waitfor, parseInt
        }
    }
}

子类是SwitchTempSensor:

package tempsensor ;                    // added to define membership of package.
import java.io.* ;

public class SwitchTempSensor extends ATempSensor{
    //--- class member data (variables) are called fields.

    static String cmd= "ousb io portb ";
    runCmd()
}

两个 java 文件都在同一个名为“tempsensor”的目录中,Mymain.java 在 tempsensor 之外。 目录看起来像-

Mymain.java
    |           
tempsensor       
    |----------SwitchTempSensor.java
    |----------ATempSensor.java

在子类中,我尝试使用名为cmd 的字符串。我已经用static String重新声明了,有必要吗?我也想在孩子中使用runCmd()。如果我在子类中使用 runCmd(),我会收到错误消息“错误:方法声明无效;需要返回类型”。

在子类 (SwitchTempSensor) 中使用变量和类的正确方法是什么?

【问题讨论】:

  • 没有什么能阻止你在子类中使用runCmd(),但听起来你希望父类使用子类的变量,就好像它们是覆盖一样,而不是如中所述你的问题。但是,Java 中没有变量覆盖。可能cmd等变量应该是构造函数初始化的实例变量吧?不清楚你在问什么。
  • 如果我在我的子类中使用 runCmd(),我会收到错误消息“错误:方法声明无效;需要返回类型”。
  • 所以你遇到了编译错误?您应该能够自己解决这些问题。你实际上并没有澄清你的帖子。

标签: java oop abstract-class


【解决方案1】:

我不确定你想做什么。但我认为您需要的是 SwitchTempSensor 类中的构造函数。

首先,没有必要再次声明cmd。这就是继承的全部意义!

在类作用域中,不能调用方法,所以不能做这样的事情:

class SwitchTempSensor {
    runCmd();
}

方法调用必须包含在方法中。所以删除SwitchTempSensorcmd的“重新声明”以及runCmd()调用。

您必须将方法调用和变量初始化放在方法或构造函数中。如果你把它放在构造函数中,这个变量会在创建SwitchTempSensor对象时初始化:

public SwitchTempSensor() {
    cmd = "ousb io portb ";
    runCmd();
}

你可以这样使用它:

new SwitchTempSensor();

你也可以把它放在一个方法中:

public void someMethod() {
    cmd = "ousb io portb ";
    runCmd();
}

你可以这样使用它:

SwitchTempSensor sensor = new SwitchTempSensor();
sensor.someMethod();

【讨论】:

    【解决方案2】:

    您正试图从父类中的方法访问子类中的值。那根本行不通。相反,如果实现确实是抽象的,您可以让子类通过父类知道的重写方法公开值:

    抽象类:

    public abstract class ATempSensor {
    
        abstract public String getCommand();
    
        public void runCmd() {
    
            try {
                Runtime run = Runtime.getRuntime();
                Process pr = run.exec(getCommand());
                pr.waitFor() ;
    
                BufferedReader buf = new BufferedReader
                ( new InputStreamReader( pr.getInputStream() ) );
    
                String cmd_result = buf.readLine();
                int cmd_number = Integer.parseInt(cmd_result);
            }
            catch (Exception e ) {
                // ...
            }
        }
    }
    

    SwitchTempSensor:

    public class SwitchTempSensor extends ATempSensor {
    
        @Override
        public String getCommand() {
            return "ousb io portb";
        }
    }
    

    在您的MyMain 类中,当您在SwitchTypeSensor 的实例上调用runCmd 时,它将使用SwitchTypeSensor 中定义的命令字符串调用父类中声明的方法。

    【讨论】:

      【解决方案3】:

      只需调用super.cmd 即可引用该变量。例如super.cmd = "some command"。如果你想调用 runCmd() 方法,只需输入 super.runCmd() 希望这可以帮助! :)

      【讨论】:

        【解决方案4】:

        首先,如果没有对变量应用访问修饰符,java 使用的默认访问修饰符是 package-private,而不是public。您必须在变量声明之前明确指定public

        public static String cmd ;
        

        其次,不需要重新声明。您可以直接将其用作:

        cmd = "value";
        

        super.cmd = "value";

        这对 default 和 public 访问修饰符都有效。

        在继承类中访问变量的最佳方法是将变量声明为protected。这样它只能在继承的类中访问。

        【讨论】:

        • defaultswitch 语句中的关键字,而不是访问修饰符。不要对非代码文本使用代码格式。
        • 如果我使用 cmd="value";当我遵守它时,它给了我错误“ expected”。
        【解决方案5】:

        默认情况下,如果您没有为变量指定任何访问修饰符,则在 Java 中将其设置为包私有。

        要允许子类访问其父类的变量,您可能正在考虑将它们设置为 protected

        考虑这个例子:

        public class testChildren extends testParent {
            public testChildren() {
                System.out.println(super.test);
            }
        }
        
        public class testParent {
            protected String test = "apple";
        }
        

        当您使用testChildren test = new testChildren(); 实例化类testChildren 时。输出是;

        苹果

        您可能还对 此处的 Java 文档中提到的访问修饰符表感兴趣: https://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html

        Access Levels
        Modifier    Class   Package Subclass    World
        public       Y         Y       Y          Y
        protected    Y         Y       Y          N
        no modifier  Y         Y       N          N
        private      Y         N       N          N
        

        基于此表,显然您也可以使用public 使变量可访问,但这是不可取的,因为这意味着每个人都可以修改它

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-06-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-01-09
          相关资源
          最近更新 更多