如何在父对象中使用公共变量?

时间:2016-08-09 05:14:19

标签: java oop abstract-class

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

父类是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)中使用变量和类的正确方法是什么?

5 个答案:

答案 0 :(得分:1)

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

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

在类范围内,您无法调用方法,因此您无法执行以下操作:

class SwitchTempSensor {
    runCmd();
}

方法调用必须包含在方法中。因此,请删除cmdSwitchTempSensor的“重新声明”以及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();

答案 1 :(得分:1)

您尝试从父类中的方法访问子类中的值。这简直不会奏效。相反,如果实现真的是抽象的,那么您可以让子类通过父类知道的重写方法公开值:

抽象类:

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类中,当您在runCmd的实例上调用SwitchTypeSensor时,它将使用{{1}中定义的命令字符串调用父类中声明的方法}}

答案 2 :(得分:0)

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

public static String cmd ;

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

cmd = "value";

super.cmd = "value";

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

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

要允许子类访问其父变量,您可能需要将它们设置为protected

考虑这个例子:

public class testChildren extends testParent {
    public testChildren() {
        System.out.println(super.test);
    }
}

public class testParent {
    protected String test = "apple";
}

使用testChildren实例化课程testChildren test = new 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访问变量,但这不可取,因为这意味着每个人都可以修改它