In der Abbildung verstandene Java-Klassen und -Instanzen

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.

Beispiel

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.

WS000001.JPG

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.

WS000002.JPG

Das Erstellen und Betreiben jeder Entität aus einer Klasse ist das Grundverhalten eines Programms in Java.

statischer Modifikator

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.

WS000003.JPG

Ü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.

Wenn Sie einen Fehler bei der Verwendung machen ...

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.

WS000001.JPG

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.

Erbe

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. WS000000.JPG

überschreiben

Ü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.

WS000000.JPG

Ü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.)

Schließlich

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

In der Abbildung verstandene Java-Klassen und -Instanzen
Java (Klasse und Instanz)
Unterschiede zwischen Klassen und Instanzen in Ruby
[java8] Um die Stream-API zu verstehen
Wie verwende ich Klassen in Java?
Klassen und Instanzen Java für Anfänger
[Für Anfänger] Erläuterung von Klassen, Instanzen und Statik in Java
[Java] Verschiedene Zusammenfassungen an die Leiter von Klassen und Mitgliedern
Java-Programmierung (Klassen und Instanzen, Hauptmethoden)
So erhalten Sie das Datum mit Java
Von Java nach C und von C nach Java in Android Studio
Geben Sie die Reihenfolge an, in der die Konfigurationsdateien und Klassen in Java geladen werden
Die Geschichte, zu vergessen, eine Datei in Java zu schließen und zu scheitern
Verstehen Sie den Unterschied zwischen int und Integer und BigInteger in Java und float und double
So erstellen Sie Ihre eigene Anmerkung in Java und erhalten den Wert
[Java] Verstehe den Unterschied zwischen List und Set
In Bezug auf transiente Modifikatoren und Serialisierung in Java
Über die Idee anonymer Klassen in Java
Unterschiede beim Schreiben von Java-, C # - und Javascript-Klassen
[Java] Verstehe in 10 Minuten! Assoziatives Array und HashMap
[Ruby] Klassen und Instanzen
Über Klassen und Instanzen
Ruby-Klassen und -Instanzen
[Java] So lassen Sie den privaten Konstruktor in Lombok weg
Schreiben Sie ABNF in Java und geben Sie die E-Mail-Adresse weiter
Quelle zum Abrufen der Umleitungsquell-URL in Java
So konvertieren Sie A in a und a in A mit logischem Produkt und Summe in Java
Ich habe versucht, die Methode der gegenseitigen Teilung von Eugrid in Java zu implementieren
[Java] So erhalten Sie den Schlüssel und den Wert, die in Map gespeichert sind, durch iterative Verarbeitung
Über Klassen und Instanzen (Evolution)
Überlegungen zu Klassen und Instanzen
Über Java Abstract Class
Java-Thread locker zu verstehen
Informationen zu Ruby-Klassen und -Instanzen
Erstellen von Ruby-Klassen und -Instanzen
Java abstrakte Methoden und Klassen
Eingabe in die Java-Konsole
So erhalten Sie den Namen einer Klasse / Methode, die in Java ausgeführt wird
Ich habe das Verhalten von Java Scanner und .nextLine () nicht wirklich verstanden.
JSON in Java und Jackson Teil 1 Gibt JSON vom Server zurück
Verstehen Sie den groben Fluss von der Anforderung zur Antwort in SpringWebMVC
So trennen Sie Wörter in Namen in Klassen, Methoden und Variablen
[Java] Ändern Sie Sprache und Gebietsschema mit JVM-Optionen in Englisch
Ich habe versucht, die Grundlagen von Kotlin und Java zusammenzufassen
Unterschied zwischen Java und JavaScript (wie man den Durchschnitt findet)
Siehe C ++ im Android Studio-Modul (Java / Kotlin)
Befehl zum Überprüfen der Anzahl und des Status von Java-Threads
[Android, Java] Praktische Methode zur Berechnung der Differenz in Tagen
Verstehen Sie das Singleton-Muster, indem Sie Java- und JavaScript-Code vergleichen
Was ist in "Java 8 bis Java 11" passiert und wie wird eine Umgebung erstellt?
Erstellen Sie eine Methode, um den Steuersatz in Java zurückzugeben
Aufrufen und Verwenden der API in Java (Spring Boot)
Korrigieren Sie den Zeichencode in Java und lesen Sie von der URL
Gründe, Servlet und JSP in der Java-Entwicklung getrennt zu verwenden
Erstellen Sie mit Java Ihren eigenen einfachen Server und verstehen Sie HTTP
Hat zu Gradle beigetragen und wurde im Release Note genannt
Denken Sie über die Unterschiede zwischen Funktionen und Methoden nach (in Java)
So entwickeln und registrieren Sie eine Sota-App in Java