Einfacher Name und qualifizierter Name

8

Ich lese JLS 8 und in Kapitel 6 geschrieben:

  

Ein qualifizierter Name N.x kann verwendet werden, um auf ein Mitglied eines Pakets oder zu verweisen   Referenztyp, wobei N ein einfacher oder qualifizierter Name und x ein Anführungszeichen ist   Kennung. Wenn N ein Paket benennt, dann ist x ein Mitglied dieses Pakets,   Dies ist entweder ein Klassen- oder Schnittstellentyp oder ein Unterpaket. Wenn N Namen   ein Referenztyp oder eine Variable eines Referenztyps, dann benennt x a   Mitglied dieses Typs, das ist entweder eine Klasse, eine Schnittstelle, ein Feld,   oder eine Methode.

Ich könnte mir vorstellen, dass ich folgendes habe:

%Vor%

j ist ein einfacher Name, während c.n ein qualifizierter Name ist.

Aber in 6.2 wird es kompliziert. Ist dieser Code gegeben:

%Vor%

und danach wird gesagt:

  

Das Auftreten von Länge in args.length ist ein Name, weil args.length   ist ein qualifizierter Name (§ 6.5.6.2) und kein Feldzugriffsausdruck   (§15.11). Ein Feldzugriffsausdruck sowie ein Methodenaufruf   Ausdruck, ein Methodenreferenzausdruck und eine qualifizierte Klasse   Instanzerstellungsausdruck verwendet einen Bezeichner anstelle eines Namens für   Bezeichnen Sie das Mitglied von Interesse. Somit ist das Auftreten von Länge in   args [0] .length () ist kein Name, sondern ein Bezeichner, der in erscheint   ein Methodenaufruf-Ausdruck.

also ich glaube ich verstehe, dass nicht alle Ausdrücke qualifizierte Namen sind und sogar mein Ausdruck c.n

Ehrlich gesagt kann ich die Unterscheidung nicht verstehen, kann mir jemand helfen?

    
xdevel2000 25.11.2016, 13:17
quelle

1 Antwort

5

In Ihrem Beispiel:

int j; ist ein einfacher Ausdrucksname, da er aus einem einzelnen Identifikator besteht

Für ein Beispiel aus der JLS 6.5. 6.2. Qualifizierte Ausdrucksnamen :

  

Wenn ein Ausdrucksname das Format Q.Id hat, wurde Q bereits als Paketname, Typname oder Ausdrucksname klassifiziert.

In c.n , c ist ein Ausdruckname, n ist ein Feld der Klasse T (in Ihrem Beispiel Klasse C). Daher ist c.n ein qualifizierter Ausdruckname.

args.length ist auch ein qualifizierter Ausdruckname. args ist ein Array, also ist es nicht wirklich eine bestimmte Klasse (keine .class-Datei, sondern Laufzeittyp-Signatur wird zwar generiert ), aber es ist immer noch ein Objekt mit einem Feld namens length .

args[0].length() ist kein qualifizierter Name, da length() kein Mitglied der Klasse ist. Es ist ein Bezeichner eines Methodenaufrufausdrucks.

%Vor%

Vgl. Ссылка

    
alain.janinm 25.11.2016 13:47
quelle

Tags und Links