# [Java] Warum kein Zugriff??? *ausrast*



## Ahab (9. Dezember 2009)

ABEND!  

Ich sitz hier grad und will coden, verrecke aber bereits im Ansatz... 

Der Code:

*abstract class Member {

    private String name;

    String getName(String name) {return this.name;}

    void setName() {this.name = name;}

    abstract void printInfos();

    }

class Student extends Member {

    void printInfos() {System.out.println(name);}

    }* 

Das Problem: Der Compiler sagt, printInfos(); (in der Student class) habe keinen Zugriff auf (private String) name. Aber ich habe der Klasse Student doch die entsprechenden Getter und Setter vererbt?! Demnach müssten die doch auch in der extend-Klasse greifen!?! 

Bitte, möge ein Coder-Crack sich meiner annehmen!


----------



## n0stradamus (9. Dezember 2009)

Hi,

ich kenn mich mit Java jetzt gar nicht aus, aber Klassen gibts auch in C++

private Member werden auch nicht vererbt, deswegen würde ich dir einfach mal empfehlen
deine printInfos()-Funktion als friend zu deklarieren. Dann verlierst du die Datenkapselung nicht und print verändert ja auch nichts.

Falls ich jetzt totalen Müll verzapft habe - tschuldigung, ich kenn mich nur mit C++ aus

Aber dito


----------



## Ahab (9. Dezember 2009)

Okaaay? friend sagt mir gar nichts, ist in Java vielleicht nicht vorhanden. Wüsste auch nicht wie ich die als friend deklariere.


----------



## n0stradamus (9. Dezember 2009)

in c++ läuft das wie mit private und public.
Probiers doch mal aus 

EDIT: ja dazusagen sollte man noch, dass es in deinem Fall so aussieht:

friend* void printInfos()

*Kommt in die Klammer noch ein erwartetes Argument rein ?


----------



## Ahab (9. Dezember 2009)

Es gibt keine Notation namens "friend" in Java. Und wenn du das mal googlest, findest du nen Haufen Beiträge von Leuten die ein entsprechendes friend-Äquivalent in Java *suchen*


----------



## n0stradamus (9. Dezember 2009)

ok, tschuldigung 

Zweiter Versuch (vllt klappts ja^^)
schreib dir doch einfach ne simple Funktion, die String als Rückgabewert hat und übergib das der Printfunktion.
Wenn das nicht simmt, such ich mir nen c++ thread^^


----------



## Ahab (9. Dezember 2009)

Die ist schon vorhanden.  Mittels extend Notation vererbe ich der Klasse Student alle Deklarationen aus der Klasse Member. Demnach müsste ja diese getter Methode auch in Student greifen. 

Und btw, diese Gettermethode hatte ich bereits in der class Student, hat aber natürlich nichts gebracht.  

Viel Spaß im C++ Thread.


----------



## rabit (9. Dezember 2009)

Ahab warum fragst Du nicht Leute im C++ Forum da rennen genug C++ gestörte oder Java Forum mit Java gestörten.
SRY ich kann net helfen ich bin SPS gestört Mschinenprogrammierung.


----------



## Ahab (9. Dezember 2009)

Danke, darauf wär ich auch selbst gekommen...  Hätt ja sein können, dass hier Leute sind, die sich damit auskennen. Ich kenne mich mittlerweile recht gut aus, aber es scheint ja dann doch noch nicht zu reichen. 


rabit schrieb:


> SRY ich kann net helfen ich bin SPS gestört Mschinenprogrammierung.



Ja. Ich geh demnächst auch ins Wakü-Forum und post bei nem Beratungswunsch: "Ey sorry, ich kenn mich nur mit Luftkühlung aus!"


----------



## rabit (9. Dezember 2009)

Hey komm nicht dass ich noch schlecht heute Nacht träume..
Nee im ernst ich bin in einem SPS Forum und die sind echt gut die Jungs
Wollte dir nur ein Tip geben.
Hast ja schon mal hier und da deine Proggi fragen


----------



## Ahab (9. Dezember 2009)

Ja is scho recht.  Ich werds auch demnächst mal in die Tat umsetzen. Wir haben zwar beim Studium ein eigenes Forum für unseren Jahrgang wo wir uns austauschen können, und da wir bei uns auch einige Coder-Asse haben, gibts da auch gute Hilfsansätze. Nur ist die Aktivität ungleich geringer als in einem Forum wie dem der PCGH.


----------



## rabit (9. Dezember 2009)

Ich habe da mal deine Frage in den SPS Forum gesetzt ma schauen watt die sagen....


----------



## DarkMo (10. Dezember 2009)

ähm, was versuchst du da? ^^ ok, ich weis was du versuchst, aber es is argh verwurschtelt ^^

also ich versuchs mal aufzutrullern:
du hast ne klasse mit ner privaten variablen. die kann nur die klasse selber mittels eigener methoden verändern, von aussen kann man nicht drauf zugreifen (soll ja sicher auch sinn der übung sein). nun baust du eben jene beiden methoden, eine set und eine get methode. dollerweise bekommt die setmethode nix zum setzen übergeben, die get methode, die einfach nur den wert returned, bekommt dafür einen wert übergeben, der nie benutzt wird ^^

dritter fehler (der auch deinen zugriffs error auslöst): du schreibst ne get methode und greifst dann doch wieder mit dreckigen wurstgriffeln gleich hinter die theke ^^ klar das du daeine auf die finger bekommst  frag doch einfach den herrn hinter der theke, wenn du ihn schon hinstellst ><

oder nochmal auf deutsch: nich object.variable sondern object.getVariable() nutzen.

edit: ahja, ich hab jetz nochmal geschaut wegen abstract. von ner abstrakten klasse kann man keine objekte erzeugen. eine abstrakte methode hat nur eine deklaration, aber keine implementation (kein rumpf { bla tu was; }). hat ne klasse ne abstrakte methode, muss die klasse selber abstrakt sein - soweit klar und auch alles richtig bei dir. um die klasse nutzen zu können, braucht man eine subklasse die von ihr erbt - wie bei dir - in der die abstrackten methoden überschrieben werden (überhaupt erstmal implementiert eben dadurch).

so, wieso du aber nun keinen zugriff drauf hast, obwohl deine subklasse den ganzen kladeradatsch erbt steht hier: http://www.virtualuniversity.ch/software/java/129.html -> "Elemente des Typs privat sind lediglich in der Klasse selbst sichtbar. Für abgeleitete Klassen und für Aufrufer von Objekten der Klasse (Instanzen) bleiben private- Variablen und -Methoden verdeckt."

sprich: dein bsp dort soll wohl folgendes verdeutlichen: mal blöde gesagt hast du in der root-klasse ne private variable, ne set methode und 2 get methoden (die die direkt get heisst und vollständig vorhanden ist und die abstrakt deklarierte). in der sub-klasse hast du keinen zugriff auf die private variable der root-klasse, obwohl du erbst. mit der ebenfalls in der root-klasse implementierten get methode müsstest du darauf zugreifen können, mit der erst in der sub-klasse (durch überschreibung) deklarierten get methode (die halt printInfo heisst ^^) hast du dieses recht allerdings nicht. wenn du in der print-get methode die ursprüngliche get-methode aufrufst, dürftest du zugriff erlangen und es sollte rennen.

also das was ich vorhin ausm bauch heraus empfunden habe nochmal bissl besser erklärt (so das auch ich es versteh ><). wenn ich dennoch käse laber, sagt bescheid


----------



## Ahab (10. Dezember 2009)

DarkMo schrieb:


> dritter fehler (der auch deinen zugriffs error auslöst): du schreibst ne get methode und greifst dann doch wieder mit dreckigen wurstgriffeln gleich hinter die theke ^^ klar das du daeine auf die finger bekommst  frag doch einfach den herrn hinter der theke, wenn du ihn schon hinstellst ><



 richtig geil   Aber da haste dich ja nochma aus der Affaire gezogen. 

Nunja. Das leuchtet ja ein. Dass die private Variablen in anderen Klassen nicht sichtbar sind, ist klar. Nur MUSS ich diese ja von außerhalb ändern können. Das habe ich ja bereits erfolgreich erprobt, nämlich mit diesen get- und set-Methoden und der Notation this.variable.

Ich habe nen Kommilitonen gefragt, der meinte, um auf private Variablen zugreifen zu können muss die Klasse in der sie steht *public* sein. 

Erniedrigenderweise habe ich auch das probiert, der Erfolg blieb aus...

EDIT: *HEUREKA* es funktioniert doch!  Ich hatte nur einen kleinen Fehler drin.

EDIT²: nee läuft doch nich... hatte nix im Methodenkopf von printInfos(); stehen....


----------



## bingo88 (10. Dezember 2009)

Ahab schrieb:


> Ich habe nen Kommilitonen gefragt, der meinte, um auf private Variablen zugreifen zu können muss die Klasse in der sie steht *public* sein.
> 
> EDIT²: nee läuft doch nich... hatte nix im Methodenkopf von printInfos(); stehen....



Wenn du die Klasse public machst ändert das nix an der Zugriffsebene der Variable. Wenn die private ist, ist die private!

Wenn du aus abgeleiteten Klassen zugriff haben willst, könntest du das so machen:

*public abstract class Member {

        protected String name;

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

    public void setName() {this.name = name;}

    public abstract void printInfos();

    }

public class Student extends Member {

    public void printInfos() {
        System.out.println(name);
    }

    }* 

Bei protected ist allerdings zu beachten, dass damit auch alle Klassen aus dem selben Package Zugriff auf die Variable erhalten. Wenn das unerwünscht ist (es dürfen z. B. nur bestimmte Werte angenommen werden), musst du die Variable wieder private machen und die Prüfung im Setter einbauen. Wenn du keine Zugriffsmodifizierer angibst, so ist das Teil für sämtliche Klassen im gleichen Package sichtbar. Normalerweise gibt man daher den Scope mit an.


----------



## rabit (10. Dezember 2009)

Aähm ich habs mal in C++ realisiert ich hoffe ist richtig so?!

#include "stdafx.h"
#include <iostream>
using namespace std;

class Member
{
public:
char *Name;
Member(char *m_name) { Name = m_name;};
char* GetName() { return Name;};
virtual void printInfos() {cerr << "Error. Name not available for base type." << endl; };
};

class Student : public Member
{
public:
Student(char* c) : Member(c) {}
void printInfos() { cout << "Name des Studenten: " << GetName(); };
};


int _tmain(int argc, _TCHAR* argv[])
{
Student student("Holger");
student.printInfos();
return 0;
}


----------



## DarkMo (10. Dezember 2009)

um den selben effekt zu erzielen, müsstest member.name aber private machen ^^ und der abstrakte charackter fehlt ja auch *hmm*


----------



## bingo88 (11. Dezember 2009)

DarkMo schrieb:


> um den selben effekt zu erzielen, müsstest member.name aber private machen ^^ und der abstrakte charackter fehlt ja auch *hmm*


Jupp.
Müsste virtual void printInfos() = 0; sein. Ist aber für Java eh uninteressant, da es ja die entsprechenden Schlüsselwörter gibt ("abstract").


----------



## Ahab (11. Dezember 2009)

Hat sich alles zum Guten gewendet. 

Es lag an der Formulierung im Methodenkopf von System.out.println(); in der Klasse Student. 

Da musste einfach ein direkter Aufruf an den getter von name rein, also:

*printInfos(); { System.out.println(this.getName()); }*

Aber vielen Dank für die Hilfe! 

Schön dass sich doch einige hier für solche Sachen begeistern lassen!


----------



## Akkuschrauber (15. Dezember 2009)

Sag mal, was nutzt du eigentlich als IDE?? Ich würde dir mal Eclipse ans Herz legen, das markiert dir solche Fehler...


----------



## UnnerveD (16. Dezember 2009)

Sehr gut zum Programmieren, Lernen und Verstehen von Programmiersprachen finde ich persönlich die open books von Galileo Computing, in deinem Fall dieses.

mfG


----------



## k-b (20. Dezember 2009)

Ahab schrieb:


> Schön dass sich doch einige hier für solche Sachen begeistern lassen!


Einer hat dir sogar die Lösung in Java gepostet und du hast sie übersehen


----------

