2016-08-09 5 views
0

親クラスの変数にその子からアクセスしようとしていますが、使用方法はわかりません。親から子へのパブリック変数の使い方は?

親クラスは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です:

どちらのjavaファイルが "tempsensor" と呼ばれる同じディレクトリにある、Mymain.javaは外tempsensorです。子クラスで

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

like- ディレクトリを見て、私はcmdと呼ばれる文字列を使用しようとしています。私はstatic Stringの再宣告によって使用しました、それは必要ですか?私はまた、子供にrunCmd()を使用したいと思います。子クラスでrunCmd()を使用すると、「エラー:無効なメソッド宣言、戻り値の型が必要」というエラーが表示されます。

子クラスで変数とクラスを使用する適切な方法は何ですか(SwitchTempSensor)?

+0

子クラスで 'runCmd()'を使用するのを止めることはありませんが、親クラスが子クラスの変数をオーバーライドのように使用するように思えます。しかし、Javaでは変数のオーバーライドはありません。おそらく 'cmd'と他の変数は、コンストラクタによって初期化されたインスタンス変数でなければなりませんか?あなたが何を求めているのか不明です。 – EJP

+0

子クラスでrunCmd()を使用すると、「エラー:無効なメソッド宣言、戻り値の型が必要です」というエラーが表示されます。 –

+0

コンパイルエラーが発生しましたか?あなたはそれらを自分で修正できると期待されています。あなたは実際に投稿を明確にしていません。 – EJP

答えて

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(); 
0

最初に、変数にアクセス修飾子が適用されていない場合、Javaで使用されるデフォルトのアクセス修飾子はpackage-privateであり、publicではありません。

public static String cmd ; 

は第二に、再宣言は必要ありません:あなたは、明示的のような変数宣言の前publicを指定する必要があります。これがデフォルトとpublicアクセス修飾子の両方に有効である

cmd = "value"; 

または

super.cmd = "value";

:あなたはとしてそれを直接使用することができます。

そして、継承されたクラスの変数にアクセスする最も良い方法は、その変数をprotectedと宣言することです。この方法では、継承されたクラスでのみアクセスできます。

+1

'default'は' switch'文のキーワードであり、アクセス修飾子ではありません。コードではないテキストにはコード書式を使用しないでください。 – EJP

+0

ポイントを取った.... – Batty

+0

私はcmd = "value";私が納得したとき、それは私にエラー "が期待された"を与えました。 –

0

変数を参照するには、super.cmdを呼び出してください。例えば、super.cmd = "some command"。 runCmd()メソッドを呼び出す場合はsuper.runCmd() と入力してください。 :)

0

デフォルトでは、変数にアクセス修飾子を指定しないと、Javaではpackage-privateとして設定されます。

親クラスの変数に子クラスがアクセスできるようにするには、子クラスをprotectedに設定します。

この例で考えてみましょう:あなたはtestChildren test = new testChildren();を使用して、クラスtestChildrenをインスタンス化するとき

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

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

を。出力は次のとおりです。あなたはまた、アクセス修飾子テーブルに興味があるかもしれない

apple

は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を使用していますが、それは誰もがそれを変更できることを意味するのでお勧めできません。

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クラスでは、SwitchTypeSensorのインスタンスでrunCmdを呼び出すと、wiで定義されたコマンド文字列を使用して、親クラス内で宣言されたメソッドを呼び出します薄いSwitchTypeSensor

+0

変数cmdについてはどうですか?どうも –

関連する問題