• Hallo liebe Userinnen und User,

    nach bereits längeren Planungen und Vorbereitungen sind wir nun von vBulletin auf Xenforo umgestiegen. Die Umstellung musste leider aufgrund der Serverprobleme der letzten Tage notgedrungen vorverlegt werden. Das neue Forum ist soweit voll funktionsfähig, allerdings sind noch nicht alle der gewohnten Funktionen vorhanden. Nach Möglichkeit werden wir sie in den nächsten Wochen nachrüsten. Dafür sollte es nun einige der Probleme lösen, die wir in den letzten Tagen, Wochen und Monaten hatten. Auch der Server ist nun potenter als bei unserem alten Hoster, wodurch wir nun langfristig den Tank mit Bytes vollgetankt haben.

    Anfangs mag die neue Boardsoftware etwas ungewohnt sein, aber man findet sich recht schnell ein. Wir wissen, dass ihr alle Gewohnheitstiere seid, aber gebt dem neuen Board eine Chance.
    Sollte etwas der neuen oder auch gewohnten Funktionen unklar sein, könnt ihr den "Wo issn da der Button zu"-Thread im Feedback nutzen. Bugs meldet ihr bitte im Bugtracker, es wird sicher welche geben die uns noch nicht aufgefallen sind. Ich werde das dann versuchen, halbwegs im Startbeitrag übersichtlich zu halten, was an Arbeit noch aussteht.

    Neu ist, dass die Boardsoftware deutlich besser für Mobiltelefone und diverse Endgeräte geeignet ist und nun auch im mobilen Style alle Funktionen verfügbar sind. Am Desktop findet ihr oben rechts sowohl den Umschalter zwischen hellem und dunklem Style. Am Handy ist der Hell-/Dunkelschalter am Ende der Seite. Damit sollte zukünftig jeder sein Board so konfigurieren können, wie es ihm am liebsten ist.


    Die restlichen Funktionen sollten eigentlich soweit wie gewohnt funktionieren. Einfach mal ein wenig damit spielen oder bei Unklarheiten im Thread nachfragen. Viel Spaß im ngb 2.0.

[JAVA] Objektorientierung: Zugriff außerhalb der main-Methode

Mr_J

Neu angemeldet

Registriert
14 Juli 2013
Beiträge
991
Du kannst mit Sixherheit auch eine Ausgabemethode in dee main noch definieren, aber für mich macht das keinen Sinn. Aber mal als Beispiel:

[src=java]
public static void printPersonName(Person x)
{
System.out.println(x.getName());
}
[/src]

Das sollte funktionieren. In der main ruft man dann printPersonName(p) nach der Deklaration von p auf.

MfG
Mr. J
 

Mr_J

Neu angemeldet

Registriert
14 Juli 2013
Beiträge
991
Dann ist die Aufgabenstellung Müll. Was da dann gefordert wird ist programmiertechnischer Rotz.

MfG
Mr. J
 

KaPiTN

♪♪♫ wild at heart ♪♫♫♪

Registriert
14 Juli 2013
Beiträge
29.138
Ich unterstelle mal, daß man das in Java auch so lösen könnte:

[src=java]package beispiel;

public class Interface {

Person p;
public static void main(String[] args) {

p = new Person("feuerteufel");

}

private void printname(){
System.out.println(p.getName());
}
}

}
[/src]
 

BurnerR

Bot #0384479

Registriert
20 Juli 2013
Beiträge
5.507
Mr_J:
Wäre ich nicht so schnell mit einer Beurteilung.
Die eigentliche Aufgabenstellung ist unbekannt, ebenso was durch sie vermittelt werden soll.

Bangen um die Klausurzulassung, weil die Bedingungen so hart sind.
Über die Bedingungen weiß ich nichts, aber was du uns fragt sehe ich durchaus auf der Ebene von Klausurzulassung.



Da es diverse Möglichkeiten gibt ist es meiner Meinung nach jetzt an feuerteufel ausführlicher auf die Antworten einzugehen und nochmal Code zu liefern oder die genaue Aufgabenstellung.
 

feuerteufel

gesperrt

Registriert
14 Juli 2013
Beiträge
351
  • Thread Starter Thread Starter
  • #26
Hallo,

tut mir leid dafür, dass ich nicht geantwortet habe, aber ich habe auf eine Antwort von meinem Tutor gewartet.

Also ich zeige euch im folgenden noch ein kommentiertes Beispiel, das sehr nah ist an dem, was ich machen soll.

Geht dabei bitte weg von dem Gedanken eines Personenverzeichnisses.

Folgendes soll realisiert werden:


UI.class

[src=java]package example;

public class UI {
public static void main(String[] args){
Person p = new Person();
p.setname("Name"); // Name wird per scanner eingelesen.
}


public void printall(){
// Hier werden alle getter aufgerufen. funktion ist vorgegeben, es muss so gemacht werden

p.getname();
}
}[/src]


Person.class

[src=java]package example;

public class Person {

private String name;
private int id; // id und con werden auch per getter zurückgegeben
private int con;

public Person(){
this.id = 1;
this.con = 20; // Hier kommen festgelegte Werte rein, die der Benutzer nicht übergeben muss -> Von Programmierer vorgegeben
}

public void setname(String n){
this.name = n;
}

public String getname(){
return this.name;
}

//... weitere getter
}
[/src]


Das kann ja nicht funktionieren, weil p nur in der main existiert.
Deshalb dachte ich mir, dass ich folgendes mache:


[src=java]package example;

public class UI {
static Person p = new Person();
public static void main(String[] args){

p.setname("Name"); // Name wird per scanner eingelesen.
}


public void printall(){
// Hier werden alle getter aufgerufen. funktion ist vorgegeben, es muss so gemacht werden

p.getname();
}
}[/src]

Wie man sehen kann wurde p vor der main deklariert.

Laut Tutor ist das aber falsch, weil ich die Objekte erst dann initialisieren soll, wenn ich sie brauche und nicht davor.

Ich hoffe, dass das jetzt verständlicher ist.

Viele Grüße
feuerteufel
 

Mr_J

Neu angemeldet

Registriert
14 Juli 2013
Beiträge
991
Sollte aber unproblematisch sein. Man kann das Objekt p ja deklarieren ohne es zu initialisieren. Also einfach:

[src=java]
Person p;
[/src]

In der main selbst kann man p dann initialisieren.

[src=java]
p = new Person("feuerteufel");
[/src]

Allerdings halte ich es immer noch für absoluten Schwachsinn weitere Methoden in der main-Klasse zu schreiben...

MfG
Mr. J
 

evillive

EXIL

Registriert
24 Juli 2013
Beiträge
930
jetzt schaust du dir noch die Postings #19 und #24 an und postet deine Lösung


Sollte aber unproblematisch sein. Man kann das Objekt p ja deklarieren ohne es zu initialisieren. Also einfach:In der main selbst kann man p dann initialisieren.


aber nicht direkt in der main() sondern im Konstruktor (das ist der Hacken) der Klasse UI,


Allerdings halte ich es immer noch für absoluten Schwachsinn weitere Methoden in der main-Klasse zu schreiben...

ja aber kennst du die ganze Aufgabe?

Es ist ein Minimalbeispiel. Ich kann mich daran erinnern, dass man anfangs nicht umedingt eine extra Klasse hat in der sich nur die main() befindet. Man schreibt sie dort rein, wo man sein Programm starten will und fertig. Später wenn man mit mehr als 5 Klassen arbeitet oder so, merkt man, dass man die main Funktion suchen muss. Aus diesem Grund legt man, dann eine extra Klasse an. Aber bei zwei, drei Klassen kann man sich diese sparen.

@feuerzeug

dafür steinigt dich dein Prof
[src=java]Person p;[/src]

wieso?
weil private fehlt

dafür steinigt er dich gleich zweimal
[src=java] static Person p = new Person();[/src]
wieso?
weil private fehlt
und weil static davor steht
und vllt noch ein drittes Mal, weil du die Initalisierung nicht im Konstruktor durchführst
und vllt noch einmal weil du keine eindeutigen Variablennamen verwendet hast.
bzw. für den Klassennamen UI und die anderen Bezeichner jeweils noch einmal
 
Zuletzt bearbeitet:

BurnerR

Bot #0384479

Registriert
20 Juli 2013
Beiträge
5.507
Also ich zeige euch im folgenden noch ein kommentiertes Beispiel, das sehr nah ist an dem, was ich machen soll.
Ich kann in deinem letzten Beitrag keine Frage sehen. Lautet die Frage "Könnt ihr mir bitte das machen was ich eigentlich als Hausaufgabe für die Klausurzulassung machen muss?"
Von dem was du bisher geliefert hast würde ich sagen du solltest die Klausurzulassung nicht kriegen.
 

feuerteufel

gesperrt

Registriert
14 Juli 2013
Beiträge
351
  • Thread Starter Thread Starter
  • #30
Sollte aber unproblematisch sein. Man kann das Objekt p ja deklarieren ohne es zu initialisieren.

Ist aber nicht im Sinne von der Objektorientierung, oder?

jetzt schaust du dir noch die Postings #19 und #24 an und postet deine Lösung

Nunja ich bin jetzt auf die Idee gekommen das Objekte/ die Objekte in einer Liste zu speichern und dann per get() aufzurufen.

Dadurch würden dann zum Beispiel die Probleme entfallen, dass Person p static ist, die Initialisierung außerhalb der main() erfolgt usw.

Dachte mir, dass das dann so in etwa aussehen könnte:

[src=java]package example;

import java.util.ArrayList;
import java.util.List;

public class UI {

private static List<Person> personList= new ArrayList<Person>();

public static void main(String[] args){
Person p = new Person();
p.setname("Name"); // Name wird per scanner eingelesen.
personList.add(p);

printall();
}

public static void printall(){
// Hier werden alle getter aufgerufen. funktion ist vorgegeben, es muss so gemacht werden
Person object = personList.get(0);
object.getname();
}
}[/src]

Der Haken ist dann in der Ausgabe. Ich vermute mal, dass dieses object.getname(); nicht so funktioniert wie ich mir gedacht habe.

j
Es ist ein Minimalbeispiel. Ich kann mich daran erinnern, dass man anfangs nicht umedingt eine extra Klasse hat in der sich nur die main() befindet. Man schreibt sie dort rein, wo man sein Programm starten will und fertig. Später wenn man mit mehr als 5 Klassen arbeitet oder so, merkt man, dass man die main Funktion suchen muss. Aus diesem Grund legt man, dann eine extra Klasse an. Aber bei zwei, drei Klassen kann man sich diese sparen.

Ja genau so ist das in diesem Fall. Es sind weitere Methoden vorgegeben. Jedoch hat der Professor selbst gesagt, dass man später so programmiert, dass man nur eine main() in einer Klasse hat und das wars.

Ich kann in deinem letzten Beitrag keine Frage sehen. Lautet die Frage "Könnt ihr mir bitte das machen was ich eigentlich als Hausaufgabe für die Klausurzulassung machen muss?"

Nein. Einen Hinweis geben, weil Learning-by-doing bei mir schon immer gut geklappt hat.
Wenn Du noch etwas sagen möchtest, dass nicht zum Thema beiträgt, dann schreibe mir eine PN. Wir können das dann gerne ausdiskutieren.
 

evillive

EXIL

Registriert
24 Juli 2013
Beiträge
930
hast du dir die Beiträge #19 und #24 angeschaut? da steht alles drin

langsam verwendest du immer mehr static und das ist der falsche Weg

[src=java]public class Prog{
private Person p;

public Prog()
{
p = new Person();
}



// wie heißt die Methode ? printname oder printAll ?
public void printAll (){
System.out.println("Vorname " + p.getVorname() + " Nachname " + p.Nachname());
}

public static void main(String[] args){

Prog prog = new Prog();
prog.printAll ();

}
}[/src]
 
Zuletzt bearbeitet:

feuerteufel

gesperrt

Registriert
14 Juli 2013
Beiträge
351
  • Thread Starter Thread Starter
  • #32
Okay, da oben hat in der Zeile 21 das System.out.print(); gefehlt deshalb der Fehler.

[src=java]package example;

public class UI {

private Person p;

public UI() {
p = new Person();
}

public static void main(String[] args) {
UI p = new UI();
p.printall();
}

public void printall() {
System.out.println(p.getname());
}
}[/src]

Wäre demnach das einzig richtige?

Also lege ich durch public UI() ein Objekt p an, dass seine Gültigkeit auch außerhalb der main() hat. Damit kann ich dann die anderen Mehoden aufrufen.

Es wird aber erst durch
Code:
UI p = new UI();
angelegt. Die Beziehungen lassen sich ja in der Eclipse nachverfolgen.

Man könnte dann doch auch public UI() als private setzen, oder?
 

evillive

EXIL

Registriert
24 Juli 2013
Beiträge
930
Wäre demnach das einzig richtige?

du hast uns nicht alle Unterlagen zur Verfügung gestellt. Da kann man halt nichts garantieren. Heute hast du noch "Scanner" erwähnt. Also könnte es sein, dass du da noch einiges anpassen musst, wenn man mehrere "Personen" einlesen soll

Um was handelt es sich den bei

[src=java] public UI() { ... }

public Person() {.... }[/src]

Man könnte dann doch auch public UI() als private setzen, oder?

ja kann man machen. Was bringt dir das? Du kannst ja mal folgnde Änderung machen:

[src=java]
// aus public -> private
private Person() {.... }[/src]

Was passiert dann?
Der Konstruktor ist nur noch innerhalb der eigenen Klasse sichtbar. Also kannst du außerhalb keine Objekte mehr erzeugen

Axo und positioniere die main() als letztes innerhalb der Klasse. Du solltest halt die Sachen, die Zusammengehören Gruppieren. Also erst alle Instanzvariablen, Konstrutoren, getter, setter und ähnliches und zum Schluss statische Methoden.

und UI p = new UI(); <-- eindeutige oder bessere Bezeichner solltest du auch verwenden.
 
Zuletzt bearbeitet:

accC

gesperrt

Registriert
14 Juli 2013
Beiträge
5.250
Ich nehme alles zurück und verweise aus #32
 
Zuletzt bearbeitet:

Brother John

(schein)heilig
Veteran

Registriert
1 Aug. 2013
Beiträge
235
@accC
Ich bin nun kein Java-Experte, aber du hast doch einen Bug drin. Wo soll denn die statische main() ein this herkriegen?
 
Zuletzt bearbeitet:

evillive

EXIL

Registriert
24 Juli 2013
Beiträge
930
private Person p = null; // Initialisierung sollte man im Konstruktor machen und nicht außerhalb. Sobald man mehr als einen Konstruktor hat...

this.p = new Person(); // in einer statischen Methode kann man nicht auf die Instanzvariablen (hier p) des Objektes (der Klasse UI) zugreifen. Woher soll der den wissen um welches Objekt der Klasse UI es sich gerade handelt?

außerdem ist wohl #32 die richtige Lösung (ausgehend der Infromationen, die hier vorliegen)
 

accC

gesperrt

Registriert
14 Juli 2013
Beiträge
5.250
@Brother John, evillive: In der Tat, daran habe ich gar nicht gedacht.
 

Mr_J

Neu angemeldet

Registriert
14 Juli 2013
Beiträge
991
Allerdings ist die Benennung der Variablen etwas ungeschickt wenn sowohl die Person als auch die UI jeweils p heißen.

MfG
Mr. J
 

feuerteufel

gesperrt

Registriert
14 Juli 2013
Beiträge
351
  • Thread Starter Thread Starter
  • #39
Hi,

ich habe jetzt das was evillive mir an Hinweisen gegeben hat auf meine Aufgabe angewandt und es funktioniert alles wunderbar. :T

Zu den Variablennamen und Klassennamen möchte ich anmerken, dass ich natürlich sinnvollere benutzt habe.

Danke für eure Hilfe und vor allem für eure Geduld mit mir. :)
 
Oben