Vererbung

Status
Nicht offen für weitere Antworten.

Fridolin

Bekanntes Mitglied
Hallo, ich will (muss) mal eine kleine Vererbung programmieren, wie macht man sowas und wo
muss das Java File liegen? Bei mir kommt bei folgender Klasse immer eine
Fehlermeldung can't resolve symbol Vektor2d

das wäre die Klasse von der Vektor3d (das sind Vorgaben)
erbt Vektor3d soll zu dem skalarprodukt und plus / minus rechenoperationen zusätzlich noch einen
dritten wert haben um das kreuzprodukt zu bilden
Daraus soll ich dann eine Klasse ableiten die einen Würfel rotiert und transliert
Das ganze soll eine Oberfläche (wahrscheinlich ein Frame) haben auf dem sich
ein großer Würfel dreht und ein kleinerer darum transliert. Aber soweit bin ich noch gar nicht.
Jetzt bin ich bei der Vererbung, will mir wer einen Tipp geben warum folgendes programm nicht
geht, es liegt im selben Verzeichnis wie Vektor2d und sollte von der Klasse das skalarprodukt und die grundrechnungsarten erben aber das tut es
nicht...

lg Fridolin

Code:
public class Vektor3d extends Vektor2d 
{ 

	public Vektor3d()
	{
	
	}

public static void main(String[] args) 
    { 
        // Create application frame. 
        Vektor3d fridolinhatgeerbtundistjetztreich = new Vektor3d(); 
        fridolinhatgeerbtundistjetztreich.setSize(300, 200); 
        fridolinhatgeerbtundistjetztreich.setLocation(100, 100); 
        fridolinhatgeerbtundistjetztreich.setTitle("Vektor2d"); 
        fridolinhatgeerbtundistjetztreich.setVisible(true); 
    } 
}
 
Illuvatar hat gesagt.:
Außerdem heißt es Vector, oder?
Vector2d ist eine Klasse aus Java 3D, aber erjetzt auch der erben will .. k.A.


Illuvatar hat gesagt.:
Das macht der Compiler auch selbst.

Nicht wenn er seinen eignen Konstruktor implementiert
Code:
public Vektor3d()
   {
   
   }
 
Wenn die Klasse javax.vecmath.Vector2d gemeint ist, dann wird sie mit c und nicht mit k geschrieben.

Wenn er seinen eigenen Konstruktor macht, dann wird der Super-Konstruktor trotzdem aufgerufen, egal ob da super() oder nicht steht.
Edit: ok
 
super() steht automatisch in jedem Konstrukor und muss nicht explizit mit angegeben werden

Code:
public bla()
{
}

ist das selbe wie

Code:
public bla()
{
    super();
}


Das super explizit anzugeben ist sogar eher unüblich.
 
Grizzly hat recht. Es ist eine eigene Klasse die von JFrame abgeleitet ist und eine eigene kleine GUI mit keylistener hat wie kann ich jetzt dieselbe Klasse weitervererben um zusätzlich noch das Kreuzprodukt und eine Variable für
den letzten Wert des Vektors (z nicht den Datentyp aus Java oder die Graphik klasse) eingeben zu können und dafür zwei neue Textfelder zu machen? Es hat mir jemand gesagt das ich von bereits abgeleiteten Klassen nicht erben kann
aber was hat das dann für einen sinn, wenn ich für jede klasse eine eigene eingabeoberfläche machen muss, dann brauch ich ja zwei klassen eine für die methoden und eine für die keylistener, textfelder und filemenus.
 
Anonymous hat gesagt.:
Es hat mir jemand gesagt das ich von bereits abgeleiteten Klassen nicht erben kann ...
Da hat er dir jemand was Flasches gesagt -man sollte es halt nur nicht übertreiben, da das Ganze dann ziehmlich unübersichtlich wird.
 
Seit ihr bei der Sache mit dem Konstruktor sicher? Was ist, wenn ich eine Klasse habe:
Code:
public class Superklasse {
     private Superklasse() {
          super();
     }

     public Superklasse(String name) {
          super();
     }
}
und davon eine Klasse ableite? Da dürfte folgendes dann ja gar nicht gehen, oder?
Code:
public class Unterklasse extends Superklasse {
     public Unterklasse() {
     }
}
 
nö das geht nicht, das geht nur wenn ein Konstruktor ohne Übergabewerte existiert (super() halt) und der auch zugänglich ist.
[edit]
das
Code:
public class Unterklasse extends Superklasse {
     public Unterklasse() {
             super()
     }
}
würde ja genauso wenig laufen.
 
Zum Konstruktor wäre noch zu sagen, dass der Defaultkonstruktor, der vom Compiler automatisch in die Klasse eingefügt wird, verdeckt wird, so bald man einen selbst definierten Konstruktor in die KLasse schreibt.
Code:
public MeineKlasse(Typ einArgument) {
...
Nun ist es nicht mehr möglich den Defaultkonstruktor aufzurufen.

Code:
MeineKlasse mk = MeineKlasse(); // geht nicht mehr

Dafür müsste nun explizit ein Defautkonstruktor eingefügt werden.
Code:
public MeineKlasse() {
...
}

public MeineKlasse(Typ einArgument) {
...
}
 
Och, das Problem wurde doch gelöst, dann darf mann auch doch ruhig mal etwas vom Thema abschweifen 🙂
 
Ich habe im oberen Bereich die Diskussion um den Konstruktor verfolgt, da wollte ich noch was zum Besten geben, weil das auch häufig verkehrt gemacht wird.

@KSG9|plak: Ich weiß, nicht böse sein. :wink:
 
Entschuldigung das ich nochmal frage aber wie kann ich jetzt von dieser Klasse erben?

Das ist die Klasse (ohne keylistener) denn die hab ich fast vollständig weggetan sonst wäre
sie 900 zeilen lang

Code:
import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class Vektor2d extends JFrame implements ActionListener 
{ 
    
   int a; 
   int b; 
   int c;
   int[] zahla = new int[3]; 
   int[] zahlb = new int[3];
   int gcd; 
   JTextField eins; 
   JTextField zwei; 
   JButton skalar; 
   JButton plus; 
   JButton minus; 
   JButton gleich; 
   JButton clear;
   JPanel panel; 
   JPanel text; 
   String antwort = new String(); 
    
   public void seta(int x) 
   { 
   this.a = x; 
   } 
    
   public void setb(int y) 
   { 
   this.b = y; 
   }
    
   public void setc(int z) 
   { 
   this.c = z; 
   } 
   
   public int geta() 
   { 
   return this.a; 
   } 
    
   public int getb() 
   { 
   return this.b; 
   } 
   
   public int getc() 
   { 
   return this.c; 
   } 
    
   public void add(int x, int y, int z, int n) 
   { 
   this.a = x*n + z*y; 
   this.b = y*n; 
   } 
    
   public void subtract(int x, int y, int z, int n) 
   { 
   this.a = x*n - z*y; 
   this.b = y*n; 
   } 
    
   public void skalar(int x, int y, int z, int n) 
   { 
    
   this.a = x*z; 
   this.b = y*n; 
   this.c = this.a + this.b;
   } 
    
   public void clear(JTextField x, JTextField y) 
   { 
   x.setText(""); 
   y.setText(""); 
   } 
    
   public int greatestcommonDivisor(int x, int y) 
   { 
   	   while(x != 0.0) 
       { 
       int temp = y % x; 
       y = x; 
       x = temp; 
       } 
        
       return y;    
   } 
    
   public Vektor2d() 
   { 
    
   MenuBar menuBar = new MenuBar(); 
   Menu menuFile = new Menu(); 
   MenuItem menuFileExit = new MenuItem(); 
        
   menuFile.setLabel("File"); 
   menuFileExit.setLabel("Exit"); 
        
   menuFileExit.addActionListener(new ActionListener() 
   { 
       public void actionPerformed(ActionEvent e) 
       { 
       setVisible(false);
       dispose(); 
       System.exit(0); 
       } 
   }); 
   menuFile.add(menuFileExit); 
   menuBar.add(menuFile); 
    
   Container content = getContentPane(); 
   content.setLayout(new BorderLayout()); 
    
   panel = new JPanel(); 
   panel.setLayout(new FlowLayout()); 
    
   plus = new JButton("+"); 
   plus.addActionListener(this); 
   //plus.setPreferredSize(new Dimension(20,20)); 
   panel.add(plus); 
    
   minus = new JButton("-"); 
   minus.addActionListener(this); 
   //minus.setPreferredSize(new Dimension(20,20)); 
   panel.add(minus); 
    
   gleich = new JButton("="); 
   gleich.addActionListener(this); 
   //gleich.setPreferredSize(new Dimension(20,20)); 
   panel.add(gleich); 
   
   clear = new JButton("C"); 
   clear.addActionListener(this); 
   //clear.setPreferredSize(new Dimension(20,20)); 
   panel.add(clear); 
    
   skalar = new JButton("skalar"); 
   skalar.addActionListener(this); 
   panel.add(skalar); 
   content.add(panel, BorderLayout.NORTH); 
    
   text = new JPanel(); 
   text.setLayout(new BorderLayout()); 
    
   eins = new JTextField(); 
   eins.addKeyListener(new KeyAdapter()
   {
   		public void keyPressed(KeyEvent e33)
   		{
   		
   		int keycode = e33.getKeyCode();
   		if(keycode == KeyEvent.VK_ENTER)
   		{
   		zwei.requestFocus();
   		}
   		
   		}
   });
   text.add(eins, BorderLayout.NORTH); 
    
   zwei = new JTextField(); 
   zwei.addKeyListener(new KeyAdapter()
   {
   		public void keyPressed(KeyEvent e77)
   		{
   		
   		int keycode = e77.getKeyCode();
   		if(keycode == KeyEvent.VK_ENTER)
   		{
   		eins.requestFocus();
   		}
   		
   		}
   });
   text.add(zwei, BorderLayout.SOUTH); 
    
   content.add(text, BorderLayout.SOUTH); 
   
   this.a = 40; 
   this.b = 20; 
   } 
    
   public Vektor2d(int x, int y) 
   { 
       
   MenuBar menuBar = new MenuBar(); 
   Menu menuFile = new Menu(); 
   MenuItem menuFileExit = new MenuItem(); 
        
   menuFile.setLabel("File"); 
   menuFileExit.setLabel("Exit"); 
        
   menuFileExit.addActionListener(new ActionListener() 
   { 
       public void actionPerformed(ActionEvent e) 
       { 
       setVisible(false);
       dispose(); 
       System.exit(0); 
       } 
   }); 
   menuFile.add(menuFileExit); 
   menuBar.add(menuFile); 
    
   Container content = getContentPane(); 
   content.setLayout(new BorderLayout()); 
    
   panel = new JPanel(); 
   panel.setLayout(new FlowLayout()); 
    
   plus = new JButton("+"); 
   plus.addActionListener(this); 
   //plus.setPreferredSize(new Dimension(20,20)); 
   panel.add(plus); 
    
   minus = new JButton("-"); 
   minus.addActionListener(this); 
   //minus.setPreferredSize(new Dimension(20,20)); 
   panel.add(minus); 
    
   gleich = new JButton("="); 
   gleich.addActionListener(this); 
   //gleich.setPreferredSize(new Dimension(20,20)); 
   panel.add(gleich); 
    
   clear = new JButton("C"); 
   clear.addActionListener(this); 
   //clear.setPreferredSize(new Dimension(20,20)); 
   panel.add(clear); 
   
   skalar = new JButton("skalar"); 
   skalar.addActionListener(this); 
   panel.add(skalar); 
   content.add(panel, BorderLayout.NORTH); 
    
   text = new JPanel(); 
   text.setLayout(new BorderLayout()); 
    
   eins = new JTextField(); 
   eins.addKeyListener(new KeyAdapter()
   {
   		public void keyPressed(KeyEvent e33)
   		{
   		
   		int keycode = e33.getKeyCode();
   		if(keycode == KeyEvent.VK_ENTER)
   		{
   		zwei.requestFocus();
   		}
   		
   		}
   }); 
   text.add(eins, BorderLayout.NORTH); 
    
   zwei = new JTextField(); 
   zwei.addKeyListener(new KeyAdapter()
   {
   		public void keyPressed(KeyEvent e77)
   		{
   		
   		int keycode = e77.getKeyCode();
   		if(keycode == KeyEvent.VK_ENTER)
   		{
   		eins.requestFocus();
   		}
   		
   		}
   });
   text.add(zwei, BorderLayout.SOUTH); 
    
   content.add(text, BorderLayout.SOUTH); 
   
   this.a = x; 
   this.b = y; 
   } 
    
   public void actionPerformed(ActionEvent event) 
   { 
   Object quelle = event.getSource();     
    
      if(quelle == plus) 
      { 
      antwort = "+"; 
      
      try 
      { 
      zahla[0] = Integer.parseInt(eins.getText()); 
      zahlb[0] = Integer.parseInt(zwei.getText()); 
       
      seta(zahla[0]); 
      setb(zahlb[0]);
      } 
    
      catch(NumberFormatException e11) 
      { 
      System.out.println("Das war keine Zahl.\n Bitte geben sie erneut ein."); 
      zahla[0] = 0; 
      zahlb[0] = 0; 
       
      seta(zahla[0]); 
      setb(zahlb[0]);
      
      clear(eins, zwei); 
      }
      
      clear(eins, zwei); 
      } 
       
      else if(quelle == minus) 
      { 
      antwort = "-"; 
      
      try 
      { 
      zahla[0] = Integer.parseInt(eins.getText()); 
      zahlb[0] = Integer.parseInt(zwei.getText()); 
       
      seta(zahla[0]); 
      setb(zahlb[0]);
      } 
    
      catch(NumberFormatException e11) 
      { 
      System.out.println("Das war keine Zahl.\n Bitte geben sie erneut ein."); 
      zahla[0] = 0; 
      zahlb[0] = 0; 
       
      seta(zahla[0]); 
      setb(zahlb[0]); 
      
      clear(eins, zwei); 
      } 
      
      clear(eins, zwei); 
      } 
       
      else if(quelle == clear) 
      {
      zahla[2] = 0; 
      zahlb[2] = 0; 
      
      zahla[1] = 0; 
      zahlb[1] = 0; 
          
      zahla[0] = 0; 
      zahlb[0] = 0; 
          
      seta(0); 
      setb(0);
         
      clear(eins, zwei);	 
      }
      
      else if(quelle == skalar) 
      { 
      antwort = "s"; 
      
      try 
      { 
      zahla[0] = Integer.parseInt(eins.getText()); 
      zahlb[0] = Integer.parseInt(zwei.getText()); 
      
      seta(zahla[0]); 
      setb(zahlb[0]);
      } 
    
      catch(NumberFormatException e11) 
      { 
      System.out.println("Das war keine Zahl.\n Bitte geben sie erneut ein."); 
      zahla[0] = 0; 
      zahlb[0] = 0; 
       
      seta(zahla[0]); 
      setb(zahlb[0]); 
      
      clear(eins, zwei); 
      } 
      
      clear(eins,zwei); 
      } 
       
      if(quelle == gleich) 
      { 
          
         try
         {         
         zahla[1] = Integer.parseInt(eins.getText()); 
         zahlb[1] = Integer.parseInt(zwei.getText()); 
      	 }
      	 
      	 catch(NumberFormatException e11) 
         { 
         System.out.println("Das war keine Zahl.\n Bitte geben sie erneut ein."); 
         zahla[1] = 0; 
         zahlb[1] = 0; 
          
         seta(zahla[1]); 
         setb(zahlb[1]); 
          
         zahla[0] = 0; 
         zahlb[0] = 0; 
          
         seta(zahla[0]); 
         setb(zahlb[0]);
         
         clear(eins, zwei); 
         } 
            
           
            if(antwort.equals("+")) 
            { 
            add(zahla[0], zahlb[0], zahla[1], zahlb[1]); 
            
            zahla[2] = geta(); 
            zahlb[2] = getb(); 
            gcd = greatestcommonDivisor(zahla[2], zahlb[2]);
            zahla[2] = geta()/gcd; 
            zahlb[2] = getb()/gcd;
            
            eins.setText(new Integer(zahla[2]).toString()); 
            zwei.setText(new Integer(zahlb[2]).toString()); 
             
               for(int i = 0; i <= 2; i++)    
               { 
               zahla[i] = 0; 
               zahlb[i] = 0; 
               } 
                
            seta(0); 
            setb(0); 
            } 
             
            if(antwort.equals("-")) 
            { 
            subtract(zahla[0], zahlb[0], zahla[1], zahlb[1]); 
            
            zahla[2] = geta(); 
            zahlb[2] = getb(); 
            gcd = greatestcommonDivisor(zahla[2], zahlb[2]);
            zahla[2] = geta()/gcd; 
            zahlb[2] = getb()/gcd;
             
            eins.setText(new Integer(zahla[2]).toString()); 
            zwei.setText(new Integer(zahlb[2]).toString()); 
             
               for(int i = 0; i <= 2; i++)    
               { 
               zahla[i] = 0; 
               zahlb[i] = 0; 
               } 
                
            seta(0); 
            setb(0); 
            } 
             
            if(antwort.equals("s")) 
            { 
            skalar(zahla[0], zahlb[0], zahla[1], zahlb[1]); 
            
            zahla[2] = getc(); 
             
            eins.setText(new Integer(zahla[2]).toString()); 
            zwei.setText("");
            
               for(int i = 0; i <= 2; i++)    
               { 
               zahla[i] = 0; 
               zahlb[i] = 0; 
               } 
                
            seta(0); 
            setb(0); 
            setc(0); 
            } 
             
         } 
          
      } 
          
    
    public static void main(String[] args) 
    { 
        // Create application frame. 
        Vektor2d fridolin = new Vektor2d(); 
        fridolin.setSize(300, 200); 
        fridolin.setLocation(100, 100); 
        fridolin.setTitle("Vektor2d"); 
        fridolin.setVisible(true); 
    } 
}
 
Fridolin hat gesagt.:
Entschuldigung das ich nochmal frage aber wie kann ich jetzt von dieser Klasse erben?
Ähm - kenn die vorgeschicht net, aber wenn du von deiner Klasse erben willst geht das einfach:

Code:
public class SubVektor2d extends Vektor2d {
....
}

PS: Wenn dein KeyListener solche Ausmaße hat wäre es zu überlegen ihn in eine eigene Klasse zu tun !!
 
Du schreibst eine neue Klasse, die aus dieser abgeleitet ist:
Code:
public class Vektor3d extends Vektor2d
Da kannst du dann die Methoden aus der Superklasse ganz einfach verwenden, z.B. so:
Code:
int x = greatestCommonDivisor (8,9);

edit von deathbyaclown: hihi - wieder zweiter *g*
Edit von mir: Musst du in meinem Beitrag rumeditieren? Und hör mal auf, da zu posten, wo ich posten will 😀
 
Ja es sind zwei Listener einen für den Zähler und einen für den Nenner(Textfelder)

Was ist daran falsch außer das bei mir immer die Meldung cannot resolve symbol Vektor2d
kommt und ich noch keine Methoden überschrieben habe und dann kann er die ganzen
JFrame Methoden wie setTitle und setVisible auch nicht erkennen (Wie nennt man die eigentlich?)
Ihr könnt mir sicher helfen, danke Fridolin
Code:
import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*;

public class Vektor3d extends Vektor2d 
{ 

	public Vektor3d()
	{
	super();
	}

public static void main(String[] args) 
    { 
        // Create application frame. 
        Vektor3d fridolinhatgeerbtundistjetztreich = new Vektor3d(); 
        fridolinhatgeerbtundistjetztreich.setSize(300, 200); 
        fridolinhatgeerbtundistjetztreich.setLocation(100, 100); 
        fridolinhatgeerbtundistjetztreich.setTitle("Vektor2d"); 
        fridolinhatgeerbtundistjetztreich.setVisible(true); 
    } 
}
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben