Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用父子关系中的公共变量?_Java_Oop_Abstract Class - Fatal编程技术网

Java 如何使用父子关系中的公共变量?

Java 如何使用父子关系中的公共变量?,java,oop,abstract-class,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 t

我试图从父类的子类访问父类中的变量,但我不知道如何使用它

父类是
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
        }
    }
}
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()
}
public class SwitchTempSensor extends ATempSensor {

    @Override
    public String getCommand() {
        return "ousb io portb";
    }
}
子类是SwitchTempSensor:

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
        }
    }
}
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()
}
public class SwitchTempSensor extends ATempSensor {

    @Override
    public String getCommand() {
        return "ousb io portb";
    }
}
两个java文件都位于名为“tempsensor”的同一目录中,Mymain.java位于tempsensor之外。 目录看起来像-

Mymain.java
    |           
tempsensor       
    |----------SwitchTempSensor.java
    |----------ATempSensor.java
在子类中,我尝试使用名为
cmd
的字符串。我用过重新声明
静态字符串
,有必要吗?我还想在child中使用
runCmd()
。如果我在我的子类中使用runCmd(),我会得到一个错误,上面写着“error:invalid method declaration;return type required”


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

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

public static String cmd ;
第二,不需要重新澄清。您可以将其直接用作:

cmd = "value";

super.cmd=“value”

这对默认和
公共
访问修饰符都有效


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

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

public static String cmd ;
第二,不需要重新澄清。您可以将其直接用作:

cmd = "value";

super.cmd=“value”

这对默认和
公共
访问修饰符都有效


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

只需调用
super.cmd
即可引用变量。例如
super.cmd=“some command”
。如果要调用runCmd()方法,只需键入
super.runCmd()

希望这有帮助!:)

只需调用
super.cmd
即可引用变量。例如
super.cmd=“some command”
。如果要调用runCmd()方法,只需键入
super.runCmd()

希望这有帮助!:)

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

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

考虑这个例子:

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

public class testParent {
    protected String test = "apple";
}
当您使用
testChildren test=newtestchildren()实例化类
testChildren
。输出为

苹果

您可能还对Java文档中的access修饰符表感兴趣,该表位于以下位置:


基于此表,显然您也可以通过使用
public
来访问变量,但这是不可取的,因为这意味着默认情况下,如果您没有为设置为包私有的变量指定任何访问修饰符,则每个人都可以在Java中修改它

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

考虑这个例子:

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

public class testParent {
    protected String test = "apple";
}
当您使用
testChildren test=newtestchildren()实例化类
testChildren
。输出为

苹果

您可能还对Java文档中的access修饰符表感兴趣,该表位于以下位置:


基于此表,显然您也可以通过使用
public
来访问变量,但这并不可取,因为这意味着每个人都可以修改它我不确定您想要做什么。但我认为您需要的是
SwitchTempSensor
类中的构造函数

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

在类作用域中,不能调用方法,因此不能执行以下操作:

class SwitchTempSensor {
    runCmd();
}
new SwitchTempSensor();
SwitchTempSensor sensor = new SwitchTempSensor();
sensor.someMethod();
方法调用必须包含在方法中。因此,删除
SwitchTempSensor
cmd
的“重新声明”以及
runCmd()
调用

必须将方法调用和变量初始化放在方法或构造函数中。如果将其放入构造函数中,则在创建
SwitchTempSensor
对象时会初始化变量:

public SwitchTempSensor() {
    cmd = "ousb io portb ";
    runCmd();
}
您可以这样使用它:

class SwitchTempSensor {
    runCmd();
}
new SwitchTempSensor();
SwitchTempSensor sensor = new SwitchTempSensor();
sensor.someMethod();
您还可以将其放在一个方法中:

public void someMethod() {
    cmd = "ousb io portb ";
    runCmd();
}
您可以这样使用它:

class SwitchTempSensor {
    runCmd();
}
new SwitchTempSensor();
SwitchTempSensor sensor = new SwitchTempSensor();
sensor.someMethod();

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

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

在类作用域中,不能调用方法,因此不能执行以下操作:

class SwitchTempSensor {
    runCmd();
}
new SwitchTempSensor();
SwitchTempSensor sensor = new SwitchTempSensor();
sensor.someMethod();
方法调用必须包含在方法中。因此,删除
SwitchTempSensor
cmd
的“重新声明”以及
runCmd()
调用

必须将方法调用和变量初始化放在方法或构造函数中。如果将其放入构造函数中,则在创建
SwitchTempSensor
对象时会初始化变量:

public SwitchTempSensor() {
    cmd = "ousb io portb ";
    runCmd();
}
您可以这样使用它:

class SwitchTempSensor {
    runCmd();
}
new SwitchTempSensor();
SwitchTempSensor sensor = new SwitchTempSensor();
sensor.someMethod();
您还可以将其放在一个方法中:

public void someMethod() {
    cmd = "ousb io portb ";
    runCmd();
}
您可以这样使用它:

class SwitchTempSensor {
    runCmd();
}
new SwitchTempSensor();
SwitchTempSensor sensor = new SwitchTempSensor();
sensor.someMethod();

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

腹肌