Klassen Kommunikation zw. Klassen

GS_Unnamed

Mitglied
Hallo zusammen!

Ich suche jetzt schon ziemlich lang per Google und in anderen Foren nach einer Antwort, was Kommunikation von Klassen angeht.

Ich habe 2 Klassen, die eine gibt mir einen String zurück, und in der anderen möchte ich diesen verwenden. Jetzt wie kann ich das machen? :bahnhof:

Vielen Dank im Vorraus
 
Zuletzt bearbeitet von einem Moderator:
Naja es geht hier doch noch ein bisschen weiter, weil ich habe festgestellt, dass ichs immer noch nicht gepeilt habe ???:L

Also Ich habe 3 Klassen:

Java:
public class K1 {

	public int a;
	
	public k1 () {
	
		a = 10;
		System.out.println(""+a);
		
	}
}

Java:
public class K2 {
	
	public k2 () {
		
		a = ??? //Wie kann ich hier a verwenden?
				
				//Hinweis: Ich habe eigentlich mehrere Variable, die ich übergeben möchte.
		
	}
	
}

Java:
public class C {

	
	public static void main(String[] args) {

	K1 k1 = new K1 ();
	K2 k2 = new K2 ();
	//Reicht das, um die beiden Klassen auszuführen?
	
	}

}

Von der Klasse K1 möchte ich (mehrere) Variablen in der Klasse K2 verwenden. Zusätzlich möchte ich diese beiden Klassen mit der dritten C ausführen.

Kann mir das bitte nochmal jemand genau erklären?
 
Die Klasse K2 braucht eine Referenz auf ein K1:

Java:
public class K2 {
  private K1 k1;
  
  public K2 (K1 k1) {
    this.k1 = k1;
  }  

  public void doIt () {
    System.out.println(k1.a); // Besser wäre hier ein getter: getA()
  }
}

Beim instantiieren übergibst du dann die Referenz:
Java:
K1 k1 = new K1 ();
K2 k2 = new K2 (k1);
 
Entweder :
Java:
public class K2 {
    public k2 (K1 einK1Objekt) {
        a = einK1Objekt.getvariable(); // mittels Getter Variable holen
    }
}

oder:
Java:
public class K2 {
    public k2 (int variableA) {
        a = variableA; Variable als Parameter übergebn
    }
}

oder:
Java:
public class K2 {
    ...
public void setVariableA(int wert)
{
 a = wert; // über Setter
}
}
 
Naja es geht hier doch noch ein bisschen weiter, weil ich habe festgestellt, dass ichs immer noch nicht gepeilt habe ???:L

Also Ich habe 3 Klassen:

Java:
public class K1 {

	public int a;
	
	public k1 () {
	
		a = 10;
		System.out.println(""+a);
		
	}
}

Java:
public class K2 {
	
	public k2 () {
		
		a = ??? //Wie kann ich hier a verwenden?
				
				//Hinweis: Ich habe eigentlich mehrere Variable, die ich übergeben möchte.
		
	}
	
}

Java:
public class C {

	
	public static void main(String[] args) {

	K1 k1 = new K1 ();
	K2 k2 = new K2 ();
	//Reicht das, um die beiden Klassen auszuführen?
	
	}

}

Von der Klasse K1 möchte ich (mehrere) Variablen in der Klasse K2 verwenden. Zusätzlich möchte ich diese beiden Klassen mit der dritten C ausführen.

Kann mir das bitte nochmal jemand genau erklären?

Zu allererst musst du darauf achten, dass die namen der Konstruktoren groß geschrieben werden müssen. Also
Java:
public class K1 {
public K1() {}
}

Dann eine andere Sache: Klassen lassen sich nicht "ausführen" oder so. Eine Klasse beinhaltet bestimmte Methoden, die ausgeführt werden können. Ein Beispiel:

Java:
public class ClassA
{
    private int x = 0;

    public ClassA() {
        x = 0;
        System.out.println("x mit " +  x + " initialisert");
    }

    public void increaseX() {
        x++;
    }

    public void doSomething() {
        System.out.println("Zahl: " + x);
    }
}

public class ClassB
{
    public ClassB() {
        ClassA a = new ClassA(); //Ausgabe müsste sein 'X wird mit 0 initialisert'
        a.increaseX(); //keine Ausgabe
        a.doSomething(); //Ausgabe 'Zahl: 1
    }
    
    public void increaseAndOutput(ClassA a) {
        a.increaseX();
        a.doSomething();
    }
}

Hier wird in der Methode ClassB.increaseAndOutput(Class A) ein Objekt von ClassA verwendet, und x wird erhöht und ausgegeben. Du kannst, wenn du mehrere Objekte von einer Klasse brauchst, auch solche Methoden schreiben:
Java:
public void doSomething(ClassA a1, ClassA a2, int i, int x ....) {
}
 
Ich habe es jetzt so hingebracht (glaube ich zumindest, weil ich konnte es noch nicht testen...)

Die Klasse K2 braucht eine Referenz auf ein K1:

Java:
public class K2 {
  private K1 k1;
  
  public K2 (K1 k1) {
    this.k1 = k1;
  }  

  public void doIt () {
    System.out.println(k1.a); // Besser wäre hier ein getter: getA()
  }
}


Das Problem ist eben noch, dass ich jetzt die beiden Klassen habe und die "getauschten" Variablen nicht gleich wieder Fehler spucken...

Jetzt würde ich gerne eine weitere Klasse zusammenbauen, die die beiden Methoden in den Klassen ausführt, ich habe es so probiert wie unten beschrieben, es funktioniert aber nicht, Fehlermeldung:
The constructor K1() is undefined

Die Klasse:
Java:
public class C {
	
	public static void main(String[] args) {
		
		K1 k1 = new K1 ();
		K2 k2 = new K2 ();
	}
}

Was habe ich wieder versiebt? Ich sehe keinen Fehler mit den Namen
 
Hier nochmal der Ganze relevante Code, falls es hilft...

Java:
//Erste Klasse
public class K1 {
//.
//.
//.
	//Referenz K2
	private K2 k2;
	
public K1 (K2 k2) {
		
		//Referenz K2
		this.k2 = k2;

//.
//.
//.

// 2. Klasse
public class K2 {

//.
//.
//.
	//Referenz EnCrypt
	private K1 k1;
			
			
	public K2 (K1 k1) {
			
		//Referenz DeCrypt
		this.k1 = k1;

//.
//.
//.


Dritte Klasse
public class C {


	public static void main(String[] args) {
		

		K1 k1 = new K1 ();
		K2 k2 = new K2 ();
		
	}
}
 
Hier nochmal der Ganze relevante Code, falls es hilft...

Java:
//1. Klasse
public class K1 {

	
	private K2 k2;

	public K1 (K2 k2) {
		
	this.k2 = k2;

// 2. Klasse
public class K2 {

	private K1 k1;
					
	public K2 (K1 k1) {
			
	this.k1 = k1;

//3. Klasse
public class C {

	public static void main(String[] args) {

		K1 k1 = new K1 ();
		K2 k2 = new K2 ();	
	}
}
 
Da fehlen ne Menge Klammern.

Zu deinem Fehler:
Java:
public K1 (K2 k2) {
Du hast hier definiert dass du nen K2 übergeben musst. Das machst du aber nicht. Bei K2 das selbe.
 
Ja da fehlt sonst auch noch sehr viel ; )

Ich habe nur das relevante reingesetzt, hätte vllt die wichtigsten noch reinsetzen sollen, stimmt.

Was meinst du damit?

Klasse 1 und 2 sollten korrekt sein

Die Frage ist nur wie ich die jetzt starte mit der Klasse 3
 
Du solltest dich erstmal schlau machen, was der Compiller dir sagt 😉
Dann schaust du in die Klassen und stellst fest, dass beide K1 und K2 jeweils nur einen Konstruktor haben, der einen Parameter hat. Danach siehst du in der Main Methode, dass die Objekte die du da erzeugst, keine Parameter übergeben bekommen.
Das zu fixen, sollte dann doch kein Problem sein, oder?
 
Habe ich das richtig verstanden, dass ich in der Main-Methode die Parameter angeben muss, die ich übergebe/zurückbekomme?

Ich habe mal die Compiler-Vorschläge durchprobiert, dort kommen dann eben die Parameter hinten in die Klammern und er will noch Exceptions hinzufügen, habe ich gemacht und jetzt kommt immer die Meldung es gäbe eine Exception in der Main-Methode:

java.lang.NullPointerException


Was heisst das?

Und wie kann man das lösen?


(Beim Ersten aufrufen habe ich hinten in der Klammer "null" und beim 2. dann den Parameter vom 1...

Langsam verstehe ich übrigends gar nichts mehr :autsch:???:L
 
Habe ich das richtig verstanden, dass ich in der Main-Methode die Parameter angeben muss, die ich übergebe/zurückbekomme?
in diesem Fall geht es darum, dass du in deinen Klassen K1 und K2 jeweils einen Konstruktor hast, der erfordert, dass er Objekt der jeweils anderen Klasse entgegen nimmt.

Ich habe mal die Compiler-Vorschläge durchprobiert, dort kommen dann eben die Parameter hinten in die Klammern und er will noch Exceptions hinzufügen, habe ich gemacht und jetzt kommt immer die Meldung es gäbe eine Exception in der Main-Methode:
java.lang.NullPointerException
Was heisst das?
Und wie kann man das lösen?

NullPointerExceptions heißen, dass du versuchst an ''null'' etwas aufzurufen:
Java:
 String s = null;
s.length(); // Wirft eine N.P.E. da "s" null ist
Du übergibst einer Klasse da als Parameter null und rufst darauf etwas auf. Das kann man entweder damit lösen, dass man prüft, ob etwas null ist, oder indem man dafür sorgt, dass null nie vorkommt.

(Beim Ersten aufrufen habe ich hinten in der Klammer "null" und beim 2. dann den Parameter vom 1...
Langsam verstehe ich übrigends gar nichts mehr :autsch:???:L
Du solltest dich hier fragen: Warum muss K1 Daten von K2 haben und umgekehrt?
Einfacher wäre es, wenn du z.B. K1 noch einen Konstruktor gibst, der keinen Parameter benötigt.

Wenn du mal natürlichsprachlich erklären kannst, was K1 und K2 machen sollen ist es leicht sowas zu modellieren. Im praktischen Fall hat man nur (ganz ganz ganz)^10 selten den Fall, dass es so einen Zyklus (K1 braucht Objekt von K2, K2 braucht Objekt von K1) gibt und selbst dann, sollte man das vermeiden.
 
Ok hier noch der gesamte Code

Der Debugger sagt, dass in zeile 41:
Java:
 s = ((deCrypt.y2)^k1)%p;
,deCrypt.y2 null gibt, wieso?

Java:
import java.net.SocketException;


public class EnCrypt {
	
	
	public int p;//Grosse Primzahl p, es gilt p = 2*q +1, öffentlich
	public int a;//Primitivwurzel von p, öffentlich
	
	public int y1;//Teilschlüssel 1 (aus a und k1), öffentlich
	
	public int c1;//1. Teil der verschlüsselten Nachricht (aus a und k1 bzw. k2 mod p)
	public int c2;//2. Teil der verschlüsselten Nachricht (aus s und m mod p)
	
	private int m;//Erkennungsmerkmal eines Netzteilnehmers (zu verschlüsselnde Zahl), 0<=m<=p-1, geheim
	private int k1;//Zufällige Zahl zwischen 0 und p-1 (Teilnehmer A), geheim
	private int s;//Geheimer, gemeinsamer Schlüssel (aus a, k1 und k2 mod p), geheim
	
	//Referenz DeCrypt
	private DeCrypt deCrypt;
		
		
	public EnCrypt (DeCrypt deCrypt) {
		
		//Referenz DeCrypt
		this.deCrypt = deCrypt;
		
		//Primzahl P (öff)
			p = 11;
		
		//Primitivwurzel a (öff)
			a = 7;
			
		//geh. Zahl k1
			k1 = (int) (Math.random()*(p-1));
			
		//Teilschlüssel (öff)
			y1 = (a^k1)%p;
			
		//gemeinsamer Schlüssel s (geh.)
			s = ((deCrypt.y2)^k1)%p;
			
		//Mac-Address
			m = 4;

		//1. Teil der Nachricht (öff)
			c1 = (a^k1)%p;
			
		//2. Teil der Nachricht (öff)
			c2 = (s*m)%p;


		//Kontrollausgabe
			System.out.println("Verschlüsselung");
			System.out.println("Nachricht 1:          "+c1);
			System.out.println("Nachricht 2:          "+c2);
			System.out.println("Nachricht Ursprung:   "+m);
			System.out.println("Schlüssel:            "+s);
			
	}
}

Java:
public class DeCrypt {

	
	private int m;//Erkennungsmerkmal eines Netzteilnehmers (zu verschlüsselnde Zahl), 0<=m<=p-1, geheim
	private int k2;//Zufällige Zahl zwischen 0 und p-1 (Teilnehmer B), geheim
	public int y2;//Teilschlüssel 2 (aus a und k2), öffentlich
	private int s;//Geheimer, gemeinsamer Schlüssel (aus a, k1 und k2 mod p), geheim
	
	//Referenz EnCrypt
	private EnCrypt enCrypt;
			
			
	public DeCrypt (EnCrypt enCrypt) {
			
		//Referenz DeCrypt
		this.enCrypt = enCrypt;

		k2 = (int) (Math.random()*(enCrypt.p-1));
		y2 = (enCrypt.a^k2)%enCrypt.p;
		s = (enCrypt.c1^k2)%enCrypt.p;
		m = enCrypt.c2/s;
		
	//Kontrollausgabe
		System.out.println("Entschlüsselung");
		System.out.println("Nachricht1:         "+enCrypt.c1);
		System.out.println("Nachricht2:         "+enCrypt.c2);
		System.out.println("Nachricht Ursprung: "+m);
		System.out.println("Schlüssel:          "+s);
	
	
	}
}

Java:
import java.net.SocketException;

public class MainICrypt {


	public static void main(String[] args) throws NumberFormatException, SocketException {
		

		EnCrypt ec = new EnCrypt (null);
		DeCrypt dc = new DeCrypt (ec);
		
	}
}


Und was gibt es sonst noch alles am anfängercode auszusetzen?
 
Weil du null übergibst. Was erwartest du denn stattdessen?!

Schau dir nochmal die OOP Grundlagen an.
 
Eine Instanz von DeCrypt, die du zu dem Zeitpunkt aber noch nicht hast.
Du könntest die Instanz nach dem erstellen per setter setzen oder du entkoppelst die beiden Klassen. Eine <-> Beziehung macht nur in wenigen Fällen wirklich sinn.
 
Java:
ec.setDeCrypt(de);

Schau dir wirklich mal noch die Grundlagen an 😉
 
Kleine Brötchen backen, die allmählich immer größer werden bringt im programmieren sehr viel mehr Spaß als sich ohne Grundverständnis an größere Sachen heranzutrauen... Ich war vor nicht allzu langer Zeitr genauso. Guck dir mal sowas an wie Sichtbarkeit von Variablen, das was überhaupt in Variablen gespeichert wird (primitive/komplexe Datentypen) Parameter in Methoden usw... ist jetzt nicht böse und ich bin noch lange nicht das was man als gut bezeichnen würde, aber nimm dir das mal zu Herzen, mir hat's auch geholfen 😉
MfG
 

Neue Themen


Zurück
Oben