2016-08-09 108 views
0

Ich versuche, auf die Variablen in einer Elternklasse von seinem Kind zuzugreifen, aber ich weiß nicht, wie man es benutzt.Wie verwenden Sie die öffentlichen Variablen in Eltern zu Kind?

Die Elternklasse ist 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 
     } 
    } 
} 

Das Kind Klasse ist SwitchTempSensor:

Beide Java-Dateien im selben Verzeichnis sind genannt "TEMPSENSOR", Mymain.java außerhalb TEMPSENSOR ist. Verzeichnis Blick wie-

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

In der Kind-Klasse, ich versuche die Zeichenfolge cmd genannt zu verwenden. Ich habe verwendet, indem Sie static String redefinieren, ist es notwendig? Ich möchte auch die runCmd() in Kind verwenden. Wenn ich runCmd() in meiner Kind-Klasse verwende, habe ich den Fehler "error: invalid method declaration; Rückgabetyp required" erhalten.

Was ist der richtige Weg, um Variable und Klasse in Kind-Klasse (SwitchTempSensor) zu verwenden?

+0

Nichts hält Sie davon ab, 'runCmd()' in der Kindklasse zu verwenden, aber es klingt so, als ob die Elternklasse die Variablen der Kindklasse als Überschreibungen verwenden soll, nicht umgekehrt wie in Ihrer Frage angegeben. In Java gibt es jedoch kein Überschreiben von Variablen. Möglicherweise sollten 'cmd' und andere Variablen Instanzvariablen sein, die vom Konstruktor initialisiert wurden? Unklar, was du verlangst. – EJP

+0

Wenn ich runCmd() in meiner Kindklasse verwende, habe ich den Fehler "error: invalid method declaration; Rückgabetyp required" erhalten. –

+0

Sie haben also einen Kompilierungsfehler? Es wird erwartet, dass Sie diese selbst beheben können. Sie haben Ihren Beitrag nicht wirklich geklärt. – EJP

Antwort

1

Ich bin mir nicht genau sicher, was Sie tun möchten. Aber ich denke, was Sie brauchen, ist ein Konstruktor in der SwitchTempSensor Klasse.

Erste Dinge zuerst, es ist nicht notwendig, cmd wieder zu deklarieren. Das ist der ganze Sinn der Vererbung!

Im Klassenbereich, können Methoden nicht nennen, so dass Sie nicht so etwas tun kann:

class SwitchTempSensor { 
    runCmd(); 
} 

Methodenaufrufe in Methoden enthalten sein müssen. Löschen Sie also die "redeclaration" von cmd in SwitchTempSensor und auch den runCmd() Aufruf.

Sie müssen den Methodenaufruf und die Variableninitialisierung in eine Methode oder einen Konstruktor einfügen. Wenn Sie es im Konstruktor gesetzt, wird die Variable initialisiert, wenn ein SwitchTempSensor Objekt erstellt:

public SwitchTempSensor() { 
    cmd = "ousb io portb "; 
    runCmd(); 
} 

Und Sie können es wie folgt verwenden:

new SwitchTempSensor(); 

Sie auch in einem Verfahren setzen können :

public void someMethod() { 
    cmd = "ousb io portb "; 
    runCmd(); 
} 

Und Sie es wie folgt verwenden können:

SwitchTempSensor sensor = new SwitchTempSensor(); 
sensor.someMethod(); 
0

Als erstes, wenn kein Zugriffsmodifikator auf eine Variable angewendet wird, ist der von java verwendete Standardzugriffsmodifikator package-private, nicht public. Sie müssen explizit public vor Variablendeklaration angeben:

public static String cmd ; 

Zweitens wird erneut deklariert werden nicht benötigt.

cmd = "value"; 

oder

super.cmd = "value";

Dies gilt sowohl für Standard- und public Zugriffsmodifikatoren: Sie können es direkt als verwenden.

Und die beste Möglichkeit, auf eine Variable in der geerbten Klasse zuzugreifen, besteht darin, diese Variable als protected zu deklarieren. Auf diese Weise ist es nur in der geerbten Klasse verfügbar.

+1

'default' ist ein Schlüsselwort in der Anweisung' switch', kein Zugriffsmodifikator. Verwenden Sie keine Codeformatierung für Text, der kein Code ist. – EJP

+0

Punkt genommen .... – Batty

+0

wenn ich cmd = "Wert" verwende; wenn ich complie es gab mir Fehler " erwartet". –

0

Rufen Sie einfach super.cmd an, um auf die Variable zu verweisen. Zum Beispiel super.cmd = "some command". Wenn Sie die runCmd() Methode aufrufen möchten, geben Sie einfach super.runCmd() ein Hope this help! :)

0

Wenn Sie in Java standardmäßig keinen Zugriffsmodifizierer für eine Variable angeben, wird dieser als Paket privat festgelegt.

Damit die untergeordnete Klasse auf die Variablen ihres übergeordneten Elements zugreifen kann, müssen Sie sie möglicherweise auf protected setzen.

Betrachten Sie dieses Beispiel:

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

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

Wenn Sie die Klasse testChildren mit testChildren test = new testChildren(); instanziiert.Die Ausgabe ist;

apple

Sie könnten auch in der Java-Dokumentation in der Zugriffsmodifikator Tabelle gefunden hier angemerkt interessieren: 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 

Basierend auf dieser Tabelle offensichtlich können Sie auch die Variablen zugänglich machen, indem mit public aber das ist nicht ratsam, da es bedeutet, dass jeder in der Lage wäre, es zu ändern

1

Sie versuchen, auf einen Wert in Ihrer untergeordneten Klasse von einer Methode in der übergeordneten Klasse zuzugreifen. Das wird einfach nicht funktionieren. Stattdessen, wenn die Umsetzung wirklich abstrakt ist, können Sie das Kind Klasse haben den Wert durch eine überschriebene Methode machen, die die Elternklasse kennt:

Abstrakte Klasse:

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"; 
    } 
} 

Wenn Sie in Ihrer MyMain-Klasse runCmd für eine Instanz von SwitchTypeSensor aufrufen, ruft sie die in der übergeordneten Klasse deklarierte Methode auf, wobei die mit wi definierte Zeichenfolge verwendet wird dünn SwitchTypeSensor.

+0

Was ist mit der Variable cmd? Danke –