Wenn Sie anfangen, Java-Programmierung zu lernen, haben Sie ein ziemlich frühes Verständnis von ** Klassen und Instanzen **. Persönlich denke ich, dass die Hürden für Anfänger etwas hoch sind. Oft in Nachschlagewerken und Online-Artikeln
Eine Klasse ist ein Designdokument und eine Instanz ist eine Entität, die basierend auf dem Designdokument erstellt wurde.
Ich sehe oft solche Dinge, aber ich habe das Gefühl, dass nur Leute mit Programmiererfahrung oder Sinn dies verstehen können. Zu Beginn des Java-Lernens konnte ich eine solche konzeptionelle Erklärung nicht verstehen.
Dieser Artikel richtet sich an Personen, die mit ** Klassen und Instanzen ** nicht sehr vertraut sind, genau wie ich es war, als ich anfing, Java zu lernen (dieser Artikel verwendet Java 8). Bitte beachten Sie, dass die Zahlen nur Bilder sind und nicht genau ausgedrückt werden können.
Sie können eine Instanz erstellen, indem Sie eine neue Version aus der Klasse erstellen. Java erstellt grundsätzlich eine Instanz und führt den Prozess aus. Folgendes ist üblich, aber ich schreibe ein Programm, das eine Instanz aus einer menschlichen Klasse erstellt.
class Human {
String name;
int age;
Human(String name, int age) {
this.name = name;
this.age = age;
}
void greet() {
System.out.printf("Freut mich, dich kennenzulernen,%s.\n", this.name);
}
}
public static void main(String[] args) {
Human humanA = new Human("Kaneda", 16);
Human humanB = new Human("Insel", 15);
}
Erstellen Sie eine Instanz mit einem Namen und Alter aus der Human-Klasse, die einen Menschen darstellt, und erstellen Sie zwei Instanzen. Ich habe versucht, das herauszufinden.
Erstellen Sie eine Instanz aus der Klasse und erweitern Sie sie in den Speicher. Weisen Sie dann der Variablen den Referenzwert (Adresse im Speicher) dieser Instanz zu. Führen Sie nun die Begrüßungsmethode der beiden oben generierten Instanzen aus.
public static void main(String[] args) {
Human humanA = new Human("Kaneda", 16);
Human humanB = new Human("Insel", 15);
humanA.greet(); //Schön dich kennenzulernen, mein Name ist Kaneda.
humanB.greet(); //Schön dich kennenzulernen, das ist eine Insel.
}
Da der Name für jede Instanz unterschiedlich ist, ist auch das Ausgabeergebnis unterschiedlich.
Das Erstellen und Betreiben jeder Entität aus einer Klasse ist das Grundverhalten eines Programms in Java.
statisch bedeutet wörtlich statisch. Es wird ein wenig verwirrend, wenn es herauskommt, aber stellen Sie sicher, dass Sie es verstehen, da das Programmieren ohne Verständnis zu lächerlichen Fehlern führen kann. Variablen und Methoden mit dem statischen Modifikator werden auch als Klassenvariablen bzw. Klassenmethoden bezeichnet. Fügen wir jedes zur vorherigen menschlichen Klasse hinzu.
class Human {
static final String classification = "Säugetier-"; // <-Klassenvariable
String name;
int age;
Human(String name, int age) {
this.name = name;
this.age = age;
}
static final boolean isMammal() { // <-Klassenmethode
return true;
}
void greet() {
System.out.printf("Freut mich, dich kennenzulernen,%s.\n", this.name);
}
}
Klassifizierung, was Klassifizierung als statische Variable bedeutet, und isMammal, das Säugetiere als statische Methode bestätigt, wurden zu menschlichen Klassen hinzugefügt. Der letzte Modifikator ist ein Modifikator, der ihn nicht wiederbeschreibbar macht. Wenn es sich um eine Variable handelt, kann sie nicht geändert werden, und wenn es sich um eine Methode handelt, kann sie nicht überschrieben werden. Greifen wir jetzt auf das hinzugefügte Mitglied zu.
public static void main(String[] args) {
Human humanA = new Human("Kaneda", 16);
Human humanB = new Human("Insel", 15);
System.out.println(humanA.classification); //Säugetier-
System.out.println(humanB.isMammal()); // true
}
Mitglieder mit dem statischen Modifikator sind die Eigenschaft der Klasse. Sie greifen also über eine Instanz auf die Klasse zu. Ich habe auch ein Diagramm davon gemacht.
Übrigens, wenn Sie den obigen Code in Eclipse schreiben, erhalten Sie eine Warnmeldung mit der Aufschrift "... erfordert statischen Zugriff". Dies liegt daran, dass Java eine implizite Regel hat, nach der Klassenmitglieder direkt auf die Klasse zugreifen sollen. Dies liegt daran, dass es schwierig ist, über die Instanz festzustellen, ob es sich um die Eigenschaft der Klasse oder um die Eigenschaft der Instanz handelt. In diesem Fall ist es richtig, wie folgt direkt auf die Klasse zuzugreifen.
System.out.println(Human.classification); //Säugetier-
System.out.println(Human.isMammal()); // true
Das heißt, der statische Modifikator muss instanzunabhängigen Mitgliedern zugewiesen werden. Aus objektorientierter Sicht ist die "Säugetier" -Klassifikation des Menschen eine Definition, die sich nicht zwischen Instanzen unterscheidet, unabhängig davon, welche Instanz sie produzieren. Ich habe final hinzugefügt, weil davon ausgegangen wird, dass sich die Definition (dass Menschen "Säugetiere" sind) in Zukunft nicht ändern wird.
Ich sagte, wenn Sie statisch falsch verwenden, wird es zu Fehlern führen, aber ich werde tatsächlich die falsche Verwendung von statisch schreiben. Fügen wir eine statische growOld-Methode hinzu, die das Alter der oben genannten menschlichen Klasse erhöht. Überlegen Sie, was es für Menschen bedeutet, älter zu werden.
class Human {
static final String classification = "Säugetier-";
String name;
int age;
Human(String name, int age) {
this.name = name;
this.age = age;
}
static void growOld(){
age++; // <-Kompilierungsfehler
}
/*Unterlassung*/
}
Bei der hinzugefügten growOld-Methode wird ein Kompilierungsfehler mit der Meldung "Nicht statisches Feldalter kann nicht statisch referenziert werden" angezeigt.
Es ist ein nicht statisches Feld, dh ein Instanzfeld, auf das über Klassenmethoden nicht zugegriffen werden kann. In diesem Fall werden Sie feststellen, dass es ein Fehler ist, die alte growOld-Methode statisch zu definieren. Aufgrund übergeordneter Klassen oder Frameworks können Sie möglicherweise keine statische Methode aus der Methode entfernen. Nehmen wir in einem solchen Fall an, dass das Design für den Zugriff auf das Feld in erster Linie seltsam ist. Sehr selten gibt es Idioten, die Variablen (in diesem Fall Alter, Alter) statisch machen, aber ** Variablen nicht statisch machen **. Es ist nicht möglich, dass alle Menschen zur gleichen Zeit zur gleichen Zeit altern. Denken Sie beim Definieren statischer Elemente noch einmal auf der Entwurfsebene nach.
Zusätzlich zu Variablen und Methoden gibt es innere Klassen, die Mitglieder sind, denen statisch zugewiesen werden kann. Ich werde in diesem Artikel nicht auf innere Klassen eingehen, aber beachten Sie, dass sie eine etwas andere Bedeutung haben als Variablen und Methoden.
Mit Java können Sie von anderen Klassen erben und auf Mitglieder der geerbten Klasse zugreifen. Die geerbte Klasse wird auch als übergeordnete Klasse oder Oberklasse der geerbten Klasse bezeichnet. Als Nächstes möchte ich eine Instanz aus einer Klasse erstellen, die von einer anderen Klasse erbt. Im Folgenden werden eine japanische und eine amerikanische Klasse neu definiert, die die oben genannte menschliche Klasse erben, und die Begrüßungsmethode für jede Instanz ausgeführt.
class Japanese extends Human {
Japanese(String name, int age) {
super(name, age);
}
@Override
void greet() {
super.greet();
System.out.println("Ich bin Japaner.");
}
}
class American extends Human {
American(String name, int age) {
super(name, age);
}
@Override
void greet() {
super.greet();
System.out.println("Ich bin Amerikaner.");
}
}
public static void main(String[] args) {
Japanese japanese = new Japanese("Kumi", 15);
American american = new American("Emily", 15);
japanese.greet();
//Schön dich kennenzulernen, das ist Kumi.
//Ich bin Japaner.
american.greet();
//Schön dich kennenzulernen, mein Name ist Emily.
//Ich bin Amerikaner.
}
Die untergeordnete Klasse erbt die Mitglieder der übergeordneten Klasse so wie sie sind. Mit anderen Worten, die untergeordnete Instanz kann die Mitglieder der übergeordneten Klasse so verwenden, wie sie sind. Daher ist es möglich, in der Begrüßungsmethode des Kindes auf die Begrüßungsmethode des Elternteils zuzugreifen.
Übrigens erben sowohl Japaner als auch Amerikaner Menschen, sodass sich Instanzen wie Menschen verhalten können. Das Folgende ist eine Liste von Menschen, und sie werden der Reihe nach begrüßt.
List<Human> humans = new ArrayList<>();
humans.add(new Japanese("Kumi", 15));
humans.add(new Japanese("Ken", 15));
humans.add(new American("Emily", 15));
humans.add(new American("Billy", 15));
humans.forEach(h -> h.greet());
//Schön dich kennenzulernen, das ist Kumi.
//Ich bin Japaner.
//Schön dich kennenzulernen, mein Name ist Ken.
//Ich bin Japaner.
//Schön dich kennenzulernen, mein Name ist Emily.
//Ich bin Amerikaner.
//Schön dich kennenzulernen, mein Name ist Billy.
//Ich bin Amerikaner.
Worauf ich hier achten möchte, ist der Inhalt der Begrüßung. Ich grüße als Mensch, aber Japaner und Amerikaner begrüßen jede Kinderklasse. Das Überschreiben der Methode der übergeordneten Klasse mit der Methode der untergeordneten Klasse auf diese Weise wird als Überschreiben bezeichnet.
Übrigens ist "Yamato Tamashii" in den folgenden Fällen ein japanisches Mitglied und kann nicht mit humanoiden Variablen aufgerufen werden. Selbst wenn es sich um eine japanische Instanz handelt, können japanische Mitglieder sie nur verwenden, wenn sie sich als Japaner verhalten.
class Japanese extends Human {
String japaneseSoul = "Yamato Seele"; // <-Japanische Seele
Japanese(String name, int age) {
super(name, age);
}
@Override
void greet() {
super.greet();
System.out.println("Ich bin Japaner.");
}
}
Japanese japanese = new Japanese("Kumi", 15);
Human human = new Japanese("Ken", 15);
System.out.println(japanese.japaneseSoul); //Yamato Seele
System.out.println(human.japaneseSoul); // <-Kompilierungsfehler
(Es tut mir leid, dass ich mir kein gutes Beispiel dafür vorstellen kann, was Japaner haben.)
Java wird häufig als Einführungssprache für die Programmierung verwendet und wird von vielen Systemen verwendet. Wenn Sie jedoch die Beziehung zwischen Klassen und Instanzen nicht verstehen, können Sie die Java-Programmierung nicht korrekt ausführen und objektorientierte Dinge nicht verstehen. Ich hoffe, dass dies zum Verständnis derer führt, die in Schwierigkeiten sind.
Recommended Posts