我正在尝试从其子类访问父类中的变量,但我不知道如何使用它。
父类是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
)中使用变量和类的正确方法是什么?
答案 0 :(得分:1)
我不确定你想做什么。但我认为你需要的是SwitchTempSensor
类中的构造函数。
首先,没有必要再次声明cmd
。这就是继承的全部要点!
在类范围内,您无法调用方法,因此您无法执行以下操作:
class SwitchTempSensor {
runCmd();
}
方法调用必须包含在方法中。因此,请删除cmd
中SwitchTempSensor
的“重新声明”以及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
访问变量,但这不可取,因为这意味着每个人都可以修改它