PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : java vererbung


Da_Hui
2006-01-15, 19:21:51
mir is klar wie es in der theorie funktioniert, dass eine neue klasse alle eigenschaften der überklasse erbt.

meine frage wie funktioniert das im code ??

Code:
public class winkel extends EinDimFeld{
//bla bla code


die einen winkel berechnen soll kein problem, dass bekomm ich hin.

nur der fehler is er sagt er kennt EinDimFeld nicht....

dabei hab ich diese klasse auch geschrieben

Code:
public class EinDimFeld{


was muss ich tun, dass eine klasse auf die andere zugreifen kann, und so von ihr erbt ???
kompiliert sind beide und beide class datein sind im selben verzeichniss

kA, hab die letze vorlesung verpasst Wink und hatte noch keine zeit dass nachzuschlagen ....

wäre nett wenn mir wer helfen könnte

mfg dopYasS

redfalcon
2006-01-15, 19:25:39
Wie lautet die genaue Fehlermeldung des Compilers?

Da_Hui
2006-01-15, 20:24:04
C:\***\**\....\Java Applets\winkel.java:14: cannot find symbol
symbol : constructor EinDimFeld()
location: class EinDimFeld
public class winkel extends EinDimFeld{
^
1 error


des schreit textpad, und eclipse sagt " implicit superconstructor eindimfeld is undefined for default constructor.

ich weiß net wo ich den code hinschreiben soll dass der überhaupt erben kann.

erster code eindimfeld:


public class EinDimFeld{

protected int einDim[];

public EinDimFeld(int n, int wb1, int wb2){
setArray(n,wb1,wb2);
}

public EinDimFeld(int[] array){
setArray(array);
}

public void setArray(int[] array){
einDim=new int[array.length];
einDim=array;
}

public void setArray(int n, int wb1, int wb2){
einDim=new int[n];
for(int i=0; i<=n-1;i++)
einDim[i]=wb1+(int)(Math.random()*(wb2-wb1+1));
}

public int summe(){
int s=0;

for(int i=0;i<=einDim.length-1;i++)
s+=einDim[i];

return s;
}

public double arMittel(){
return (double) summe()/(double) einDim.length;
}
public int max(){
int m=einDim[0];

for(int i=1;i<=einDim.length-1;i++)
if(einDim[i]>m)
m=einDim[i];

return m;
}
public int min(){
int m=einDim[0];

for(int i=1;i<=einDim.length-1;i++)
if(einDim[i]<m)
m=einDim[i];

return m;
}


public void sort(int v){
int h;

for(int j=0;j<=einDim.length-1;j++)
for(int i=0; i<=einDim.length-2; i++)
if (vergleich(v,i)){
h=einDim[i];
einDim[i]=einDim[i+1];
einDim[i+1]=h;
}

}
private boolean vergleich(int v, int ix){

if(v==1)
return einDim[ix]<einDim[ix+1];
else
return einDim[ix]>einDim[ix+1];
}

public int zaehle(int ugr, int ogr){

int z=0;

for(int i=0; i<=einDim.length-1;i++)
if(einDim[i]>ugr&&einDim[i]<=ogr)
z++;

return z;
}
public int[] getArray(){
return einDim;
}

}

was das programm tut, is net mein problem, es soll auch nur als überklasse für eine weitere klasse dienen .....

diese lautet:


public class winkel extends EinDimFeld{

public static void main(String[] args)
{

EinDimFeld x = new EinDimFeld(10,1,6);
EinDimFeld y = new EinDimFeld(10,1,6);
EinDimFeld z = differenz(x,y);
int sum=0;

EinDimFeld feld1 =new EinDimFeld (10,1,6);
for (int i=0;i<10;i++){
System.out.println("Vektor "+(i+1)+":");
System.out.println("x = "+ x.getArray()[i]+ " y = " +y.getArray()[i]);
System.out.println("Betrag = "+Math.sqrt(z.getArray()[i])+" \n");

for (int n=0;n<10;n++){
sum=sum+(z.getArray()[n]);
}
}
System.out.println("\nDie Laenge betraegt: "+Math.sqrt(sum));
}

public int differenz()
{
int s=0;

for(int i=0;i<=einDim.length-1;i++)
s+=einDim[i];

return s;
}

public static EinDimFeld differenz(EinDimFeld x, EinDimFeld y)
{
int[] xDaten = x.getArray();
int[] yDaten = y.getArray();
int[] zDaten = new int[10];
for(int i=0;i<xDaten.length;i++)
zDaten[i]=(xDaten[i]*xDaten[i]+yDaten[i]*yDaten[i]);


return new EinDimFeld(zDaten);

}


}


und beim "erben" haut was net hin
classe heisst nur deshalb winkel weil ich später damit einen wikel zwischen zwei vektoren berechnen soll, aber bevor des erben net hinhaut werd ich net weiterschreiben.....

wie soll ich dass anstellen, beides in eine datei schreiben ?? hab auch des erste kompiliert (fehlerfrei) kanns nur net alleine verwenden


thx for help

mfg Da_Hui

Abe Ghiran
2006-01-15, 20:32:34
Bei der Klasse Winkel fehlt ein Konstruktor. Macht nichts, der Compiler erzeugt dann selber einen, scheitert aber, weil EinDimFeld keinen parameterlosen Defaultkonstruktor hat, der müsste dann nämlich aufgerufen werden.

Lösung: Selber einen Konstruktor für Winkel schreiben und darin mit super(blabla) den Konstruktor von EinDimFeld aufrufen.

Grüße, Jan

Monger
2006-01-15, 20:44:34
... oder für DimFeld einen Standardkonstruktor schreiben.


Allerdings ist mir nicht klar, warum deine Winkelklasse überhaupt von EinDimFeld erbt. Ich sehe in deinem Code nichts, was die Vererbung brauchen würde.

Da_Hui
2006-01-15, 20:53:20
k thx mal irgendwie logisch

kann ich jetzt beide klassen ohne publich schreiben ??
wenn ich die jetzt verwenden will, muss ich die aufrufen

das wäre in meinem fall dann super(10,1,6)

EinDimFeld x = new EinDimFeld(10,1,6); aber ich arbeite ja da mir eindimfeld und bei der übergabe wird auch der konstruktor aufgerufen, reicht dass net ??

kann ich sonst einen leeren konstruktor schreiben ?? ....
ich will nur, dass ich in dieser zeile EinDimFeld x = new EinDimFeld(10,1,6); die eigenschaften von eindimfeld verwenden kann ....

werd inzwischen nochmal basteln thx mal

mfg Da_Hui

Monger
2006-01-15, 21:07:42
Bist du wirklich sicher, dass du verstanden hast wie Vererbung funktioniert?

Mal ein Beispiel:



public class Vater{

public void vaterMethode(){

}
}

public class Kind extends Vater{

public void kindMethode(){
vaterMethode();
}
}



Sobald eine Klasse von einer anderen erbt, kann sie automatisch all das was die Oberklasse kann. Du musst nur die Kindklasse instanziieren, und sie kann all das was die Vaterklasse auch kann (Ausnahmen bestätigen die Regel).

Also z.B.



Kind kind = new Kind();

kind.kindMethode(); // geht
kind.vaterMethode(); // geht auch

Gast
2006-01-15, 21:24:08
jaja das is mir gottseidank klar ;)
habs auch regelmäßig verwendet, weil alle eindimensionalen felder haben das geerbt

zitat von mir selbst
x.getArray()[i]

x is eine "erbe" von eindim feld und besitzt auch die methode getArray, die in eindimfeld definiert is,
mein problem ist, dass er nicht kompiliert, weil er meint er hat keinen konstruktor für die klasse winkel und ich nicht weiß wie ich dass behenben soll

nja aber ich bastle dran und denk ich hab bald ne lösung, thx anyway ....
für weitere tipps währe ich natürlich trotzdem dankbar, da sie den vorgang beschleunigen könnten ;9

mfg Da_Hui

Monger
2006-01-15, 21:42:02
...
x is eine "erbe" von eindim feld und besitzt auch die methode getArray, die in eindimfeld definiert is,

Laut deinem Quellcode oben ist x das eben NICHT!

x ist vom Typ EinDimFeld, und nicht etwa ein Erbe davon, weil du x mit



EinDimFeld x = new EinDimFeld(10, 1, 6);


instanziiert hast. Kein Wunder dass sich x wie EinDimFeld verhält... Als Erbe von EinDimFeld müsste x aber auch mit einem Erben von EinDimFeld instanziiert werden - in deinem Fall mit Winkel. Also:


Winkel x = new Winkel(10, 1, 6);


Allerdings funktioniert dein Quellcode auch ohne Vererbung (sofern du deine "Differenz" Methode aus der Winkel-Klasse rausziehst), deshalb frage ich mich wozu du Vererbung brauchst.

Da_Hui
2006-01-15, 22:00:18
kk, danke da war der denkfehler ......
bin wohl auch etwas müde....

muss aber zugeben dass ich da was falsch verstanden hatte ;)
nja wir hatten in der letzten vorlesung das thema vererben und ich dachte ich werds zur übung gleich mal so umsetzen ......


aber ich werd des jetzt mit instanzen und überhaupt mit einer klasse ohne vererbung lösen, das problem geht mich trozdem ein bischen an ;)

nja werds mir morgen wenn ich wieder fitter bin nochmal anschaun, möchte es einfach aus persönlichem interesse so lösen :) .....
bis dahin auf jeden fall danke mal