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();
您正试图从父类中的方法访问子类中的值。那根本行不通。相反,如果实现确实是抽象的,则可以让子类通过父类知道的重写方法公开值:
腹肌