Passwortgeschützter Text Teil 2

Status
Nicht offen für weitere Antworten.
hallo leute,
wir haben an unserer uni (erstes semester) folgendes zu lösen. ich denk mal wir sind ziemlich weit alleine gekommen und wir haben hier heute mittag schonmal um hilfe gebeten. im folgenden die fragestellung, mein kompletter quelltext und mein problem damit. ich bitte (und bedanke mich schonmal) für laienverständliche (!!) hilfe :)
soll heißen: uns ist nicht viel mehr syntax bekannt als unten verwendet wird
da dies mein erster eintrag in diesem forum ist verzichte ich aus faulheit ersmal

fragestellung:
Ihre Aufgabe: Passwortgeschützter Text
In einer speziellen Datenkonstruktion soll ein Text abgelegt werden (in einem späteren
Projektstadium wird dieser auf die Festplatte gelegt werden(anmerkung von mir: der text kann als objekt während der laufzeit im ram gespeichert werden; er muss nicht auf die festplatte gespeichert, aber denoch gekapselt gespeichert werden)) und mittels Passwort vor
ungewollten Zugriff geschützt werden.
Schreiben Sie eine Applikation, die eine einzugebende Anzahl an entsprechenden Objekten
der Klasse Daten enthält, deren Textinhalt über Zugriffsmodifikatoren nach außen gekapselt
ist.
Erst nach Eingabe eines gültigen Passwortes, das über entsprechende Objekte der Klasse
Passwort verwaltet und geprüft wird, soll der Benutzer den Text angezeigt bekommen.
Nach der dreimaligen falschen Eingabe eines Passwortes erhält der Benutzer über ein weiteres
Masterpasswort dreimal die Gelegenheit das nun gesperrte Passwort wieder freizugeben.
Gelingt auch dies nicht, wird der Inhalt des Datenobjektes gelöscht.
Zur Vorgehensweise:
Bevor Sie Ihr Programm schreiben, erstellen Sie bitte entsprechende Klassendiagramme aller
benötigten Klassen.
Da Ihr Projekt ganz oder teilweise auch von Anderen bearbeitet werden soll, definieren Sie
bitte für alle Klassen, aus denen Objekte angelegt werden sollen, entsprechende Interfaces,-
auch hier bitte auf die Dokumentation achten.
Um eine Fehlentwicklung Ihres Projektes wegen falscher Interfaces zu vermeiden, nehmen
Sie bitte frühzeitig Rücksprache wegen Ihres Enwicklungsstandes.
Erstellen Sie Ihre Programme (ausschließlich) unter Verwendung von sprechenden Namen
und kommentieren Sie Ihren Quellcode so ausführlich, dass Ihr Vorgehen ohne
Programmierkenntnisse nachvollziehbar ist.
Beachten Sie die Java-Codekonventionen.

mein quelltext:
import javax.swing.*;

public class Main2{
public static void main(String[] args){
//Masterpasswort setzten
Master master=new Master(JOptionPane.showInputDialog(null, "Geben sie das Masterpasswort ein."));
//nötige Deklarationen
int anzahlObjekte=-1, click=0;boolean masterwert=false;
//do-whileschleife
do {
JOptionPane.showMessageDialog(null, "Erstellen sie mindestens einen Text!");
String a=JOptionPane.showInputDialog(null, "Wieviele Texte wollen sie verschlüsseln?");
anzahlObjekte=Integer.parseInt(a);


} while (anzahlObjekte<1 );
Texte[] text=new Texte[anzahlObjekte];

for (int i=0;i<anzahlObjekte ;i++ ) {
text=new Texte(JOptionPane.showInputDialog(null, "Geben sie Text "+(i+1)+" von "+anzahlObjekte+ " ein."),JOptionPane.showInputDialog(null, "Geben sie einen Schlüssel ein."));
}
do{


JTextField[] feld={new JTextField("0"),new JTextField("0")};
Object[] msg={"Geben sie die Nummer des zu entschlüsselnden Textes ein.",feld[0],"Geben sie den Schlüssel ein.",feld[1]};
click=JOptionPane.showConfirmDialog(null, msg);

int arrayIndexZahl=(Integer.parseInt(feld[0].getText()))-1;
String pwUser=feld[1].getText();

String ausgabe= text[arrayIndexZahl].getSchluesselstring(arrayIndexZahl, pwUser);


JOptionPane.showMessageDialog(null, ausgabe);


}while(click==0);
JOptionPane.showMessageDialog(null, "Das Programm wird beendet.");
}
}

import javax.swing.*;
public class Texte extends Main2
{
int anzahlObjekte; Master master;
private String[] texte=new String[anzahlObjekte];
private String[] passwoerter=new String[anzahlObjekte];
private int[] versuche=new int[anzahlObjekte];
String text;
String passwort;

public Texte(String text, String passwort){
this.text=text;this.passwort=passwort;
plazierePasswort(passwort);
plaziereText(text);
this.text=null;this.passwort=null;text=null;passwort=null;
for(int i=0; i<anzahlObjekte; i++){
this.versuche=3;
}

}

public String getSchluesselstring(int arrayIndexZahl,String pwUser){
String ausgabe="Fehler";
String pwString=passwoerter[arrayIndexZahl];

if(pwString.equals(pwUser)){
ausgabe=texte[arrayIndexZahl];
}else{
versuche[arrayIndexZahl]-=1;
if(versuche[arrayIndexZahl]==0){
for(int i=2;i==0;i--){
boolean masterwert=false;
masterwert=master.masterWert(JOptionPane.showInputDialog(null, "Masterpasswort? Versuch "+(i+1)));
if(masterwert==true){
passwoerter[arrayIndexZahl]= JOptionPane.showInputDialog(null, "Geben Sie ein neues Passwort ein");
}if(i==0){
texte[arrayIndexZahl]=null;ausgabe="Sie haben das Passwort dreimal falsch eingegeben.\nText "+arrayIndexZahl+" wurde gelöscht.";
}
}
}else{
ausgabe="Ihre Eingabe war fehlerhaft. Sie haben noch *"+versuche[arrayIndexZahl]+ "Versuche.";
}
};



return ausgabe;
}

private void plazierePasswort(String passwort){
for(int i=0;i<anzahlObjekte;i++){
if(this.passwoerter==null){
this.passwoerter=passwort;
}
};
}
private void plaziereText(String text){
for(int i=0;i<anzahlObjekte;i++){
if(this.texte==null){
this.texte=text;
}
};
}

}

public class Master {
public String master;
public Master(String master){
this.master=master;
}

public boolean masterWert(String masterUser){
boolean masterwert=false;
if(this.master.equals(masterUser)){
masterwert=true;
}
return masterwert;
}

}



Mein problem:
ich erhalte (wenn ich nach programmstart(ich nutze den JavaEditor) überall "1" eingebe) folgenden laufzeitfehler:

Starte C:\Dokumente und Einstellungen\PC\Desktop\test\Main2.java

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
at Texte.getSchluesselstring(Texte.java:24)
at Main2.main(Main2.java:32)

ich verstehe darunter nur, dass eines meiner arrays um den wert "0" zu groß oder zu klein ist
.....ergo: kacke °__°_°_°__°_°_°

ich komme nicht weiter und bitte um hilfe...^^ nochmals danke im vorraus...
ich denke mal ich hab alles notwendige gepostet..(tut mir leid dass die kommentare auf der strecke geblieben sind ich hatte keinen nerv mehr ...) also bitte nicht sauer sein wenn ich nicht alle 5 minuten antworten werde :p
 

hdi

Top Contributor
Schreiben Sie eine Applikation, die eine einzugebende Anzahl an entsprechenden Objekten
der Klasse Daten enthält, deren Textinhalt über Zugriffsmodifikatoren nach außen gekapselt
ist.

Damit ist nicht nur gemeint, dass du ein Passwort verwenden sollst, sondern vorallem erstmal,
dass du alle Attribute (nicht zu verwechseln mit lokalen Variablen) private machst.
Das kannst du dir gleich mal für den Rest deines Lebens merken ;) Immer private, niemals public.

Wenn du damit auf Probleme stösst google mal nach "Java Getter Setter".

Den Code muss ich mir erstmal in Eclipse pasten, bitte nutze den "Code"-Button beim Schreiben einer Nachricht,
dann wird der formatiert. Das ist viel übersichtlicher und man sieht auch die Zeilennummern, ich müsste
jetzt bis zur 32.Zeile durchzählen um den Fehler zu finden.

Ich meld mich wieder wenn ich dein Programm mal überblickt hab ;)

edit:

So da bin ich wieder. Also. Rein aus Objekt-orientierter Sicht ist das ganz großes Chaos ;) So wie bei
jedem am Anfang. Darauf will ich nicht konkret eingehen, das dauert zu lange, ich empfehle dir generell
mal die FAQ durchzublättern, damit du besser coden lernst (siehe oben).

Konkret zu deinem Problem:
Kuck mal in deine Klasse "Texte"

Code:
public class Texte extends Main2 {
	int anzahlObjekte;
	private String[] passwoerter = new String[anzahlObjekte];

        // ...
}

Das sind ja beides Klassen-Attribute. Du initialisiert das String-Array "passwoerter", aber wie?
Es soll ein Array sein der Länge "anzahlObjekte". Das ist auch ein Klassen-Attribut, aber das ist
NICHT initialisiert!

Und hier entsteht das Problem: Standardmässig hat der Datentyp int den Wert "0", wenn man ihn
nicht initialisiert. Das heisst du erstellst hier bei passwoerter ein String-Array der Länge 0.
Egal mit welchem Index du jetzt dann hier:

Code:
public String getSchluesselstring(int arrayIndexZahl, String pwUser) {
		String pwString = passwoerter[arrayIndexZahl]; // <--- Hier der Zugriff auf ein 0-Array!
                // ...
}
drauf zugreifst: Es wird immer ein Fehler kommen, weil eig. hast du gar kein Array, du hast kein einziges
Fach dadrin...

Also was ich dir zur Lösung vorschlage: Bau dir in der Klasse "Texte" eine Methode, mit der du das Passwörter-Array
mit passender Länge initialisierst.
Ein passender Moment dafür wäre ja, wenn du vom User die Anzahl der Texte eingelesen hast, die er
erstellen möchte (es gibt ja genauso viele Passwörter wie Texte).
 
S

SlaterB

Gast
Exkurs:
> Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0

> ich verstehe darunter nur, dass eines meiner arrays um den wert "0" zu groß oder zu klein ist

die Fehlermeldung bedeutet: das Array hat keinen Index 0,
da keine NullPointerException auftritt, muss es ein Array der Länge 0 sein
 
öhmm ja den code button hab ich wohl gekonnt übersprungen... pardon.

also in der texte.java ist ja alles notwendige an attributen (bis natürlich auf die von der Main2.java vererbten Attribute entweder private oder durch den constructor wieder "null"gesetzt.

in der master.java hab ich das attribut "String master" private gesetzt. lässt sich noch compilieren^^. danke soweit mal
 
dann lag ich wohl falsch wenn ich bisher gehofft habe dass "int anzahlObjekte" während der Laüfzeit veererbt werden soll. das war eigentlich (abgesehen von dem "Master" objekt, welches ich zuletzt erstellt hab) der eigentliche grund vom extenden...
 
ja dann bedanke ich mich an dieser stelle mal hört sich alles brauchbar und verständlich an :)

danke für die hilfe falls es nichts wird melde ich mich nochmal :)
 

hdi

Top Contributor
Wenn man erbt, hat man AUTOMATISCH alle Attribute und Methoden in der Unterklasse.
Wenn du sie dort wieder definierst, überschreibst du sie. (Override)

Dazu hier mehr

Das ist ja der Sinn des ganzen. Wenn du eh alles nochmal schreibst, was hast du dann bitte
einen Vorteil mit Vererbung ;)
 

hdi

Top Contributor
Gut für Vorlesungen ist x-moto. Aber wenn man damit einmal angefangen hat, fällt man in allen Klausuren durch :(
 

Ebenius

Top Contributor
hdi, man kann in Java nur Methoden überschreiben, keine Member-Variablen. Wenn man in der Unterklasse die selben Member-Variablen benutzt dann versteckt man die darunter liegenden. Außerdem kann man auch private Methoden nicht überschreiben. Man definiert sie nur neu und sie heißen zufällig wieder so. :)
 

hdi

Top Contributor
Das mit private ist klar, ich wollte jetzt nicht anfangen ihm alles mögliche über Vererbung zu erzählen, dafür
ist der Link da.

Und geerbte public Methoden überschreibt man genauso wenig, man versteckt sie auch nur
(per super noch erreichbar)

Aber es nennt sich Override. Oder verpeil ich hier was?
 
na ich denk ich seig dann hier mal aus... eine letzte frage noch... wenn ich meinem objekt text den übergabewert anzahlObjekte dazugebe, und dieser sich nicht ändert, aber jedesmal neu gesetzt wird, setzt ich dann vorhandene arrayeinträge "null"?
 

hdi

Top Contributor
ja, weil sowas wie array.setLength() gibt es nicht. Die Länge kannst du nur im Zuge einer
Initialisierung machen, und damit erstellst du ein neues Array, dass nur null-Einträge enthält.

PS: Member-Variable ist ein anderer ausdruck für Klassen-Variable, also sowas wie
dein "passwoerter" Array

edit: Moment mal, nur damit das klar ist: Wenn du einfach nur "anzahlObjekte" änderst, hat
das null Einfluss auf irgend ein anderes Objekt! Also streng genommen: Wenn du nur anzahlObjekte
änderst, dann passiert mit deinem Array nichts weiter.
Du kannst halt nicht einfach die Länge von einem Array neu setzen, das geht einfach nicht.
 
ich habe meinem constructor den wert anzahlObjekte hinzugefügt, der jedesmal die länge meiner arrays auf anzahlObjekte festelegt, wenn ein neues objektt erstellt wird. so habe ich (ganz faul) die übergabe geregelt. das heißt dann also aber , dass ich jedes mal semtliche arrays( die von anzahlObjekte abhängig sind) "null setze?
wie übergebe ich dann diesen wert, ohne ein neues objekt zu erstellen?
 

hdi

Top Contributor
Nein ich verpeile nix. Nochmal: Es geht hier nicht um private Methoden, das ist mir vollkommen klar, dass
man die nicht überschreiben kann in einer Unterklasse.

Es geht um public Methoden, und ich sage man kann die genausowenig überschreiben wie Member-Variablen,
wenn man so argumentiert wie du (also dass es eigentlich nur ein Verstecken ist)

per super kannst du jederzeit auf die Version der Oberklasse dieser Methode zugreifen. Hier ist auch
ein Fehler in der wiki-seite, diese sagt nämlich es geht nur innerhalb der überschriebenen Methode, aber
das super kannst du an jeder Stelle verwenden.
Also istes lediglich ein Verstecken der Oberklassen-Methode in der Unterklasse.
Genauso wie bei Member-Variablen. Auch hier kannst du per super drauf zugreifen, wenn sie public sind.

Insofern verstehe ich halt deinen Satz nicht:

hdi, man kann in Java nur Methoden überschreiben, keine Member-Variablen.

Das stimmt nicht, man kann beides überschreiben, bzw. verstecken, aber das ist nur eine Frage wie du
es nennen willst, der Effekt ist der gleiche.
 

hdi

Top Contributor
@Satan

Also du kannst die Länge eines Arrays nur einmalig(!) beim Initialisieren festlegen.
Wenn du das ändern willst, musst du ein neues Array erstellen. Dieses ist dann aber leer.
Du kannst jetzt natürlich anfangen, ein temporäres Array zu machen mit der neuen Grösse,
dann alle alten Werte darein kopieren, und als letztes dein altes Array mit dem neuen überschreiben.

Das ist aber nicht besonders elegant.

Um dir besser helfen zu können, würd ich gerne wissen wie genau du das mit diesem "anzahlObjekte"machst.
Also ich meine setzt du das nicht einmal am Anfang? Wieso willst du es denn im Verlauf des Programms abändern?
 
ich muss ja laut textstellung eine beliebige zahl an texten mit passworten versehen können. also müssen meine arrays in der länge variabel bleiben. sie brauchen alle die gleiche länge, die vom benutzer anfags abgefragt wird. ich weiß aber nicht, wie ich diesen wert als attribut gesetzt bekomme BEVOR ich meine objekte überhaupt erstelle. wenn ich den wert erst danach erstelle setzte ich meine arraywerte ungewollt "null". also im grunde wäre ich dankbar wenn du mir deine frage an mich mit dem "...einmal am anfang setzen..." beantworten könntest^^
 

hdi

Top Contributor
ich weiß aber nicht, wie ich diesen wert als attribut gesetzt bekomme BEVOR ich meine objekte überhaupt erstelle.

Nichts leichter als das. Statt:

Code:
String[] passwoerter = new String[anzahlObjekte];

schreibst du:

Code:
String[] passwoerter;

Damit hast du nur eine Variable, das ist noch kein Objekt. Jetzt liest du erstmal in Ruhe ein, wieviele
Texte bzw. Passwörter es geben soll, und rufst dann eine Methode auf, die du in der Texte-Klasse
wie folgt implementierst:

Code:
public void setNumberOfPassword(int numPasswords){
     passwoerter = new String[numPasswords];
}

Und diese Methode rufst du dann innerhalb deiner main-Methode in Main2 auf, sobald du diese Info hast.

Also verstehst du die Member-Variablen sind nur Variablen (surprise ;)), du musst da nicht sofort irgendwas
erstellen. Und selbst wenn: Da steht ja noch nix drin, also kannst du es auch danach überschreiben.

Was ich meinte ist, du musst ja nicht diese Liste tatsächlich mit Werten befüllen, und später nochmal mit
Werten befüllen. Das machst du ja wohl nur ein mal, oder nicht?
 

Ebenius

Top Contributor
hdi, Du hast Da wirklich was falsch verstanden. Überschreiben heißt es, weil die Methode in der VMT (Virtual Method Table) des Objektes überschrieben wird. Das geht nur mit virtuellen Methoden. Und diese Technik habe ich nicht benannt. Die hat Ihren Namen nunmal.

Was den Fehler in der Wiki angeht: Ist nicht wirklich ein Fehler. Die Wiki sagt, dass die überschriebene Methode durch die überschreibede verfügbar ist. Und dass die überschriebene durch die Klasse nicht mehr verfügbar ist. Beides ist wahr. In Zeile 36 gibt's natürlich einen Compiler-Error. In Zeile 21 natürlich nicht.
Code:
class OverrideFun {
  private class AA {

    void a() {
      System.out.println("A");
    }

    private void c() {
      System.out.println("A");
    }
  }

  private class BB extends AA {

    @Override
    void a() {
      System.out.println("B");
    }

    private void b() {
      super.a();
    }

    @Override
    private void c() {
      System.out.println("A");
    }
  }
  
 /**
   * Test main method.
   * 
   * @param args ignored
   */
  public static void main(String[] args) {
    System.out.println(new BB().super.a());
  }
}

Interessant ist Zeile 24. Dort gibt es ebenfalls einen Compiler-Error, weil eben private Methoden nicht überschrieben werden.

[ edit ] Natürlich hast Du bezüglich des Threads vorhin nicht unrecht gehabt. Das wollte ich auch nicht ausdrücken. Nur auf Deine Aussage als solche beziehe ich mich.

Ebenius
 
so... ich hock jetzt stundenlang dran und die konzentration ist im eimer... den letzten eintrag (von hdi) versuch ich morgen in alter frische :) danke für die hilfe. ich schau hier morgen nochmal rein
 

hdi

Top Contributor
Sorry, ich will's einfach nicht verstehen.

Die Wiki sagt, dass die überschriebene Methode durch die überschreibede verfügbar ist. Und dass die überschriebene durch die Klasse nicht mehr verfügbar ist. Beides ist wahr.

Beides ist FALSCH. Bzw. ersteres stimmt auch, aber nicht nur, und deshalb stimmt zweiteres auch gar nicht.

Also:

Code:
class A{

    public void fun(){
        System.out.println("A");
    }
}

class B extends A{

    @Override
    public void fun(){
        System.out.println("B");
    }

    public void blub(){
        super.fun();
    }
}

Voll kompilierbar und die Methode blub() printet "A" aus. Also ist die überschriebene Methode in der Unterklasse
SCHON verfügbar, und zwar ÜBERALL. durch super! Deswegen ist der erste Satz nich wirklich richtig, weil
es so klingt als sei die Original-Methode der Oberklasse NUR in der überschriebenen aufrufbar.

Und ansonsten weiss ich nicht was du mir mit deinem Bsp sagen willst. Was sind virtuelle Methoden? Also
ich rede hier lediglich von dem, was ich hier grad aufgezeigt hab.

Und hier sieht man, dass public Methoden NICHT überschrieben werden, auch wenn man es vllt. so nennt.
Sie sind noch immer überall da.

Hast du noch Kraft mir auf die Sprünge zu helfen? Ich weiss echt nicht wovon du hier redest.
 
wie kann ich denn die methode ohne objekt aufrufen??? sie ist ja nicht statisch also brauche ich doch ein objekt in der main für den aufruf.

z.B.: texte[0].setNumberOfPassword(...showInputDialog...);
 
nein? glaub ich?wenn ich einen text erstell wird er durch den constructor direkt ins array geleitet. also muss die länge spätestens vorhanden sein sobald ich meinen ersten text erstelle. und mehr als texte erstell ich ja nicht außer nem master, der aber nichts damit zu tun hat. bin im bett :) schaue morgen nochmal nach
 

hdi

Top Contributor
Also machen wir das zusammen, ich helf dir. Ich geb dir ne Vorlage und du vervollständigst das dann.
Du hast eine Klasse Texte, die ein Array von Texten und Passwörtern hat. Aber dann
erstellst du für jeden Text + Passwort ein eigenes Objekt und hast im Endeffekt ein Array von Texte-Objekten.
Also ein Array von Arrays von Texten mit Passwörtern.

Das gibt doch keinen Sinn, findest du nicht auch? Deine Klasse heisst Texte,
d.h. ein einziges Texte-Objekt sollte alle Texte speichern, wenn du das schon so machst.

Aber ich würde das eh anders machen:

Mach eine Klasse "VerschluesselterText", diese enthält einfach nur 2 Strings als Member-Variablen:
Einmal der Text selber, und einmal das Passwort das man braucht um ihm anzuzeigen.
Und zwar keine Arrays, wie gesagt nur genau 1 Text-String und 1 Passwort-String.

Der Konstruktor kann so bleiben wie in deiner Texte-Klasse, also du übergibst ihm einen String und
ein Passwort, dass du über ein JOptionPane einliest.

Dann hast du jetzt erstmal rumliegende VerschluesselterText-Objekte, und jedes repräsentiert
genau einen Text mit dem PW das man braucht. D.h. du gibst der Klasse nur noch 2 Getter:

Code:
public String getText(){
    return this.text;
}
public String getPassword(){
    return this.password;
}

Und deine Master-Klasse änderst du jetzt wie folgt ab:

Code:
class Master {

    private VerschluesselterText[] verschluesselteTexte;
    private String masterPassword;

    public Master(String masterPassword, int anzahlTexte){
         this.masterPassword = ??? ;
         verschluesselteTexte = new VerschluesselterText[ ??? ];
    }
}

Diesen Master erstellst du bevor du anfängst die einzelnen Text-Objekte zu erzeugen (also so wie du
es bisher gemacht hast).
Weil man wird ja nach dem Master-PW UND der Anzahl der Texte gefragt, BEVOR man alle Texte mit ihren
Passwörtern eingibt. D.h. du hast beide Informationen um den Master-Konstruktor aufzurufen, und der verwaltet,
weil er ja Master heisst, alle Text-Objekte. Er hat also jetzt dann ein gesetztes Master-PW sowie ein Array,
wo genau soviele Text-Objekte reinpassen, wie du im Folgenden dann erstellen wirst.

Und deine Schleife, in der du die einzelnen Objekte erstellst, sieht dann so aus:



Code:
// hier wurde irgendwo schon das Master-Objekt erzeugt
for (int i = 0; i < anzahlObjekte; i++) {
        String text = JOptionPane.showInputDialog(null,"Geben sie Text " + (i + 1) + " von " + anzahlObjekte+ " ein.");
        String key = JOptionPane.showInputDialog(null,"Geben sie einen Schlüssel ein.");
        VerschluesselterText vText = new VerschluesselterText( ??? , ??? );
	    master.insert( ??? );
}

...und diese insert() Methode in der Klasse Master codest du halt so, dass sie an geeigneter Stelle dieses
Objekt in dem Array, das der Master hat, einfügt. Damit du weisst wo er es einfügen soll, erstellst du im Master
am besten noch ein Attribut "arrayCount" (int), das du immer hochzählst, sobald du was eingefügt hast:

Code:
public void insert(VerschluesselterText vText){
    verschluesselteTexte[arrayCount] = vText;
    ??? // hier fehlt noch was
}

Und wenn du jetzt dann die Abfrage machst, dass ein User eine Nummer + Schlüssel eingeben soll, dann
leitest du das an den Master weiter (das MAster-Objekt liegt ja in deiner Main2-Klasse, und dort holst du dir
ja auch die Infos die der User eingibt).

Das sieht dann ungefähr so aus:

Code:
// Methode in Klasse Master:
public String getEntschluesselterText(int nummer, String userPassword){
       String realPassword = verschluesselteTexte[nummer].getPassword();
       if ( ??? ){
               return verschluesselteTexte[???].getText();
       }
       // wenn wir hier ankommen, war das userPassword nicht richtig:
       return "Fehler: Falsches Password angegeben!"; // oder sonst was
}

Die Nummer wird dir auf jeden Fall immer das richtige Objekt liefern, weil du ja in deiner Schleife zuerst das erste einfügst, dann das zweite usw.
Achtung: Du musst dir aber überlegen, wie du den Wert "nummer" übergibst.. Hier lauert eine Gefahr, du hast
ja IndexOutOfBoundsException schon kennengelernt ;)


Wichtig ist, dass du vorallem verstanden hast: Du hast da kein grosses Wirrwarr in der Main2, du hast
dort nur einen Master, und ansonsten erstellst du da über JOptionPanes ein paar Text-Objekte, die du dem
Master gibst bzw. leitest Anfragen an den Master weiter.
Diese Geschichte vonwegen nach 3x falsch eingeben und dann mit Master-Password und so, das kommt auch noch
in die Main2 weil darum kümmert sich ja der Programmablauf.
Dafür brauchst du dann wohl in der Master-Klasse noch so eine Methode:

Code:
public String getEntschluesselterTextAsMaster(int nummer, String usrPassword){
        if( ???.equals(this.password) ){  // Aufgepasst: Was ist hier mit this.password gemeint
              return ???
        }
        // wenn wir hier ankommen, war das userPassword nicht richtig:
       return "Fehler: Falsches Password angegeben!"; // oder sonst was
}

Du kannst diese und die "normale" Methode zur Text-Anforderung sicherlich auch irgendwie
in eine packen, aber musst du ja nicht.

Also viel Spaß beim Coden!
 

Ebenius

Top Contributor
Jetzt hab ich aber ganz schön Text geschrieben. Ich hoffe, alles ist verständlich.

hdi hat gesagt.:
Die Wiki sagt, dass die überschriebene Methode durch die überschreibede verfügbar ist. Und dass die überschriebene durch die Klasse nicht mehr verfügbar ist. Beides ist wahr.

Voll kompilierbar und die Methode blub() printet "A" aus. Also ist die überschriebene Methode in der Unterklasse
SCHON verfügbar, und zwar ÜBERALL. durch super! Deswegen ist der erste Satz nich wirklich richtig, weil
es so klingt als sei die Original-Methode der Oberklasse NUR in der überschriebenen aufrufbar.
Wir meinen beide das gleiche. Der erste Satz sollte vielleicht erweitert werden, damit man nicht auf falsche Ideen kommt. Der zweite Satz ist sicher so gemeint, dass man "durch" die Klasse (nicht aus derer, sondern über sie von außen gesehen) nicht auf die überschriebene Method zugreifen kann. So hab ich den Satz interpretiert. Wenn Du das anders liest: okay. Wir meinen dennoch das gleiche. :)

hdi hat gesagt.:
Und ansonsten weiss ich nicht was du mir mit deinem Bsp sagen willst. Was sind virtuelle Methoden? Also
ich rede hier lediglich von dem, was ich hier grad aufgezeigt hab.

Virtuelle Methoden... Du hast nie C++ programmiert. Und wahrscheinlich auch nie Delphi. Auch das ist ein Fachbegriff; siehe Wikipedia.

In Java sind alle nicht-privaten, nicht-statischen Methoden virtuell. Das heißt, die tatsächliche Referenz zum Binär-Code einer solchen Methode wird immer erst zur Laufzeit ermittelt. Bei nicht-virtuellen (in C++ beispielsweise gibt man bei einer Methodendeklaration an, ob sie virtuell ist) wird die Methodenreferenz bereits vom Compiler aufgelöst.

Der Unterschied wird hoffentlich an diesem Beispiel klar: In Java kannst Du das Verhalten einer Komponente ändern, indem Du eine JComponent-Methode überschreibst. Da alle sichtbaren (nicht statischen) Methoden in Java virtuell sind, werden auch alle Zugriffe aus den darüberliegenden Klassen (JPanel, JComponent, ...) für MyPanel-Instanzen Deine neue Methode benutzen. In diesem Beispiel wird die Komponente mehr Abstand am Rand haben, weil die Original-Methode überschrieben wurde. Der LayoutManager würde nun die neue Methode benutzen. Aus Sicht dieses LayoutManagers haben wir also die Methode für dieses Objekt überschrieben.
Code:
public class MyPanel extends JPanel {
  @Override
  public Insets getInsets() {
    return new Insets(30, 30, 30, 30);
  }
}

Bei Member-Variablen ist das aber anders. Das Beispiel ist leider etwas komplizierter, da public Member-Variablen nicht so häufig existieren. JList hat folgende Methode (unverändert). Sie ist dafür verantwortlich, wie breit die Liste auf einem ScrollPane dargestellt wird:
Code:
    public boolean getScrollableTracksViewportWidth() {
        if (getLayoutOrientation() == HORIZONTAL_WRAP &&
                                      getVisibleRowCount() <= 0) {
            return true;
        }
	if (getParent() instanceof JViewport) {
	    return (((JViewport)getParent()).getWidth() > getPreferredSize().width);
	}
	return false;
    }

Angenommen ich leite von JList ab. Ich überschreibe getPreferredSize:
Code:
@Override
public Dimension getPreferredSize() {
  return new Dimension(10, 10) {

      public int width = 1000;
    };
  }
}
Wenn ich nun die VererbteJList -Klasse instanziiere und auf eine ScrollPane lege, wird sie 10×10px groß sein. Und eben nicht 1000×10px. Weil die Variable width eben nicht virtuell ist und damit nicht überschrieben wird.

hdi hat gesagt.:
Hmm... das
Und hier sieht man, dass public Methoden NICHT überschrieben werden, auch wenn man es vllt. so nennt.
Sie sind noch immer überall da.
Nein. Nur innerhalb des Scopes der direkt ableitenden Klasse (zum Scope gehören natürlich alle Inner Classes).

[ edit ] Vielleicht hilft es, noch zu erwähnen, dass nicht die Methoden selbst virtuell sind, sondern der Zugriff auf diese. :)

Ebenius
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Passwortgeschützter Text Teil 3 Java Basics - Anfänger-Themen 6
richis-fragen JComboBox ist editable und eingegebenen Text auslesen bei focusLost() Java Basics - Anfänger-Themen 1
richis-fragen JTable bei aktivieren einer Zelle soll Text selektiert werden. Java Basics - Anfänger-Themen 24
richis-fragen JTable effektiv angezeigter Text ausgeben nicht Inhalt vom Model Java Basics - Anfänger-Themen 9
A Edit Text Negative Decimalzahlen Java Basics - Anfänger-Themen 18
P Aus Text Datei nur Zahlen übernehmen Java Basics - Anfänger-Themen 13
T Text einlesen code was kommt dahin? Java Basics - Anfänger-Themen 1
R Text in der DB abspeichern, und danach bearbeiten Java Basics - Anfänger-Themen 5
A JTextArea entfernen und durch neuen Text ersetzen Java Basics - Anfänger-Themen 8
JavaBeginner22 Button Text verändern Java Basics - Anfänger-Themen 1
GoenntHack Java Text von JLabel verändert sich nicht Java Basics - Anfänger-Themen 1
A Text zu Morsecode Java Basics - Anfänger-Themen 8
O Java Text Area Zeilenausgabe Java Basics - Anfänger-Themen 7
M Text wird in der Console nicht ausgegeben. Java Basics - Anfänger-Themen 11
berserkerdq2 An selbst ersteller txt Datei immer Text dranhängen, ohne den vorherign Text zu löschen Java Basics - Anfänger-Themen 8
M Text in Datei schreiben Java Basics - Anfänger-Themen 9
T208 Text Datei individuell benennen. Java Basics - Anfänger-Themen 5
A Werten aus dem Text ausliesten Java Basics - Anfänger-Themen 6
K Jlabel mit itemlistevent Text gegeben, wird nicht angezeigt Java Basics - Anfänger-Themen 5
Kiki01 Wie würde eine geeignete Schleife aussehen, die die relative Häufigkeit für jeden Charakter in einem Text bestimmt? Java Basics - Anfänger-Themen 3
O Text mit Regex trennen und wieder zusammenbauen Java Basics - Anfänger-Themen 5
xFlozen Text mehrspaltig ausgeben Java Basics - Anfänger-Themen 3
S Zufällige ungerade Zeile aus Text-Datei lesen Java Basics - Anfänger-Themen 5
K Rekursiver Vergleich von Textmuster und Text Java Basics - Anfänger-Themen 2
C Variablen Provided text for message may not be null Java Basics - Anfänger-Themen 9
H Klassen Die Länge einer Text-Node bestimmen Java Basics - Anfänger-Themen 2
F Erste Schritte java.util.Scanner: Beliebig langen Text per Paste in Console eingeben ? Java Basics - Anfänger-Themen 14
GermanPie Discord Text Channel erstellen? Java Basics - Anfänger-Themen 1
C JButton Text 2 Mal ändern funktioniert nicht Java Basics - Anfänger-Themen 8
yoskaem Text Color durch Klicken eines Buttons in anderer Activity ändern Java Basics - Anfänger-Themen 2
B Alle Links in einem Text suchen und ersetzen mit einem neuen Link Java Basics - Anfänger-Themen 18
J Java TextArea Text bei hinzufügen makieren Java Basics - Anfänger-Themen 1
T Text-Ausgabe für Textadventure - Organisation Java Basics - Anfänger-Themen 5
G Anklickbaren Text erzeugen Java Basics - Anfänger-Themen 2
B Text-Datei nur in Stream speichern und dann ausgeben Java Basics - Anfänger-Themen 3
M Java: BufferedReader liest nur die Hälfte der Text-Datei. Java Basics - Anfänger-Themen 4
M Apache POI PPT - Vertikales Alignment von Text im XSLFAutoShape Java Basics - Anfänger-Themen 2
I Nur auf Abfrage von einer Text Datei einlesen Java Basics - Anfänger-Themen 11
P Text Datei einlesen und übertragen Java Basics - Anfänger-Themen 15
P Taschenrechner Text übertragung Java Basics - Anfänger-Themen 3
J java.text.DecimalFormat Java Basics - Anfänger-Themen 5
AnnaBauer21 GridBagLayout JLabel weightx: Unterschiedliche Breite mit & ohne Text Java Basics - Anfänger-Themen 6
K Durch eine Text eingabe etwas Ausführen Java Basics - Anfänger-Themen 5
S Text-To-Speech mit Java Java Basics - Anfänger-Themen 2
L Text-Adventure Java Basics - Anfänger-Themen 3
M Input/Output Java Swing: Prüft ob Text aus JTextField ausschließlich Integer enthält Java Basics - Anfänger-Themen 15
ruutaiokwu Ausgegebene Zeile ersetzen mit neuem Text Java Basics - Anfänger-Themen 3
tsom Erste Schritte itext Text als Block auf neue Seite Java Basics - Anfänger-Themen 0
Dimax Programme ,als Text in MySql speichern Java Basics - Anfänger-Themen 7
CptK Datentypen Text Dateien einlesen Java Basics - Anfänger-Themen 3
Harlequin Compiler-Fehler Text Adventure - "Long Output" Fehler Java Basics - Anfänger-Themen 3
S Zeichen zählen kopierter Text Java Basics - Anfänger-Themen 6
D Text als Code in java-forum.com formatieren. Wie ? Java Basics - Anfänger-Themen 3
F Schreibprogramm nur markierten Text in kursiv oder fett schreiben Java Basics - Anfänger-Themen 3
A Rechnen mit Text und Zahl Java Basics - Anfänger-Themen 4
MaximilianTM Input/Output Einlesen und bearbeiten einer text Datei / Zeile Java Basics - Anfänger-Themen 5
M Erste Schritte Verschlüsselung von text Java Basics - Anfänger-Themen 21
S Text aus einer HTML Datei auslesen Java Basics - Anfänger-Themen 1
S Java Text splitten mit Tabs, Zeilen, Zeichen und Klammern. Java Basics - Anfänger-Themen 6
M Beliebigen Text in *** umwandeln Java Basics - Anfänger-Themen 15
K (JTable) Text einer Zelle auf der linken Seite kürzel Java Basics - Anfänger-Themen 2
H Suche in Text und Markierung Java Basics - Anfänger-Themen 14
H Suche in einem Text Java Basics - Anfänger-Themen 17
F Input/Output Text einlesen lassen Java Basics - Anfänger-Themen 14
L Text eingeben und im Textfeld auslesen lassen Java Basics - Anfänger-Themen 2
R Best Practice Palindrom in einem Text finden Java Basics - Anfänger-Themen 18
J Text Datei einlesen Java Basics - Anfänger-Themen 6
L Text und Ganzzahl in einer Dialogbox Java Basics - Anfänger-Themen 5
D Text Adventure Erstellen Java Basics - Anfänger-Themen 10
T Jlabel durch Text in 2 anderen Jlabels sichtbar machen Java Basics - Anfänger-Themen 4
J JTextArea visible ohne Text Java Basics - Anfänger-Themen 3
D Bild zu Text Java Basics - Anfänger-Themen 4
L Text/Befehle zu Programmen senden Java Basics - Anfänger-Themen 1
L Java Text datei nur bis zu einem Punkt auslesen? Java Basics - Anfänger-Themen 3
T Classpath Problem mit dem auslesen von Text-Dateien (Pfad) Java Basics - Anfänger-Themen 3
S Erste Schritte Sprachermittler - Datei öffnen, Text in TextArea, Bereinigen, Auswerten Java Basics - Anfänger-Themen 14
S Java Label hat komischen text Java Basics - Anfänger-Themen 4
F Text anhand bestimmter Trennzeichen in Textteile trennen (netbeans) Java Basics - Anfänger-Themen 7
S Ausgabe von Text Formatieren Java Basics - Anfänger-Themen 6
H Text in einen Button quetschen Java Basics - Anfänger-Themen 3
A Text mit "Scanner" eingeben und Umlaute ersetzen Java Basics - Anfänger-Themen 7
A Text teilen und Wörter zählen Java Basics - Anfänger-Themen 7
J Zahlen als Text übersetzen Java Basics - Anfänger-Themen 6
F Erste Schritte Label Text vor Methodenaufruf setzen Java Basics - Anfänger-Themen 17
R Text Pane Aktualisierung erst nach JOptionPane Java Basics - Anfänger-Themen 10
I BufferedReader Text-Datei einlesen??? Java Basics - Anfänger-Themen 1
S Wort in Text suchen und ersetzen Java Basics - Anfänger-Themen 3
V Interface ich schäme mich das zu fragen, aber ich schaff nicht ein Text zu zentrieren :( [javaFX] Java Basics - Anfänger-Themen 6
M Input/Output Text auf Fenster zeichen Java Basics - Anfänger-Themen 2
W Klassen Fehler bei public void setLabelText(JLabel label, String text) Java Basics - Anfänger-Themen 11
Chava Testprojekt.Text.Image.Button Java Basics - Anfänger-Themen 4
Z JSlider - Text wird nich angezeigt Java Basics - Anfänger-Themen 0
A Problem mit set.Text und übergabe Java Basics - Anfänger-Themen 2
A Probleme mit equals und get.Text Java Basics - Anfänger-Themen 12
M Text innerhalb Anführungsstriche als "eins" auswerten Java Basics - Anfänger-Themen 5
V Text aus einer .txt dynamisch ins applet einpassen Java Basics - Anfänger-Themen 0
H Text durch Checkbox erscheinen lassen Java Basics - Anfänger-Themen 2
U markierten Text auf Zeichen zuvor/danach pruefen Java Basics - Anfänger-Themen 9
J Dienst zum Text kopieren und Variable hochzählen Java Basics - Anfänger-Themen 7
L Text verschlüsseln Java Basics - Anfänger-Themen 13

Ähnliche Java Themen

Neue Themen


Oben