Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Das dachte ich mir, doch wo weise ich der Instanzvariablen den Wert zu? Etwa bei:
Java:
public Auto (int ps){ // wird hier Auto durch BMW erweitert? Hier ist int ps nämlich ein Parameter, sodass die 200 als Argument hier Sinn machen würden. Ansonsten wüsste ich nicht wo ich der Instanzvariablen den Wert zuweise...
this.ps = ps;
}
dieses "return this.ps;" greift gar nicht auf die private Instanzvariable "private int ps;" zurück, sondern auf die - in dem Falle - öffentliche(!) Instanzvariable "int ps", die als Parameter in der Methode Auto angegeben ist. Praktisch eine Setter- und Getter-Methode, richtig?
Doch wieso ist vor "public [wieso ist hier kein Rückgabetyp] Auto (int ps)" nichts?
Und wie gesagt, ist this.ps eigentlich keine lokale Instanzvariable? Wie kann also "return this.ps;" darauf zugreifen?
dieses "return this.ps;" greift gar nicht auf die private Instanzvariable "private int ps;" zurück, sondern auf die - in dem Falle - öffentliche(!) Instanzvariable "int ps", die als Parameter in der Methode Auto angegeben ist.
Du sagst ja, dass "this.ps" eine Instanzvariable ist, gleichzeitig aber, dass ich darauf nicht zugreifen kann bei "return this.ps;" (eben da es ja eine lokale Instanzvariable ist), doch wieso kommt dann überhaupt 200 raus? Versetzt
Java:
public Auto (int ps){
this.ps = ps;
}
hier "this.ps = 200" den Wert von "private int ps;" auf 200? Selbst wenn, ich kann doch trotzdem weiterhin nicht darauf zugreifen, da es ja private ist.
Übrigens lässt sich das gar nicht kompilieren (-.-):
Java:
Compiliere C:\Users\Alireza\Desktop\Ordnersammlung\Schule & Bildung\Informatik\Privat\Informatik Spielekiste\Parameter & Argumente\Wetterfrosch\halloman.java mit Java-Compiler
halloman.java:5:17: error: constructor BMW in class BMW cannot be applied to given types;
BMW myBmw = new BMW(200);
^
required: no arguments
found: int
reason: actual and formal argument lists differ in length
.\BMW.java:1:8: error: constructor Auto in class Auto cannot be applied to given types;
public class BMW extends Auto {
^
required: int
found: no arguments
reason: actual and formal argument lists differ in length
2 errors
Dass das nicht kompiliert ist klar. Zum einen passt der Modifier bei ps nicht, außerdem brauchst du einen Konstruktor in der Klasse BMW der den Konstruktor von Auto entsprechend aufruft.
Du sagst ja, dass "this.ps" eine Instanzvariable ist, gleichzeitig aber, dass ich darauf nicht zugreifen kann bei "return this.ps;"
Private Elemente, werden bei der Vererbung nicht mit vererbt!
Achja, du kannst innerhalb der Klasse auch auf als private deklarierte variablen zugreifen.
Nur von außen halt nicht Ich glaube, dass hast du noch nicht ganz verstanden, oder?
Return heißt ja, dass die (Public) methode deinen Wert zurück gibt.
Die Methode ist öffentlich.
Das attribut (ps) ist privat.
die öffentliche Methode kann zugreifen, und so einen Wert erfragen.
Der Benutzer kann aber nicht auf das private Attribut zugreifen, sodnern nur über die Methode (einen) Wert erfragen.
PS: Die Angegebenen Zeilen sind im Wesentlichen schonkorrekt. Aber, in welchem Context du das kompilierst sehen wir nicht.
Na ja, this.ps ist doch eine lokale Instanzvariable, also wie kann man in einer anderen Methode beim Aufruf "return this.ps;" noch darauf zugreifen? Die Instanzvariable ist schließlich nur in dem Block von "public Auto (int ps)" gültig...
Falls ich doch darauf zugreifen kann, dann ist mir alles klar ... auch wenn ich nicht verstehe, wie "this.ps" eine Instanzvariabe sein kann ohne jeglichen Typ oder so.
Wenn du ne Klasse definierst, meinetwegen die Klasse Auto (Public class Auto) und du willst eine Instanz dieser Klasse erzeugen, dann braucht es einen Konstruktor.
Der Konstruktor ist eine Methode in deiner Klasse Auto und hat den Namen Auto.
Java:
public class Auto
{
private int ps;
public Auto(int ps){
this.ps = ps;
}
}
wenn du jetzt mit "new" eine Instanz von Auto erzeugst
Code:
Auto bmw = new Auto(200);
bedeutet das, dass der Konstruktor aufgerufen wird. Dieser Konstruktor dient daszu gewisse Startkonditionen zu erzeugen. Bei deinem Konstruktor wird eben durch den Konstruktor der internen Variablen die Motorleistung in PS zugewiesen.
Du hast dann eine Instanz (Objekt) der Klasse Auto, in der gespeichert ist, wieviel ps das Auto hat.
Du kannst darauf aber nicht zugreifen.
Erst wenn du der Klasse auch noch eine öffentliche Methode mitgibst, die z.B. das Abfragen des Wertes ermöglicht..
Java:
public class Auto
{
private int ps;
public Auto(int ps){
this.ps = ps;
}
public int getPS(){
return (ps);
}
}
und du nun also ein Objekt der Klasse Auto erzeugst
Code:
Auto bmw = new Auto(200);
, dann kannst du anschliessend auch z.B. mit
Code:
System.out.println(bmw.getPS())
die Motorleistung anzeigen lassen.
Du greifst damit nicht direkt auf die interne Variable der Klasse zu, sondern deine Zugriffsmöglichkeiten werden über die öffentlichen Methoden geregelt.
Hast du nun auch noch deine Methode pimp() eingebaut
Java:
public class Auto
{
private int ps;
public Auto(int ps){
this.ps = ps;
}
public int getPS(){
return (ps);
}
public void pimp(){
this.ps += 20;
{
}
Java:
public class MeineAutos{
public static void main(String[] args)
{
Auto bmw = new Auto(200);
System.out.println(bmw.getPS());
bmw.pimp();
System.out.println(bmw.getPS());
bmw.pimp();
System.out.println(bmw.getPS());
bmw.pimp();
System.out.println(bmw.getPS());
}
}
dann führt jeder Aufruf von bmw.pimp(); zu einer Erhöhung der Motorleistung. Probiers einfach aus.
Meinst du mit "der internen Variablen" diese hier:
Java:
public class Auto
{
private int ps;
public Auto(int ps){ // <- diese hier: "int ps"? oder ...
this.ps = ps; // <- diese hier: "this.ps"?
}
public int getPS(){
return (ps);
}
}
Wenn eine Subclass instantiiert wird, wird normalerweise der default-Konstruktor der vererbenden Klasse aufgerufen. Da Auto aber schon einen Konstruktor hat ( public Auto (int ps) ), lässt sich der Code wahrscheinlich gar net compilieren
[EDIT]Mein Versuch bestätigt das:
cannot find symbol
symbol: constructor Auto()
location: class javaforum.Auto
Versteh nicht, was du sagen willst.
Der Code funktioniert .. fast. Man muss nur in der Klasse Auto die schliessende geschweifte Klammer richig herum machen.
Genau, mit interner Variablen meine ich diese private int ps.
Wenn du ein Objekt dieser Klasse anwendest, weisst du nicht bzw. musst nicht wissen, wie das intern gehandhabt wird.
Da könnten genausogut 2 interne Variablen sein. Eine, die immer den Anfangswert behält und eine andere, die nur Veränderungen erfasst. Dann könnte da eine Methode reset() sein, um wieder auf den Anfangswert zurückstellen.
Mit Objekt meine ich die Instanz deiner Klasse Auto, den bmw.
Du kannst auch noch andere Instanzen erzeugen z.B. audi, vwgolf, mitotyo oder wie sie alle heissen.
und bei der Erzeugung jedem dieser Objekte einen andere Motorleistung verpassen.
Versteh nicht, was du sagen willst.
Der Code funktioniert .. fast. Man muss nur in der Klasse Auto die schliessende geschweifte Klammer richig herum machen.
Das sind auch wieder Grundlagen: Ohne Angabe von super(...) wird immer der Standardkonstruktor aufgerufen. Weil der aber nicht vorhanden ist (weil ein anderer angegeben wurde), lässt sich der Code nicht compilieren
Freilich, wenn wir schon bis zur Vererbung vorgedrungen wären, hätte man dann vielleicht z.B. erklären müssen, dass, wenn es in der Elternklasse nur einen Konstruktor mit Parametern gibt, dieser dann in der erbenden Klasse auch explizit aufgerufen werden muss.
Java:
public class BMW extends Auto
{
// Konstruktor der Elternklasse aufrufen
public BMW(int ps) {
super (ps);
}
}
vielleicht warst du dann also auch schon etwas zu weit....