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?
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.
Vgl. Ссылка
Tags und Links java