Vererbung (Java): Unterschied zwischen den Versionen

Aus Byte-Welt Wiki
Zur Navigation springenZur Suche springen
K
 
(9 dazwischenliegende Versionen von 3 Benutzern werden nicht angezeigt)
Zeile 6: Zeile 6:
  
 
{|
 
{|
|style="width:30em"|<code=java>     
+
|style="width:30em"|<syntaxhighlight lang="java">     
 
       
 
       
 
                                           
 
                                           
Zeile 20: Zeile 20:
 
     
 
     
 
     
 
     
 +
   
 
     
 
     
 
     
 
     
Zeile 28: Zeile 29:
 
     
 
     
 
            
 
            
</code=java>
+
</syntaxhighlight>
 
|style="width:1em"|
 
|style="width:1em"|
|style="width:30em"|<code=java>import javax.swing.*;
+
|style="width:30em"|<syntaxhighlight lang="java">import javax.swing.*;
 
import java.awt.*;
 
import java.awt.*;
  
public class myProgram {
+
public class MyProgram {
  
 
   public static void main(String[] args) {
 
   public static void main(String[] args) {
Zeile 48: Zeile 49:
 
     f.add(p);
 
     f.add(p);
 
     f.pack();
 
     f.pack();
 +
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 
     f.setVisible(true);
 
     f.setVisible(true);
 
   }
 
   }
  
}</code=java>
+
}</syntaxhighlight>
 
|}
 
|}
  
Zeile 59: Zeile 61:
 
Betrachten wir uns nun ''JFrame''. Man kann in Java eine neue Klasse erstellen (sofern die Klasse, von der sie sich ableitet, nicht "''private''" ist), die sämtliche Eigenschaften der Klasse, von der sie abgeleitet wurde, erbt.
 
Betrachten wir uns nun ''JFrame''. Man kann in Java eine neue Klasse erstellen (sofern die Klasse, von der sie sich ableitet, nicht "''private''" ist), die sämtliche Eigenschaften der Klasse, von der sie abgeleitet wurde, erbt.
  
In folgendem Programm habe ich nun eine Klasse ''myFrame'' erstellt, die mittels ''extends'' von der Klasse ''JFrame'' alle Eigenschaften erbt:
+
In folgendem Programm habe ich nun eine Klasse ''MyFrame'' erstellt, die mittels ''extends'' von der Klasse ''JFrame'' alle Eigenschaften erbt:
 
{|
 
{|
|style="width:30em"|<code=java>import javax.swing.*;
+
|style="width:30em"|<syntaxhighlight lang="java">import javax.swing.*;
  
public class myFrame extends JFrame{
+
public class MyFrame extends JFrame {
   myFrame(String name) {
+
   MyFrame(String name) {
 
     super(name);
 
     super(name);
 
   }
 
   }
Zeile 75: Zeile 77:
 
     
 
     
 
     
 
     
 +
   
 
     
 
     
 
     
 
     
Zeile 83: Zeile 86:
 
     
 
     
 
     
 
     
</code=java>
+
</syntaxhighlight>
 
|style="width:1em"|
 
|style="width:1em"|
|style="width:30em"|<code=java>import javax.swing.*;
+
|style="width:30em"|<syntaxhighlight lang="java">import javax.swing.*;
 
import java.awt.*;
 
import java.awt.*;
  
public class myProgram {
+
public class MyProgram {
  
 
   public static void main(String[] args) {
 
   public static void main(String[] args) {
     myFrame f = new myFrame("My Window");
+
     MyFrame f = new MyFrame("My Window");
 
     JPanel p = new JPanel();
 
     JPanel p = new JPanel();
 
     JButton b1 = new JButton("Button 1");
 
     JButton b1 = new JButton("Button 1");
Zeile 103: Zeile 106:
 
     f.add(p);
 
     f.add(p);
 
     f.pack();
 
     f.pack();
 +
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 
     f.setVisible(true);
 
     f.setVisible(true);
 
   }
 
   }
  
}</code=java>
+
}</syntaxhighlight>
 
|}
 
|}
  
Im Programm ''myProgram'' wird nun ''myFrame'' auch genau so genutzt und behandelt wie zuvor ''JFrame''. Und das Ergebnis ist ebenfalls gleich.
+
Im Programm ''MyProgram'' wird nun ''MyFrame'' auch genau so genutzt und behandelt wie zuvor ''JFrame''. Und das Ergebnis ist ebenfalls gleich.
In ''myProgram'' wird ''myFrame'' genau ein Argument übergeben: Der String "''My Window''".
+
In ''MyProgram'' wird ''MyFrame'' genau ein Argument übergeben: Der String "''My Window''".
Die Anzahl und Art der Argumente muss im Konstruktor von der ''myFrame''-Klasse auch vorkommen: ''myFrame(String name)''.
+
Die Anzahl und Art der Argumente muss im Konstruktor von der ''MyFrame''-Klasse auch vorkommen: ''MyFrame(String name)''.
 
Und damit dieses Argument wiederum auch an das eigentliche ''JFrame'' übergeben wird, steht dort ''super(name)''.
 
Und damit dieses Argument wiederum auch an das eigentliche ''JFrame'' übergeben wird, steht dort ''super(name)''.
  
''myFrame'' ist ein neues Objekt. Ich kann ihm sämtliche Eigenschaften meines Programms geben:
+
''MyFrame'' ist ein neues Objekt. Ich kann ihm sämtliche Eigenschaften meines Programms geben:
 
{|
 
{|
|style="width:30em"|<code=java>import javax.swing.*;
+
|style="width:30em"|<syntaxhighlight lang="java">import javax.swing.*;
 
import java.awt.*;
 
import java.awt.*;
  
public class myFrame extends JFrame{
+
public class MyFrame extends JFrame {
  
   myFrame() {
+
   MyFrame() {
 
     super("My Window");
 
     super("My Window");
 
     JPanel p = new JPanel();
 
     JPanel p = new JPanel();
Zeile 134: Zeile 138:
 
     this.add(p);
 
     this.add(p);
 
     this.pack();
 
     this.pack();
 +
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 
     this.setVisible(true);
 
     this.setVisible(true);
 
   }
 
   }
  
}</code=java>
+
}</syntaxhighlight>
 
|style="width:1em"|
 
|style="width:1em"|
|style="width:30em"|<code=java>public class myProgram {
+
|style="width:30em"|<syntaxhighlight lang="java">public class MyProgram {
  
 
   public static void main(String[] args) {
 
   public static void main(String[] args) {
     myFrame f = new myFrame();
+
     MyFrame f = new MyFrame();
 
   }
 
   }
  
Zeile 149: Zeile 154:
 
     
 
     
  
 +
   
 
      
 
      
 
      
 
      
Zeile 161: Zeile 167:
 
    
 
    
 
     
 
     
</code=java>
+
</syntaxhighlight>
 
|}
 
|}
  
Somit wird nun nur ''myFrame'' aufgerufen. In ''myFrame'' ist alles drin enthalten.
+
Somit wird nun nur ''MyFrame'' aufgerufen. In ''MyFrame'' ist alles drin enthalten.
Man muss es wie eine Komponente sehen. Das Programmm sieht zwar beim Ausführen wieder genau gleich aus, aber vom Programmaufbau ist es nun etwas anders. Ich kann z.B. nun ''myFrame'' als Komponente in andere Programme integrieren. Befehle wie ''JButton'' brauche ich in dem anderen Programm dann nicht zu schreiben.
+
Man muss es wie eine Komponente sehen. Das Programmm sieht zwar beim Ausführen wieder genau gleich aus, aber vom Programmaufbau ist es nun etwas anders. Ich kann z.B. nun ''MyFrame'' als Komponente in andere Programme integrieren. Befehle wie ''JButton'' brauche ich in dem anderen Programm dann nicht zu schreiben.
  
Die ''main()''-Methode in ''myProgram'' kann man in jede beliebige Klasse schreiben. So kann man sie auch direkt in ''myFrame'' schreiben:
+
Die ''main()''-Methode in ''MyProgram'' kann man in jede beliebige Klasse schreiben. So kann man sie auch direkt in ''MyFrame'' schreiben:
 
{|
 
{|
|style="width:30em"|<code=java>import javax.swing.*;
+
|style="width:30em"|<syntaxhighlight lang="java">import javax.swing.*;
 
import java.awt.*;
 
import java.awt.*;
  
public class myFrame extends JFrame{
+
public class MyFrame extends JFrame {
  
   myFrame() {
+
   MyFrame() {
 
     super("My Window");
 
     super("My Window");
 
     JPanel p = new JPanel();
 
     JPanel p = new JPanel();
Zeile 187: Zeile 193:
 
     this.add(p);
 
     this.add(p);
 
     this.pack();
 
     this.pack();
 +
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 
     this.setVisible(true);
 
     this.setVisible(true);
 
   }
 
   }
  
 
   public static void main(String[] args) {
 
   public static void main(String[] args) {
     myFrame f = new myFrame();
+
     MyFrame f = new MyFrame();
 
   }
 
   }
  
}</code=java>
+
}</syntaxhighlight>
 
|style="width:1em"|
 
|style="width:1em"|
|style="width:30em"|<code=java>     
+
|style="width:30em"|<syntaxhighlight lang="java">     
 
     
 
     
 
     
 
     
Zeile 208: Zeile 215:
 
     
 
     
 
     
 
     
 +
   
 
     
 
     
 
     
 
     
Zeile 221: Zeile 229:
 
     
 
     
 
     
 
     
     </code=java>
+
     </syntaxhighlight>
 
|}
 
|}
  
Zeile 228: Zeile 236:
  
  
Genauso wie wir nun ''myFrame'' erstellt haben, können wir auch eine Klasse namens ''RedButton'' erstellen, dessen Aufgabe es ist, einen roten Button zu erstellen:
+
Genauso wie wir nun ''MyFrame'' erstellt haben, können wir auch eine Klasse namens ''RedButton'' erstellen, dessen Aufgabe es ist, einen roten Button zu erstellen:
 
{|
 
{|
|style="width:30em"|<code=java>import javax.swing.*;
+
|style="width:30em"|<syntaxhighlight lang="java">import javax.swing.*;
 
import java.awt.*;
 
import java.awt.*;
  
Zeile 248: Zeile 256:
 
     
 
     
 
     
 
     
 +
   
 
     
 
     
</code=java>
+
</syntaxhighlight>
 
|style="width:1em"|
 
|style="width:1em"|
|style="width:30em"|<code=java>import javax.swing.*;
+
|style="width:30em"|<syntaxhighlight lang="java">import javax.swing.*;
  
public class myProgram {
+
public class MyProgram {
  
 
   public static void main(String[] args) {
 
   public static void main(String[] args) {
     myFrame f = new myFrame("My Window");
+
     MyFrame f = new MyFrame("My Window");
 
     JPanel p = new JPanel();
 
     JPanel p = new JPanel();
 
     RedButton b1 = new RedButton("Button 1");
 
     RedButton b1 = new RedButton("Button 1");
Zeile 266: Zeile 275:
 
     f.add(p);
 
     f.add(p);
 
     f.pack();
 
     f.pack();
 +
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 
     f.setVisible(true);
 
     f.setVisible(true);
 
   }
 
   }
  
}</code=java>
+
}</syntaxhighlight>
 
|}
 
|}
  
 
An dieser Stelle sieht man auch besser den Sinn der abgeleiteten Klassen. Nun wurden zwei ''JButton''s direkt zu ''RedButton''s. Wenn man bedenkt, dass sämtliche Swing-Komponenten wie ''JButton'' gezeichnet werden, so ist es eine erhebliche Arbeitserleichterung, dass das Programm dahinter nur einmal geschrieben wurde und dann immer wieder genutzt werden kann.
 
An dieser Stelle sieht man auch besser den Sinn der abgeleiteten Klassen. Nun wurden zwei ''JButton''s direkt zu ''RedButton''s. Wenn man bedenkt, dass sämtliche Swing-Komponenten wie ''JButton'' gezeichnet werden, so ist es eine erhebliche Arbeitserleichterung, dass das Programm dahinter nur einmal geschrieben wurde und dann immer wieder genutzt werden kann.
  
Zu guter Letzt nun auch noch mal die Klasse ''RedButton'' in Kombination mit der Klasse ''myFrame'':
+
Zu guter Letzt nun auch noch mal die Klasse ''RedButton'' in Kombination mit der Klasse ''MyFrame'':
 
{|
 
{|
|style="width:30em"|<code=java>import javax.swing.*;
+
|style="width:30em"|<syntaxhighlight lang="java">import javax.swing.*;
 
import java.awt.*;
 
import java.awt.*;
  
Zeile 293: Zeile 303:
 
     
 
     
 
     
 
     
 +
   
 
     
 
     
 
     
 
     
Zeile 299: Zeile 310:
 
     
 
     
 
     
 
     
     
+
</syntaxhighlight>
</code=java>
 
 
|style="width:1em"|
 
|style="width:1em"|
|style="width:30em"|<code=java>import javax.swing.*;
+
|style="width:30em"|<syntaxhighlight lang="java">import javax.swing.*;
import java.awt.*;
 
  
public class myFrame extends JFrame{
+
public class MyFrame extends JFrame {
  
   myFrame() {
+
   MyFrame() {
 
     super("My Window");
 
     super("My Window");
 
     JPanel p = new JPanel();
 
     JPanel p = new JPanel();
Zeile 318: Zeile 327:
 
     this.add(p);
 
     this.add(p);
 
     this.pack();
 
     this.pack();
 +
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 
     this.setVisible(true);
 
     this.setVisible(true);
 
   }
 
   }
  
 
   public static void main(String[] args) {
 
   public static void main(String[] args) {
     myFrame f = new myFrame();
+
     MyFrame f = new MyFrame();
 
   }
 
   }
  
}</code=java>
+
}</syntaxhighlight>
 
|}
 
|}
 +
 +
{{Fragen stellen}}
 +
 +
 +
== Siehe auch ==
 +
 +
[http://de.wikipedia.org/wiki/Vererbung_%28Programmierung%29 ''Wikipedia: Vererbung in der Programmierung.'']
 +
 +
 +
[[Kategorie:Java Grundlagen]]

Aktuelle Version vom 7. April 2018, 16:27 Uhr

Im folgenden wird in anschaulicher Weise die Vererbung in Java, welches ein Teilbereich der Objektorientierung ist, beschrieben. Alle Programme sehen, wenn man sie ausführt, genau gleich aus und bedienen sich auch gleich. Auch wenn der Quellcode immer wieder etwas anders ist.


Fangen wir mit einem einfachen kleinen Programm an, das ein Fenster öffnet und drei Buttons erstellt. Zwei davon sind rot:

     
      
                                          
            
       
       
     
     
     
     
     
     
     
     
     
     
     
    
     
     
     
     
     
import javax.swing.*;
import java.awt.*;

public class MyProgram {

  public static void main(String[] args) {
    JFrame f = new JFrame("My Window");
    JPanel p = new JPanel();
    JButton b1 = new JButton("Button 1");
    JButton b2 = new JButton("Button 2");
    JButton b3 = new JButton("Button 3");
    b1.setBackground(new Color(255,0,0));
    b3.setBackground(new Color(255,0,0));
    p.add(b1);
    p.add(b2);
    p.add(b3);
    f.add(p);
    f.pack();
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.setVisible(true);
  }

}

Durch "new" wird ein neues Objekt (eine Instanz) erstellt, das eine Kopie des Hauptobjekts ist.


Betrachten wir uns nun JFrame. Man kann in Java eine neue Klasse erstellen (sofern die Klasse, von der sie sich ableitet, nicht "private" ist), die sämtliche Eigenschaften der Klasse, von der sie abgeleitet wurde, erbt.

In folgendem Programm habe ich nun eine Klasse MyFrame erstellt, die mittels extends von der Klasse JFrame alle Eigenschaften erbt:

import javax.swing.*;

public class MyFrame extends JFrame {
  MyFrame(String name) {
    super(name);
  }
}
                                          
     
     
     
     
     
     
     
     
     
     
     
     
    
     
     
import javax.swing.*;
import java.awt.*;

public class MyProgram {

  public static void main(String[] args) {
    MyFrame f = new MyFrame("My Window");
    JPanel p = new JPanel();
    JButton b1 = new JButton("Button 1");
    JButton b2 = new JButton("Button 2");
    JButton b3 = new JButton("Button 3");
    b1.setBackground(new Color(255,0,0));
    b3.setBackground(new Color(255,0,0));
    p.add(b1);
    p.add(b2);
    p.add(b3);
    f.add(p);
    f.pack();
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.setVisible(true);
  }

}

Im Programm MyProgram wird nun MyFrame auch genau so genutzt und behandelt wie zuvor JFrame. Und das Ergebnis ist ebenfalls gleich. In MyProgram wird MyFrame genau ein Argument übergeben: Der String "My Window". Die Anzahl und Art der Argumente muss im Konstruktor von der MyFrame-Klasse auch vorkommen: MyFrame(String name). Und damit dieses Argument wiederum auch an das eigentliche JFrame übergeben wird, steht dort super(name).

MyFrame ist ein neues Objekt. Ich kann ihm sämtliche Eigenschaften meines Programms geben:

import javax.swing.*;
import java.awt.*;

public class MyFrame extends JFrame {

  MyFrame() {
    super("My Window");
    JPanel p = new JPanel();
    JButton b1 = new JButton("Button 1");
    JButton b2 = new JButton("Button 2");
    JButton b3 = new JButton("Button 3");
    b1.setBackground(new Color(255,0,0));
    b3.setBackground(new Color(255,0,0));
    p.add(b1);
    p.add(b2);
    p.add(b3);
    this.add(p);
    this.pack();
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.setVisible(true);
  }

}
public class MyProgram {

  public static void main(String[] args) {
    MyFrame f = new MyFrame();
  }

}
     
     

     
     
     
     
     
     
     
     
     
     
     
    
     

Somit wird nun nur MyFrame aufgerufen. In MyFrame ist alles drin enthalten. Man muss es wie eine Komponente sehen. Das Programmm sieht zwar beim Ausführen wieder genau gleich aus, aber vom Programmaufbau ist es nun etwas anders. Ich kann z.B. nun MyFrame als Komponente in andere Programme integrieren. Befehle wie JButton brauche ich in dem anderen Programm dann nicht zu schreiben.

Die main()-Methode in MyProgram kann man in jede beliebige Klasse schreiben. So kann man sie auch direkt in MyFrame schreiben:

import javax.swing.*;
import java.awt.*;

public class MyFrame extends JFrame {

  MyFrame() {
    super("My Window");
    JPanel p = new JPanel();
    JButton b1 = new JButton("Button 1");
    JButton b2 = new JButton("Button 2");
    JButton b3 = new JButton("Button 3");
    b1.setBackground(new Color(255,0,0));
    b3.setBackground(new Color(255,0,0));
    p.add(b1);
    p.add(b2);
    p.add(b3);
    this.add(p);
    this.pack();
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.setVisible(true);
  }

  public static void main(String[] args) {
    MyFrame f = new MyFrame();
  }

}
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     

Das hat den enormen Vorteil, dass man in Java in mehreren Klassen main()-Methoden haben kann. Man kann dann das Programm entweder von der eigentlichen Klasse aus starten oder aber auch einfach die main()-Methode in einer der Komponenten. In letzterem Fall hat man dann z.B. ein Programm, das nur die eine Komponente ausführt. Somit muss man nicht immer das ganze Programm starten, wenn man nur mal kurz Veränderungen an einer Komponente testen will.


Genauso wie wir nun MyFrame erstellt haben, können wir auch eine Klasse namens RedButton erstellen, dessen Aufgabe es ist, einen roten Button zu erstellen:

import javax.swing.*;
import java.awt.*;

public class RedButton extends JButton {

  RedButton(String name) {
    super(name);
    this.setBackground(new Color(255,0,0));
  }

}
     
     
     
     
     
     
     
     
     
import javax.swing.*;

public class MyProgram {

  public static void main(String[] args) {
    MyFrame f = new MyFrame("My Window");
    JPanel p = new JPanel();
    RedButton b1 = new RedButton("Button 1");
    JButton b2 = new JButton("Button 2");
    RedButton b3 = new RedButton("Button 3");
    p.add(b1);
    p.add(b2);
    p.add(b3);
    f.add(p);
    f.pack();
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.setVisible(true);
  }

}

An dieser Stelle sieht man auch besser den Sinn der abgeleiteten Klassen. Nun wurden zwei JButtons direkt zu RedButtons. Wenn man bedenkt, dass sämtliche Swing-Komponenten wie JButton gezeichnet werden, so ist es eine erhebliche Arbeitserleichterung, dass das Programm dahinter nur einmal geschrieben wurde und dann immer wieder genutzt werden kann.

Zu guter Letzt nun auch noch mal die Klasse RedButton in Kombination mit der Klasse MyFrame:

import javax.swing.*;
import java.awt.*;

public class RedButton extends JButton {

  RedButton(String name) {
    super(name);
    this.setBackground(new Color(255,0,0));
  }

}
     
     
     
     
     
     
     
     
     
     
     
     
     
import javax.swing.*;

public class MyFrame extends JFrame {

  MyFrame() {
    super("My Window");
    JPanel p = new JPanel();
    RedButton b1 = new RedButton("Button 1");
    JButton b2 = new JButton("Button 2");
    RedButton b3 = new RedButton("Button 3");
    p.add(b1);
    p.add(b2);
    p.add(b3);
    this.add(p);
    this.pack();
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.setVisible(true);
  }

  public static void main(String[] args) {
    MyFrame f = new MyFrame();
  }

}


Fragen

Das Thema wurde nicht ausreichend behandelt? Du hast Fragen dazu und brauchst weitere Informationen? Lass Dir von uns helfen!

Wir helfen dir gerne!


Dir hat dieser Artikel gefallen? Oder Du hast Fehler entdeckt und möchtest zur Berichtigung beitragen? Prima! Schreibe einen Kommentar!

Du musst angemeldet sein, um einen Kommentar abzugeben.


Siehe auch

Wikipedia: Vererbung in der Programmierung.