Transkripte
1. Einführung: Hallo zusammen. Willkommen
zu meinem Kurs über Java. Wenn Sie nun auf diesen Kurs klicken, haben
Sie wahrscheinlich zumindest
eine vage Vorstellung davon, was Java ist, und das ist irgendwie wichtig Ihre Karriere und
Ihre Ausbildung Nun, du irrst dich nicht.
Lassen Sie mich Ihnen zeigen Java eine der beliebtesten
Programmiersprachen ist , die von so ziemlich jedem
einzelnen Technologieunternehmen
verwendet wird. Auf von so ziemlich jedem
einzelnen Technologieunternehmen
verwendet Karriereseite so
ziemlich jedes
Technologieunternehmens
wird Java als
eine der Fähigkeiten aufgeführt. Zu wissen, wie man programmiert
, ist die Fähigkeit, die
Sie auf die Überholspur für
ein sehr großzügiges Gehalt bringt . Der Grund dafür ist, dass Java
leistungsstark, reich an Funktionen
und im Vergleich zu
einigen anderen Sprachen
wie C relativ einfach zu
erlernen ist und im Vergleich zu
einigen anderen Sprachen
wie C relativ einfach zu
erlernen . Das bedeutet
auch, dass Sie mit dem
Programmieren beginnen können, ohne einen einwöchigen Kurs absolvieren zu Programmieren beginnen können, ohne einen einwöchigen Kurs absolvieren Die Grundlagen von Java lassen sich in nur wenigen Stunden zusammenfassen, und genau
das habe ich in diesem
Kurs gemacht Sie werden die Lektionen
in diesem Kurs nutzen, um
Ihr eigenes interaktives
Spiel zu erstellen , das Sie
dann mit Ihren Freunden teilen
oder in Ihren Lebenslauf aufnehmen können dann mit Ihren Freunden teilen
oder in Ihren Lebenslauf aufnehmen Eine Sache, nach der Personalvermittler
Ausschau halten, sind persönliche,
überprüfbare Projekte, und dieses ist dafür ganz gut
geeignet Sie können wählen, ob Sie
das gesamte Projekt
selbst durchführen möchten, wenn Sie eine Herausforderung eingehen
möchten Alternativ habe
ich auch
vier Walk-Through-Videos beigefügt . Ich helfe dir für den
Fall, dass du dich verirrst. Ich habe auch
alle Codebeispiele in
einer Online-Sandbox-Umgebung eingerichtet .
Nun, was bedeutet das? Das bedeutet, dass keine komplexen Computer
benötigt werden. Keine obskuren Anweisungen zur Einrichtung. Sie müssen
lediglich die von
mir bereitgestellten Links aufrufen und auf
die grüne Schaltfläche Ausführen klicken Sie können Ihre gesamte
Energie darauf verwenden, sich auf
die eigentliche Codierung zu konzentrieren , anstatt Zeit mit der Einrichtung
einer Codierungsumgebung zu
verschwenden Ich hoffe, Sie freuen sich darauf
, mehr über Java zu erfahren. Ich verbringe viel Zeit damit,
diesen Kurs zusammenzustellen , und
ich hoffe, dass er sich bemerkbar macht. Wir sehen uns im nächsten Video.
2. Über dich und mich: Hallo da. In diesem Video werden
wir kurz über
die Zielgruppe
für diesen Kurs
sprechen und darüber, warum Sie diesen Kurs aus
allen verfügbaren Kursen
, die Sie wahrscheinlich sehen,
auswählen sollten allen verfügbaren Kursen
, die . Also zuerst, warum
sollten Sie mir vertrauen? Du kennst mich nicht einmal gut. Ich arbeite für eines der
größten Technologieunternehmen
der Welt, das
derzeit in Cupertino, Kalifornien, ansässig
ist Cupertino, Kalifornien, Ich darf nicht wirklich sagen
, für wen ich arbeite. Aber es genügt
, diesen Werbecode zu erwähnen ,
der
die Benutzererfahrung
von Millionen von
Menschen beeinflusst hat der
die Benutzererfahrung
von Millionen von ,
vielleicht sogar Ihre Ich habe viel Erfahrung darin, Code zu
schreiben, der wichtig ist. Bevor ich in
der Technologiebranche gearbeitet
habe, habe ich vier Jahre lang Informatik
im
Grundstudium an der University of California in
Berkeley unterrichtet im
Grundstudium an der University of California vier Jahre lang Informatik
im
Grundstudium an der University of California in
Berkeley Der Kurs C 61, den ich unterrichtet habe wurde von Bloomberg zu einem der fünf
besten Studiengänge in
den Vereinigten Staaten
gekürt . In jedem Semester nahmen regelmäßig mehr als 2000
Studierende Ich habe für
diesen Kurs auch
Videoanleitungen auf YouTube auf dem Kanal
CS 61, einer Abteilung, aufgenommen diesen Kurs auch
Videoanleitungen auf YouTube auf dem Kanal
CS 61, einer Abteilung, Bis August 2023 wurde
dieser Kanal
mehr als 963.000 Mal angesehen Schließlich wurde
ich 2020 zu den 13 besten Dozenten
der Fakultät für
Ingenieurwissenschaften
der Universität gekürt 13 besten Dozenten
der Fakultät für
Ingenieurwissenschaften
der Universität Von mehreren
hundert habe ich viel Erfahrung im Unterrichten und
Verwalten großer Klassen, insbesondere
solcher
mit einer bedeutenden Online-Komponente wie dieser. Warum sollte er sich nun
für diesen Kurs entscheiden? Nun, ich habe
in einem früheren Video darauf hingewiesen,
aber ein wesentlicher
Vorteil dieses Kurses ist,
dass der gesamte Code
öffentlich und ausführbar ist Nun, Sie verstehen vielleicht nicht was das bedeutet oder
warum es wichtig ist, und das ist völlig Im Grunde besteht ein Problem
, das in
Programmierkursen häufig auftritt ,
darin, dass
Sie, selbst wenn Sie den Code des Dozenten
exakt so nehmen , wie er ist,
und
ihn auf Ihrem Computer möglicherweise nicht
die gleiche Ausgabe erhalten oder der Code möglicherweise
nicht einmal ausgeführt wird. Der Grund dafür ist, dass Computer sehr komplexe Maschinen
sind. Oft ist Ihr Computer
möglicherweise nicht
genau so konfiguriert wie der
Computer des Kursleiters. In diesem Kurs
wurde der gesamte Code, einschließlich des Projektcodes, in eine
Online-Umgebung verschoben . Die gesamte Programmierung
wurde für Sie
abstrahiert und
erledigt, sodass
Sie sich voll und ganz
auf das
Programmieren konzentrieren können , anstatt Ihren Computer
einzurichten Wenn Sie diesen Kurs
interaktiv verfolgen möchten, empfehle
ich Ihnen, ein Konto bei Repl einzurichten Ich werde einen Link in
der Kursbeschreibung
sowie in den Ressourcen einfügen sowie Als Nächstes möchte ich kurz über
die Zielgruppe
des Diskurses
sprechen . Lassen Sie sich
von dieser Aussage jetzt nicht beunruhigen. Auch wenn Sie keine
Erfahrung im Programmieren haben, sollten
Sie dennoch viel aus diesem Kurs herausholen können Davon abgesehen, wenn Sie wirklich alle Ihre Grundlagen abdecken und
sicherstellen
möchten , dass Sie die gesamte
Java-Syntax von Grund auf verstehen , empfehle
ich Ihnen, sich meinen anderen Kurs
Java for Beginners
Code in 1 Stunde
anzusehen . diesem Kurs werden Ihnen einige wichtige Details
zum
Programmieren
beigebracht Details
zum
Programmieren
beigebracht Sie müssen jedoch nicht
alles aus diesem Kurs wissen, um die Dinge
in diesem Kurs zu verstehen Ich empfehle Ihnen,
sich ein paar Videos aus
diesem Kurs anzusehen und zu prüfen, ob Sie die Bedeutung
dessen, was ich sage,
verstehen. Wenn sich herausstellt, dass Sie
nichts verstehen, empfehle
ich Ihnen, eine Pause einzulegen. Schauen Sie sich ein paar Videos
von dem Kurs an, den ich
zuvor gedreht habe, und kehren Sie zu diesem
Kurs zurück, wenn Sie bereit sind. Und das war's für dieses Video. Wenn du mich das nächste Mal siehst, werden wir uns mit
echten Inhalten befassen.
3. Einführung von Projekten: Willkommen Freunde. In diesem
Video werden wir über das Projekt sprechen
, das Sie in diesem Kurs umsetzen
werden. Das Projekt, das wir implementieren
werden, heißt Minesweeper es gerne
bei Google nachschlagen, da es
ein ziemlich beliebtes Spiel ist und
nicht nur für diese Klasse gilt Auch wenn du mit dem Spiel bereits
vertraut bist, würde
ich dir trotzdem empfehlen,
dir dieses Video anzusehen, damit du unsere
spezifische Implementierung verstehst. Der Code in dem
Projekt, das du
erhalten wirst , wurde
teilweise fertiggestellt, aber es fehlen einige
wichtige Teile. Ihr Ziel wird es sein,
diese kritischen
Komponenten zu reparieren , damit das Spiel so funktioniert, wie es in diesem Video
funktioniert. Wir werden
diese Komponenten zu einem
späteren Zeitpunkt im Kurs
gemeinsam durchgehen späteren Zeitpunkt im Kurs , damit ihr euch nicht verirrt. Am Ende des Projekts
solltest du in der Lage sein, das Spiel
interaktiv zu spielen und deine Freunde
und Familie ebenfalls
dazu einzuladen und Familie ebenfalls
dazu Lassen Sie uns nun sehen, wie
dieses Spiel funktioniert. Lass uns weitermachen und auf
Run our game of Mind klicken. Sweeper beginnt mit einer zehn mal
zehn großen Tafel mit ungenutzten Zellen. All diese mit X markierten Zellen sind Zellen, die noch
nicht enthüllt wurden Diese Felder mit den Buchstaben A bis J an den
Rändern der Tafel helfen Ihnen bei
der Identifizierung der Koordinaten einer Zelle Unsere Koordinaten werden die Form Zeile Spalte
haben. Zum Beispiel
wird diese
Zelle hier Koordinaten haben,
weil sie sich in A befindet .
In Spalte B
sind alle Zellen entweder Zahlenzellen,
leere Zellen oder Minenzellen, aber ihr Status wird
derzeit durch das X verdeckt. Wenn Sie auf ein Feld tippen, das
eine Minenzelle ist , verlieren Sie das Spiel. Das Ziel des Spiels ist es, alle Zellen
zu finden, die nicht zu meinen gehören. Mal sehen, was passiert
, wenn wir auf eine Zelle tippen. Wir können auf B tippen, okay? Es stellte sich heraus,
dass B eine leere Zelle ist, was wir sehen können, weil sie,
nun ja, leer ist. Eine leere Zelle ist eine Zelle, an
die sich unmittelbar keine
Minen anschließen. Das bedeutet, dass Zelle A, Zelle B, A-Zelle AC, Zelle BC und Zelle BB nicht alle Minen waren. Das bedeutet, dass
sie alle sicher angezapft werden konnten. Beachten Sie, dass nach dem
Aufnehmen von Zelle B auch
eine Reihe anderer Zellen zum Vorschein kamen All das hier,
all diese leeren Zellen sowie diese
Zahlenzellen genau hier. Wir tun das, weil,
wie ich gerade sagte, eine leere Zelle bedeutet, dass alle Zellen, die an diese
leere Zelle angrenzen, sicher angezapft werden können. Wir tippen sie einfach an, damit
Sie Zeit sparen. Wenn wir
neben der ursprünglichen leeren Zelle, die wir geklebt haben, eine
weitere
leere Zelle finden , tippen
wir zusätzlich auf alle sicheren Zellen um diese Zelle herum Und wir setzen
diesen Vorgang fort, bis uns die sicheren Zellen zum Tippen ausgehen Schauen wir uns zum Beispiel
diese Zelle an. Es stellte sich heraus, dass es sich bei dieser Zelle
um eine Zahlenzelle handelt. Die Zahl zwei bedeutet
, dass sich genau zwei Minenzellen
unmittelbar daneben befinden. Das bedeutet, dass diese Zellen alle potenziell Minenzellen
sind. Diese Zelle ist
möglicherweise auch eine Minenzelle. Wie finden wir heraus
, welche sicher ist oder nicht? Das ist der Kern
des Minensucher-Spiels. Wir müssen
Informationen aus
anderen Zellen kombinieren , um
Informationen für diese Zelle abzuleiten So können wir ableiten,
welche Zelle eine Minenzelle ist. Schauen wir uns
diese Zelle hier an. hat sich auch
herausgestellt, dass es sich bei dieser Zelle um eine Eins handelt, aber da die Zellen um sie
herum bereits als leere Zellen entlarvt
wurden, hat sich herausgestellt , dass es sich
um eine Zahlenzelle
handelt, und es hat sich herausgestellt, dass es sich
um eine Zahlenzelle handelt. Es ist nur noch eine Zelle übrig
, die an diese angrenzt. Daher muss diese unentdeckte
Zelle die Minenzelle sein. Da wir nicht auf eine Mine tippen
wollen, werden
wir die Zelle als
gefährliche Zelle kennzeichnen , damit
wir wissen, dass wir sie nicht anzapfen sollen Wir können sehen, dass dieses
X genau hier in
Zeile und Spalte H steht .
Wir können Flagge F, H verwenden. Dieses Dreiecksymbol zeigt
uns an, dass die Zelle markiert
ist und wir wissen, dass wir
nicht darauf tippen Nun, da wir wissen, dass
diese Zelle eine Minenzelle ist, wissen
wir, dass diese Zelle sicher sein
wird. Warum? Pausiere das Video und ich
werde die Antwort in 321 veröffentlichen. Der Grund dafür ist, dass diese
Zahlenzelle hier eine Eins ist. Wir haben bereits gefolgert, dass es eine gefährliche Zelle handelt, weil die
Nummer eins hier drüben ist Da wir also bereits
die eine Zelle
neben dieser Zahlenzelle gefunden
haben die eine Zelle , die eine Mine ist, wissen
wir, dass jede
zweite Zelle um
diese Nummer eins herum sicher
angezapft werden kann Lassen Sie uns weitermachen und unsere Hypothese
testen. Gehen wir weiter und tippen auf I. Tatsächlich haben wir
festgestellt, dass ich eine Ziffernzelle war, also drei,
die gefahrlos
angetippt werden konnte. Obwohl es in diesem Gebiet noch viele
Minen gibt, in den allermeisten Fällen in der Lage sein, werdet ihr
in den allermeisten Fällen in der Lage sein,
diesen Prozess der Rückschlüsse für
das gesamte Board fortzusetzen und schließlich herauszufinden, wo sich all
die Minen befinden Wenn Sie glauben, dass Sie einen Fehler gemacht haben, können
Sie
die Markierung der Zelle auch auf diese Weise aufheben. Jetzt wurde H zu
Demonstrationszwecken auf
ein unsichtbares Feld zurückgesetzt Demonstrationszwecken auf
ein unsichtbares Feld Mal sehen, was passiert, wenn
du auf diese Minenzelle tippst. Diese Sternchen
stehen für Geister in unserem Brett und wir können sehen, dass das
Spiel jetzt vorbei ist Lass uns das Spiel neu starten, indem wir
auf die Schaltfläche Ausführen klicken. Jetzt werde ich
das nächste Board sehr schnell durchgehen das nächste Board sehr schnell damit ihr das Endergebnis sehen könnt. dieses Video gerne sehr langsamer Geschwindigkeit ansehen, wenn Sie es verfolgen
und
herausfinden
möchten können sich dieses Video gerne mit
sehr langsamer Geschwindigkeit ansehen, wenn Sie es verfolgen
und
herausfinden
möchten, warum ich mich
entschieden habe , bestimmte Zellen zu markieren oder
anzutippen. Schließlich können wir sehen, dass wir alle Zellen
angezapft haben , die nicht meine Wir haben das Spiel insgesamt gewonnen. Jedes Spiel sollte zehn Minenzellen
haben. Okay, und das
war's für dieses Video. Ich hoffe, das macht dich
neugierig auf das Projekt. Ich habe viel Zeit damit verbracht,
dies für Sie zusammenzustellen und ich hoffe, Sie haben dadurch
viel über Java gelernt. Wir sehen uns im nächsten Video.
4. Illustration der Erbschaft: Willkommen Freunde. In diesem Video werden
wir
über Erbschaft sprechen. Um diese Lektion
etwas weniger trocken zu gestalten, werden
wir
über Eiscreme sprechen. Das ist Eiscreme. Stellen Sie sich nun vor, Sie
haben einen Freund, der
noch nie von Eiscreme gehört hat , und bitten Sie, es ihm zu beschreiben. Jede Eiscremeeinheit weist eine
Reihe gemeinsamer Merkmale auf. Vorerst vereinfachen wir es
und es sollte ziemlich
sicher sein zu sagen, dass jede
Eiscreme-Einheit Sahne enthält. Eine Temperatur von etwa 0 Grad Celsius und ein Kegel, in dem die Sahne aufbewahrt wird. Stellen Sie sich nun vor, Sie hätten
Ihrem imaginären Freund die
Beschreibung von Eiscreme beendet Ihrem imaginären Freund die
Beschreibung von Eiscreme Aber jetzt ist er neugierig auf
verschiedene Eissorten wie Erdbeereis
und Blaubeereis Sie würden es wahrscheinlich genauso beschreiben wie das ursprüngliche
Eis hier. Diese neuen Aromen haben auch einen Kegel und eine Temperatur
von etwa 0 Grad Celsius. Der einzige Unterschied besteht darin, dass das Erdbeereis Sahne mit
Erdbeergeschmack und das Blaubeereis Sahne mit Blaubeergeschmack
enthält Das ist alles in Ordnung und gut für dieses spezielle Beispiel. Wenn wir nur drei Attribute haben,
um Eiscreme zu beschreiben, schadet
es nicht,
uns für jedes zu wiederholen, aber Sie können sich vorstellen
, dass wir vielleicht noch mehr Merkmale
hinzufügen möchten , um dieses Eis zu
beschreiben Vielleicht möchten wir auch
ein Geschmacksattribut
oder eine Kegeltextur hinzufügen . Oder vielleicht das Gewicht
der Eiscreme oder das Volumen der Eiscreme. Sie können Eiscreme unendlich
genauer beschreiben. Und jedes Mal, wenn dein Freund
dich bittet , ein neues
aromatisiertes Eis zu beschreiben, müsstest
du jedes
einzelne dieser Merkmale
immer
wieder neu definieren einzelne dieser Merkmale
immer Es wäre wirklich schön, wenn wir eine Möglichkeit
hätten,
den
Arbeitsaufwand für die Beschreibung
neuer Eissorten zu reduzieren Beschreibung
neuer Eissorten zu Hier
kommt Vererbung ganz natürlich ins Spiel. Irgendwann würden
Sie es leid sein, dieselben
Eigenschaften für Eiscreme zu
beschreiben. Anstatt zu wiederholen, dass
Eiscreme einen Kegel hat und eine Temperatur von 0 Grad Celsius hat, sagst
du deinem Freund, nun ja, Blaubeereis ist
wie normales Eis, außer dass die Sahne
einen anderen Geschmack hat, alles andere ist Vererbung ist ein Paradigma in Java, das uns dies ermöglicht Vererbung bedeutet, dass
Verhaltensweisen und Attribute
eines Basismodells in
ein neueres, aktualisiertes Modell kopiert werden zu überschreiben diesem Fall haben wir immer noch die
Möglichkeit,
ausgewählte Attribute wie den
Sahnegeschmack Das ist jetzt ziemlich beeindruckend Anstatt
uns zu wiederholen und
jedes einzelne Eiscreme-Attribut neu jedes einzelne Eiscreme-Attribut definieren,
wenn wir eine neue
Eissorte definieren, müssen wir nur ein Attribut,
das Sahne-Atribut,
überschreiben das Sahne-Atribut und den Rest der gemeinsamen Attribute aus
dem Basismodell für Eiscreme übernehmen , wie die Temperatur
und den Das klingt wirklich einfach, ist
aber ein sehr wichtiger
Grundsatz der Es ist so wertvoll, sich wiederholenden Code zu reduzieren, um es noch einmal zusammenzufassen. Durch Vererbung maximieren
wir den Code, verwenden ihn wieder und vereinfachen ihn zeige ich Ihnen einige konkrete
Beispiele dafür nächsten Video zeige ich Ihnen einige konkrete
Beispiele dafür, wie das
im Code
aussieht.
5. Beispiele für Vererbung: Hallo Freunde. In diesem Video werden
wir
einige konkrete Beispiele für
Vererbung besprechen . Stellen Sie sich zunächst vor, dass wir
eine Klasse namens dog haben eine Klasse namens dog und sagen, dass sie ein
statisches Feld namens
sound und eine Get-Methode namens
get Sound hat , die
den Sound abruft , falls Sie die Syntax
vergessen haben oder
mit ihr nicht vertraut Ich empfehle Ihnen,
das Video jetzt anzuhalten und sich das Video mit dem Titel Objects
part Two in meiner anderen Klasse, Stunde
das Video mit dem Titel Objects
part Two in meiner anderen Klasse,
Java, für Anfänger Jetzt haben wir noch eine weitere
Klasse namens Brown Dog, die die Hundeklasse erweitert. Diese Erweiterung der Syntax ist neu. So spezifizieren wir
Vererbungsmuster in Java. In diesem Fall würden wir sagen, dass der braune Hund vom Hund erbt Machen Sie sich vorerst keine Sorgen über die
Auswirkungen. Erkenne einfach Dysntex. Nehmen wir an, der braune Hund hat eine Methode namens Get Color, die einfach
das Wort braun zurückgibt Lassen Sie uns das alles zusammenfügen. Wir haben den Hundekurs
von früher und wir haben den Kurs für braune Hunde, der Hunde in unserer Hauptklasse
erweitert. Lassen Sie uns eine Instanz
der Hundeklasse und eine Instanz
der Brown-Dog-Klasse erstellen . Wenn wir also dog
get sound und brown
dog getcolor ausdrucken , ist
die Ausgabe ziemlich
vorhersehbar. Hunde bekommen Sound Wir drucken nur Bark
und Brown Dog Getcolor aus, wir drucken Brown Word aus Magie passiert, wenn
wir Brown Doggetund machen. Basierend auf dem, was wir
bisher über Java-Programmierung wissen, sieht es
so aus, als
würde es scheitern, oder? Da es in der Brown-Dog-Klasse keine Methode zum
Abrufen von Sounds gibt, scheint
das eine
vernünftige Vermutung zu sein. Es stellt sich heraus, dass,
wenn Sie das ausführen, diese letzte Anweisung
tatsächlich die Rinde ausdruckt. Der Grund dafür ist, dass wir
Vererbung haben , wenn eine
Klasse eine andere erweitert Java schaut zuerst in
der erweiterten Klasse nach,
ob dort eine Methode oder ein Feld
definiert ist, wenn dies nicht der Fall ist. Java überprüft dann
seine übergeordnete Klasse. In diesem Fall suchen wir zuerst Brown Dog nach der
Get-Sound-Methode. es diese Methode nicht gibt, überprüfen
wir, ob die
Elternklasse dog dog die Methode get sound
hat. Benutze die Methode
, die Bell zurückgibt. Ich möchte
hier betonen, dass Java
die spezifischste
Methode verwendet, die es zuerst findet. Denken Sie daran, dass Java
zuerst in Brown Dog nach Sound
sucht ,
bevor es in Dog sucht. Das heißt, wenn Brown Dog
eine Get-Sound-Methode hätte , die etwas anderes als die
Dogs-Get-Sound-Methode
zurückgibt die
Dogs-Get-Sound-Methode und wir Brown
Dog Dog Get Sound nennen. Java hätte stattdessen
die in Brown Dog
definierte Methode get sound verwendet . Das war ein Schluck.
Wenn Sie mit 1,5- oder zweifacher Geschwindigkeit schauen
und das nicht verstanden haben, empfehle
ich Ihnen, 30 Sekunden zurückzuspulen und sich den Satz noch einmal
anzuhören Bei einer Geschwindigkeit von X ist
damit unsere Diskussion
über Vererbung beendet Um es noch einmal zusammenzufassen: Wir verwenden das Schlüsselwort
extends, um Java
mitzuteilen, dass wir eine
Vererbungsbeziehung
erstellen möchten eine
Vererbungsbeziehung
erstellen Sobald die Vererbungsbeziehung eingerichtet
ist, verwendet
Java die dynamische
Methodenauflösung um herauszufinden, welche
Methode verwendet werden soll Es sucht zuerst in
der eigentlichen Klasse aus
wir die Methode aufrufen. Und nur wenn die Methode fehlt sucht Java in
der übergeordneten Klasse. Hier ist der Link zum
Abstoßcode, Sie
anhand dieser Lektion herumbasteln Wir sehen uns im nächsten Video.
6. Super-Beispiele: Willkommen Freunde. In
diesem Video werden wir über Super Recall
aus der vorherigen
Lektion sprechen , als wir einen Hundekurs mit der Methode
Get-Sound hatten. Wir hatten auch einen
Kurs zum Thema „Brauner Hund“, der
von der Methode „Brown Dog hatte
Farbe bekommen“ übernommen . Als wir Brown
Dog Get Sound nannten, verwendete
Brown Dog Re die Methode „Sound bekommen“ von
Dog durch Erbschaft. Erinnern Sie sich auch an die Reihenfolge, in der Java Methodennamen auflöst Wenn wir Brown anrufen würden, erhalte ich einen Ton. Java würde zuerst in
der Brown Dog-Klasse
nach Sound suchen . Java würde nur
in der Hundeklasse suchen, wenn Brown Dog keinen Sound bekommen
hätte. Wenn für Brown Dog
eine Get-Sound-Methode definiert wäre und wir
Brown Dog Get Sound aufrufen würden, würde
Brown Dogs Get Sound die
Get-Sound-Methode der Dog-Klasse
überschreiben. Das heißt, wir würden die Logik
ausführen, die in Brown
Dog statt in Dog
enthalten ist. Wir können Methoden
der übergeordneten Klasse entweder
wiederverwenden, verwenden oder überschreiben. Aber was ist, wenn wir die Logik
der Elternklasse überschreiben
und wiederverwenden wollen ? Mal sehen, wie es funktioniert. Nehmen wir zuerst an, wir haben wieder
unseren Hundeunterricht, lernen die Sound-Methode
kennen, die das Bellen zurückgibt. Nehmen wir nun an, wir haben unsere
Brown-Dog-Klasse, die von Dog
erbt und auch eine
Get-Sound-Methode hat Diese Methode hat ein neues Schlüsselwort , das wir noch nie gesehen Super. Super ist die Art und Weise, wie wir auf die
Elternklasse der aktuellen Klasse verweisen. In diesem Fall ist Super wirklich
ein Alias für die Hundeklasse. Das bedeutet, dass Super
Do Get Sound Sprichwort „
Hund kriegt Sound“
entspricht Das bedeutet, dass das
Geräusch von Super Get das Bellen zurückgibt. Das Ergebnis dieser ganzen Methode mit dem
braunen Dottetsund wird eine rindenbraune Rinde sein Das ist so ziemlich alles.
Wir haben von unserem neuen Schlüsselwort super erfahren, das verwendet wird,
um auf eine übergeordnete Klasse zu verweisen wenn wir Code
innerhalb der untergeordneten Klasse schreiben. Dieses Schlüsselwort ermöglicht es uns auch, hybride Override-Methoden zu erstellen. Das heißt, wir können Code aus der übergeordneten Klasse erneut
verwenden und auch unsere
eigene benutzerdefinierte Logik hinzufügen. Hier ist der Link
zum Abstoßcode
in dieser Lektion, an dem
Sie herumbasteln Wir sehen uns im nächsten Video.
7. Subtyp-Polymorphismus: In diesem Video werden wir über
Subtyp-Polymorphismus sprechen Bevor wir loslegen, lassen
Sie sich bitte nicht von diesen sehr
ausgefallen klingenden Worten einschüchtern Das Konzept ist
eigentlich nicht viel
komplizierter als
alles, was wir bisher gesehen haben, aber die Entwickler von Java konnten sich keinen einfacheren Namen
einfallen lassen Lassen Sie uns
unsere Illustration noch einmal mit
einer Hundeklasse beginnen , die über
eine Get-Sound-Methode verfügt , die Bellen zurückgibt. Wir werden auch eine
Klasse für braune Hunde haben, die vom Hund erbt, und diese Methode für braune Hunde
gibt braune Rinde zurück Wenn wir das alles zusammennehmen, haben
wir unsere beiden Klassen. Wir haben eine dritte
Get-Sound-Methode in unserer Hauptklasse. Diese dritte Methode verwendet
eine Hund-Instanz und
ruft einfach die Methode Dogs
Get Sound auf. Wenn wir eine Instanz
der Base-Dog-Klasse instanziieren und diese Basis-Dog-Klasse dann erwartungsgemäß an diese Methode
übergeben , würden wir Bell als Ausgabe erhalten Aber nehmen wir jetzt an, wir instanziieren eine Brown-Dog-Instanz und übergeben dieses Objekt an
diese Get-Sound-Methode Das ist seltsam. Die Methode get sound
hier unten rechts akzeptiert nur
Argumente vom Typ Hund, aber der Objekttyp, den wir
übergeben, ist Brown Dog. Basierend auf dem, was wir über Java wissen, scheint
das ein Fehler zu
sein, oder? Es stellt sich heraus, dass dies kein Fehler
sein wird. Diese Zeile
druckt tatsächlich braune Rinde aus. Das liegt an der in
Java so genannten dynamischen Methode Resolution ist ein Beispiel
für Subtyp-Polymorphismus Subtyp-Polymorphismus
bedeutet im Grunde, dass ein Subtyp eines Elterntyps als Elterntyp behandelt werden kann Intuitiv sollte das Sinn machen. Ein brauner Hund sollte alle
Eigenschaften eines Hundes haben. Ein brauner Chihuahua sollte alle Eigenschaften
eines braunen Hundes
haben Eine spezifischere Sache
sollte zumindest
alle Verhaltensweisen und
Merkmale einer weniger
spezifischen verwandten Sache aufweisen alle Verhaltensweisen und Merkmale einer weniger Nun zurück zu diesem Beispiel.
Der Grund, warum wir
dieser Methode, die Hundetypen
akzeptiert,
einen braunen Hund übergeben können dieser Methode, die Hundetypen
akzeptiert,
einen braunen Hund , ist,
dass Java von bestimmten
Hundetypen ausgeht alle Methoden
der Basisklasse Hund
aufrufen kann , wenn das
Programm tatsächlich ausgeführt wird. Java löst dann Instanzmethoden unter Verwendung des
dynamischen Typs eines Objekts auf. Also der Typ, dass ein
Objekt tatsächlich
ein brauner Hund ist und nicht
der statische Typ, wir es
in dieser Methode Hund deklarieren. Ich sage das noch einmal, weil es ein ziemlich wichtiges Konzept ist. Der statische Typ
eines Objekts ist der, als den
wir
das Objekt explizit deklarieren. Bei dieser Methode ist es ein brauner Hund. Bei dieser Methode ändert sich der statische
Typ zu Hund. Der dynamische Typ
eines Objekts ist das, was das Objekt tatsächlich ist,
und er ändert sich nie. In diesem Fall ist der dynamische
Typ Brown Dog. Um eine Instanzmethode aufzulösen, verwenden
wir den dynamischen
Typ des Objekts. Sie fragen sich vielleicht,
warum wir das überhaupt tun. Warum um alles in der Welt sollten wir uns
verwirren? Warum nennen wir es nicht einfach
einen braunen Hund, wenn wir instanziieren, und es einfach für immer als braunen Hund behalten Der Grund, warum wir diese Methode
vielleicht erneut für
viele Arten von Hunden
verwenden möchten diese Methode
vielleicht erneut für
viele Arten von Hunden
verwenden Stellen Sie sich vor, dass
wir zusätzlich
zum Kurs für braune Hunde auch Klassen für weiße Hunde, blaue Hunde
und gelbe Hunde hatten , die
alle vom Hund erben und alle über fundierte Methoden verfügen Es wäre wirklich
nervig, wenn wir eine Methode
definieren müssten , die ein Objekt vom Typ Brauner Hund aufnimmt, und eine
andere Methode, die
ein Objekt vom Typ weißer Hund und gelber Hund und blauer Hund Wenn all diese Methoden genau dasselbe
tun, anstatt uns zu wiederholen, erstellen
wir nur eine Methode, die den Typ
des Basismodells Hund
akzeptiert. Durch einen
allgemeineren Eingabetyp können
wir die
Wiederverwendung von Code maximieren und haben nur eine Methode, die sich um all die spezielleren Fälle kümmert . Das war's für dieses Video. Um es noch einmal zusammenzufassen: Wir haben über
Subtyp-Polymorphismus gesprochen. Es ist ein Java-Paradigma
, das es uns ermöglicht,
bestimmte Instanzen eines Objekts
als weniger spezifisches Basisobjekt zu behandeln bestimmte Instanzen eines Objekts
als weniger spezifisches Basisobjekt als Wir haben auch über statische und dynamische
Typen gesprochen, die die Art und Weise bestimmen, wie wir
Instanzmethoden auflösen Wenn wir uns auf
eine Instanzmethode beziehen, verwenden
wir die Methode,
die im dynamischen Typ eines Objekts definiert ist,
anstelle des statischen Typs Hier ist der Link
zum Abstoßcode
in dieser Lektion, an dem
Sie herumbasteln Wir sehen uns im nächsten Video.
8. Abstrakte Illustration: Willkommen Freunde. In diesem Video geben wir
einen visuellen Überblick über
abstrakte Klassen. In dieser Abbildung kehren wir eigentlich zu
unseren Eiscreme-Beispielen aus
der Lektion zur Vererbung
zurück unseren Eiscreme-Beispielen aus . Denken Sie daran, dass wir einen
Eiscreme-Kurs haben und dass wir auch Erdbeereis und Kurse für
Erdbeereis und
Blaubeereis anbieten
, die von Eiscreme abstammen Wenn Sie sich jetzt fragen, wie
sehen diese drei Klassen im wirklichen Sie können
sich wahrscheinlich eine Vorstellung davon machen wie Erdbeer- und
Blaubeereis aussieht Mehr oder weniger sehen sie
ungefähr so aus. Diese Kurse
spiegeln die Realität wider und basieren auf
konkreten Beispielen Aber was ist mit dem
Eiscreme-Kurs? Wie sieht nicht aromatisiertes
Eis aus? Sie denken vielleicht
an Vanilleeis, aber auch Vanille ist eine Geschmacksrichtung Vanilleeis wäre auch eine Unterklasse, die
von der Eisklasse erbt Aber Eiscreme selbst, ohne Geschmack,
gibt es nicht, zumindest nicht in Ihrem
örtlichen Lebensmittelgeschäft In Java würden wir diesen
Eiscreme-Kurs eigentlich abstrakt
modellieren. Eine abstrakte Klasse kann nicht
direkt instanziiert
werden , weil eine Instanz dieses Objekts keinen
Sinn ergibt So wie Eiscreme ohne Geschmack
keinen Sinn macht. Stattdessen können wir nur Unterklassen
einer abstrakten Klasse
instanziieren, wie Erdbeer- oder
Blaubeereis Wir erhöhen erneut die
Komplexität Ihrer Arbeit und Ihres
Wissens Es scheint, als ob wir
nur Ihre Funktionalität einschränken. Und Sie fragen
sich vielleicht, warum. Warum sollten wir
eine abstrakte Klasse erstellen , die nicht einmal instanziiert werden kann Beschränken und verlangsamen wir uns nicht bewusst,
wenn wir uns zwingen,
eine Unterklasse zu erstellen, bevor wir sie für irgendetwas
verwenden? Die Antwort lautet, dass ein Objekt wie
geschmackloses Eis
zwar an sich keine Bedeutung
hat, aber dennoch in zweierlei Hinsicht einen Wert hat Die erste ist, dass
Vererbungsmuster hier immer noch gelten. Genau wie bei der
regulären Vererbung können
wir einen Feldwert für
das Basisobjekt definieren und Unterklassen
für dieses Feld erben lassen Auch wenn es kein geschmackloses
Eis gibt, können
wir die Temperatur trotzdem auf 0
Grad Celsius festlegen und
dafür sorgen, dass alle Unterklassen
diese Temperatur Grad Celsius festlegen und
dafür sorgen, dass alle Unterklassen
diese Das sollte Sinn machen,
da wir keine konkrete Eisklasse benötigen, um die Temperatur zu
bestimmen Wir können einfach sagen, dass
Eiscreme generell 0 Grad Celsius haben sollte und das in der abstrakten
Basisklasse definieren. Zweitens
sind abstrakte Klassen immer noch wertvoll, weil sie einen Vertrag spezifizieren können
, den Unterklassen erfüllen müssen Zum Beispiel können wir deklarieren, dass alle Eissorten
eine Methode definiert werden sollte, die die Farbe
der Eiscreme im
Basismodell für Eiscreme
zurückgibt der Eiscreme im
Basismodell für Eiscreme Diese Methode wird nicht
definiert, da es keine Farbe für
alle Eiscreme-Varianten gibt. Erdbeereis
kann jedoch eine
Methode zum Abrufen der Farbe verwendet werden, die Rosa zurückgibt. Und für das
Blaubeereis kann
eine Methode zum Abrufen von Farben verwendet werden
, die Blau zurückgibt Wenn wir eine zusätzliche
Eiscreme-Klasse hätten, die
keine Get-Color-Implementierung bietet, würde
Java nicht kompilieren können ist gut so,
denn wir
wollen nicht, dass unser Code
kompiliert wird, es sei denn, wir sind uns absolut sicher, dass für alle
konkreten Eiscreme-Instanzen eine Farbe definiert ist. Das mag etwas
verwirrend klingen, aber mach dir keine Sorgen. Ich zeige dir im nächsten Video Beispiele dafür ,
wie
das funktioniert. Das war's für diese Lektion. Wir haben über abstrakte
Klassen gesprochen und darüber, dass sie
fast Objekte sind , da sie nicht
direkt instanziiert werden können, sondern als Vertrag
oder Vorlage für Unterklassen dienen Wir werden bald konkrete
Beispiele dafür sehen. Wir sehen uns im nächsten Video.
9. Abstrakte Beispiele: Hallo Freunde. In diesem
Video werden wir einige Beispiele für
die Verwendung abstrakter Klassen
durchgehen. Und wir werden heute tatsächlich
die Dinge auf den Kopf stellen. Anstatt durch
Folien und Codediagramme zu gehen, werden
wir direkt am
Programmieren arbeiten. Natürlich
empfehle ich Ihnen dringend, in Ihrem Repel It-Konto
mitzumachen, wenn Sie können Wenn nicht,
besuchen Sie unbedingt den Repel-Link. Wenn diese Lektion vorbei ist, forken Sie sie und
basteln Sie am Code Das erste, was wir tun
werden, ist Repl zu besuchen. Es klickt auf die Schaltfläche Create Repel, wählt die Java-Vorlage aus und
benennt Ihre abstrakten
Repel-Klassen Jetzt, wo es erstellt ist, werden wir
als Erstes eine
abstrakte Hundeklasse erstellen Wir werden das tun, indem wir hier auf die Schaltfläche „Neue Datei“ und sie Java nennen. Das erste, was
wir tun werden, ist eine abstrakte Hundeklasse zu
erstellen. Die Klassendeklaration sieht fast wie eine normale
Klassendefinition aus, außer dass wir
den abstrakten Modifikator hinzufügen Der abstrakte Modifikator
bedeutet nur, dass wir
mindestens eine abstrakte
Methode in dieser Klasse haben mindestens eine abstrakte
Methode in dieser Definieren wir zunächst ein Attribut namens taub legs
und setzen es auf vier Beachten Sie, dass dies kein
abstraktes Feld ist. So
etwas gibt es nicht. In Java
können nur Methoden abstrakt sein. Intuitiv
sollte es Sinn machen, warum wir
in einer abstrakten Klasse als Attribut definiert haben Denken Sie daran, dass wir keinen bestimmten Hundetyp
benötigen ,
der uns sagt, wie
viele Beine ein Hund hat Hunde haben im Allgemeinen vier Beine. Es ist sicher, es hier zu definieren. Definieren wir nun eine reguläre, nicht abstrakte
Methode namens Get Sound, die Bark zurückgeben wird. Das wird sich genauso
verhalten wie jede andere nicht abstrakte Methode in einer regulären Klasse.
Keine Überraschungen hier. Lassen Sie uns nun endlich
eine abstrakte Methode definieren. Wir werden es Get
Color nennen und es nicht definieren. Auch das sollte Sinn machen. Es ist sinnvoll, für Hunde generell den Ton
zu definieren ,
weil Hunde in der Regel dasselbe
Geräusch von sich geben. Aber welche Farbe hat ein Hund? kannst du nicht beantworten
, ohne ein konkretes Beispiel von
einem Hund vor dir zu haben. Daher ist es eine
abstrakte Methode. Lassen Sie uns nun eine neue Klasse erstellen, reguläre Klasse, keine
abstrakte Klasse. Und lass sie unsere
abstrakte Hundeklasse erweitern. Wir werden
diesen Kerl einen braunen Hund nennen. Und es wird unseren Hundeunterricht
erweitern. Öffentliche Klasse Brown. Beachten Sie, dass die Syntax für Erweiterung einer abstrakten
Klasse dieselbe
ist wie für die Erweiterung einer
nicht abstrakten Klasse. Hier werden wir
eine konkrete Implementierung
der abstrakten Get Color-Methode bereitstellen eine konkrete Implementierung
der . Die Farbe eines braunen
Hundes sollte braun sein. Wir lassen es einfach braun
zurückgeben. Fügen wir dieser Methode zusätzlich eine Override-Anmerkung
hinzu. Die Annotation at override
ist zu 100% optional, es empfiehlt sich
jedoch, sie
einzubeziehen. Der Grund dafür ist, dass Java
dann bei der Kompilierung prüft ob die Methode, die
Sie annotiert haben tatsächlich
eine Methode
überschreibt Dies wäre beispielsweise
nützlich, wenn
Sie möglicherweise falsch geschrieben die Methode oder die Methode
in der übergeordneten Klasse nicht wirklich existiert Dies ist besonders wichtig, wenn abstrakte
Methoden
überschrieben werden, da abstrakte Methoden
keine Logik in
der abstrakten Klasse definiert Wir möchten absolut
sicher sein, dass wir eine konkrete
Implementierung für die Methode
bereitgestellt haben eine konkrete
Implementierung für die Methode
bereitgestellt Lassen Sie uns nun alles in unserer Hauptklasse
zusammenstellen. Also das Erste, was wir testen werden
, ist,
einen Hund auf diese Weise zu instanziieren . Mal
sehen, was passiert Schau, wir haben einen Fehler. Da steht, dass der Hund abstrakt ist
und nicht instanziiert werden kann. Das ist sinnvoll, da
abstrakte Klassen,
wie wir bereits gesagt haben, nicht direkt instanziiert
werden können Wir können nur ihre Unterklassen instanziieren
. Versuchen wir nun stattdessen,
einen braunen Hund zu instanziieren, der von diesem Zeitpunkt an den Code erbt
, von diesem Zeitpunkt an den Code erbt
, der Auch das sollte keinen
Sinn ergeben. Brown Dog ist eine Unterklasse
einer abstrakten Klasse. Schauen wir uns nun an, was passiert
, wenn wir diese Methoden aufrufen. Lassen Sie uns
diesen Typen zuerst in Brown Dog umbenennen , weil es ein brauner Hund ist. Schauen wir uns zunächst
Brown Dog Dot Taub Legs an. Wenn du dich erinnerst,
sollte Brown
Dog Dot Taub Legs genau dieser Typ
hier in der Hundeklasse sein Da Felder nicht abstrakt sein können, wird sich
Taub Legs
genauso verhalten, wie
Attribute funktionieren, die in regulären
Klassen definiert sind Wenn wir Brown
Dog Dot Taub Legs nennen, schaut
Java zuerst in
der Klasse Brown Dog nach,
ob ein Taubbein-Attribut existiert.
Das tut es nicht Es schaut dann in
der Elternklasse nach, dann schaut es in Dog und es sieht, dass taube Beine existieren Diese erste Zeile sollte vier
ausgeben. Lass es uns testen. In der Tat bekommen wir vier zurück. Lassen Sie uns als Nächstes
einige Methodenaufrufen ausprobieren. Mal sehen, was
passiert, wenn wir
Brown Dog Dot Get Color
und Brown Dog Dot Get aufrufen . Sound Wie erwartet, gibt brauner
Hund bekommt Farbe wieder braun zurück. Das ist die Methode, die in der ursprünglichen Hundeklasse
leer war in der ursprünglichen Hundeklasse
leer ,
aber in Brown Dog, Brown
Dog, Dog get außer Sound war die Methode, die wir
in der Klasse Parent Dog definiert und die Brown Dog nicht explizit
definiert hat . Kurzer Rückblick Brauner Hund hat
Farbe bekommen, Hund hat bekommen. Ton. Wir können sehen, dass reguläre Methoden genauso funktionieren wie früher. Wenn es
in Brown Dog nicht existiert. Wir werden dann die in der Elternklasse
definierte Methode aufrufen. Get Color verhält sich jedoch auch
ähnlich wie normale Klassen. Wir rufen die Methode auf, die in der Unterklasse
definiert ist. Wenn wir in diesem Fall
vergessen hätten, die Methode get color
der abstrakten Klasse zu überschreiben Methode get color
der , die Brown
Dog von Java erbt, wäre ein Fehler aufgetreten Mal sehen, was
passiert, wenn wir das tun würden. Nehmen wir an, wir haben Get
Color falsch geschrieben und auf Run geklickt. Sie sehen jetzt, dass wir einen Fehler haben. Brown Dog ist nicht abstrakt und abstrakte Methode
nicht außer Kraft Get Color in Dog. Dies ist einer der Vorteile der Verwendung abstrakter Klassen. Wir sehen unsere Fehler im Voraus,
bevor wir den Code ausführen. Das war's für dieses Video. Heute haben wir uns abstrakte Klassen angesehen und
wie man sie implementiert, sowie einige der
Fehler, die auftreten können, wenn man
abstrakte Klassen missbraucht. Hier ist der Link
zum Abstoßcode. Ich möchte, dass du
ihn fragst und am Code
herumbastelst ihn fragst und am Code
herumbastelst
10. Minesweeper Walkthrough 1: Willkommen Freunde. In diesem Video
werden wir
den ersten Teil
dieses Projekts anhand
dessen, was wir in
den letzten Lektionen gelernt haben, durchgehen den ersten Teil
dieses Projekts anhand . Wenn Sie interaktiv
mitverfolgen möchten, müssen
Sie
ein Konto erstellen und Ihre E-Mail-Adresse
verifizieren Der Link dafür sollte in der Kursbeschreibung stehen und war im Einführungsvideo
für diesen Wenn Sie kein weiteres Konto
erstellen möchten, ist
das auch völlig in
Ordnung.
Natürlich empfehle ich
Ihnen dringend, ein Konto zu erstellen Das erste, was Sie tun
sollten, nachdem ein Konto erstellt haben, ist Bit Dot Lee,
Minesweeper Skeleton wie so, zu besuchen Minesweeper Skeleton wie so Der Link befindet sich auch in der
Projektbeschreibung. Sobald Sie auf dieser Seite sind, klicken Sie auf den Gabel-Button. Sie sollten zu einer Kopie
des Codes in Ihrem Konto gelangen. Schauen wir uns die
Struktur dieses Projekts an. Habe die Dateien, die Hauptplatinenzelle, leere Zelle, die Gedankenzelle
und die Zahlenzelle. Ein Großteil des Codes in
Maine und Board wurde für Sie
implementiert,
und wir werden
einige fehlende Teile später in den späteren
Walkthroughs beheben In diesem Video werden
wir uns auf die Zellklassen konzentrieren. Wie Sie vielleicht schon
vermutet haben, steht
eine Zellenklasse für eines der Quadrate
im
Minesweeper-Spiel Schauen wir uns das genauer an. Die Zellenklasse ist
eine abstrakte Klasse. Sie deklariert einen Vertrag, dem
andere Klassen folgen sollen, und bietet auch
einige Standardmethoden Jede konkrete Zellenklasse muss eine Methode mit zwei Zeichenketten
implementieren,
d. h. ihre
Zeichenkettendarstellung auf der Platine, und eine Tap-Methode, die definiert, was passiert,
wenn auf die Zelle getippt wird Wir haben auch einige
Flags, die den
Standardwert False haben ,
und wir haben einige Methoden
, die von allen Implementierungen
gemeinsam genutzt werden sollten allen Implementierungen Flag, un markiere taube
Nachbarn
und inkrementiere taub Nachbarn und inkrementiere Ich möchte, dass du
über Folgendes nachdenkst. Warum sind diese Methoden abstrakt und warum
sind es konkrete Methoden? Pausiere das Video und
ich antworte in 321. Nun, wenn ich dich
frage, wie eine Zelle im Allgemeinen aussehen sollte und wie Minensucher, könntest
du das beantworten kannst du nicht. Eine Zelle ist leer. Wenn es eine leere Zelle
ist, enthält sie eine Zahl. Wenn es sich um eine Zahlenzelle handelt und sie ein Sternchen
hat, wenn
es sich um eine Gedankenzelle handelt, benötigen
Sie eine konkrete
Implementierung einer Zelle um zu bestimmen, wie ihre
Zeichenkettendarstellung aussehen soll In ähnlicher Weise hängt das Verhalten beim Tippen auch davon ab, von welcher Art von
Zelle Sie sprechen Wenn du zum Beispiel auf eine
Gedankenzelle tippst, ist das Spiel vorbei. Wenn du jedoch auf ein leeres Feld tippst, helfen
wir dir nur dabei, auf alle
benachbarten sicheren Zellen zu tippen. Wenn ich Sie andererseits frage, ob eine Zelle, unabhängig von ihrem Typ, angetippt
wurde, können Sie diese Frage beantworten?
Ja, das können Sie Unabhängig davon, um welchen
Zelltyp es sich handelt, können
Sie beantworten, ob
eine Zelle angezapft wurde In ähnlicher Weise ist das
Verhalten beim Markieren und Entkennzeichnen einer Zelle
in allen Zellklassen gleich, unabhängig von ihrem Typ Okay, fangen wir an,
diese beiden Kommentare
in der Zellenklasse Erstens stellen wir fest, dass eine Goldbarrenmethode
genutzt wurde Wenn Sie eine Methode haben, die den Status eines Objekts
zurückgibt, ist
das ein Hinweis darauf, dass Sie sich
die Felder des Objekts ansehen
sollten die Felder des In diesem Fall haben wir
getippt und es ist markiert. Was sollte
diese Methode Ihrer Meinung angesichts dieser Informationen
zurückgeben Nun, wir sollten „getapped“ zurückgeben da der Name darauf hindeutet
, dass sie Informationen über
den Zustand der Zellen
speichern wird Informationen über
den Zustand der Zellen
speichern Schauen wir uns als Nächstes die Flagge an. Es kehrt als ungültig zurück. Wir müssen uns keine Gedanken über
einen Rückgabewert machen. Stattdessen deutet diese
void-Methode darauf hin , dass ihr einziger Zweck darin besteht, den Status eines Objekts zu ändern. Angesichts der Tatsache, dass wir
den Zustand des Objekts ändern wollen, welche Variable sollten
wir Ihrer Meinung nach ändern? Nun, wir sollten
das markierte Feld ändern und seinen Wert auf true
setzen In ähnlicher Weise wird die Methode ohne Markierung das Feld ist
markiert auf False setzen Das ist alles, was wir für die
Zellenklasse tun müssen. Gehen wir zur leeren Zelle über. Zuerst sehen wir, dass wir alle abstrakten Methoden
überschreiben müssen. Lassen Sie uns die
abstrakten Methoden kopieren und mit ihrer Implementierung beginnen. Wir sehen hier, dass es
einen Kommentar gibt,
dieses Sonderzeichen
für markierte Zellen zu verwenden dieses Sonderzeichen
für markierte Zellen Beginnen wir mit der
Implementierung dieser Logik. Woran erkennt man, ob
eine Zelle angezapft wurde? Nun, lassen Sie uns einen Blick darauf werfen. Wir haben diese markierte
Variable, die
Informationen über den
Flaggenstatus der Zelle speichert . Lass uns das benutzen Wenn diese Zelle markiert wurde, geben
wir dieses
Sonderzeichen genau hier zurück Andernfalls, wenn diese
Zelle angetippt wurde, geben wir ein leeres Leerzeichen zurück Da es sich um ein leeres Feld handelt, sollte, wenn Sie auf ein leeres Feld tippen
, wenn Sie auf ein leeres Feld tippen
, ein leeres Feld angezeigt Und schließlich, wenn dieses Feld weder markiert noch
angetippt wurde , wie sollte
es aussehen Nun, ich erinnere mich an
unser erstes
Video über dieses Projekt, in dem
wir gesagt haben, dass alle
Zellen mit einem X beginnen, was
einfach nur bedeutet,
dass dieser Zellstatus noch
nicht aufgedeckt wurde Schauen wir uns als Nächstes an, wie der Name schon sagt, was diese
Methode Ihrer Meinung nach bewirken wird. Positives Video, und
ich antworte 321. der obersten Methode wird das angetippte Feld auf
true
gesetzt , sodass wir uns
den Status dieser Zelle merken können Nachdem wir das Flag auf true gesetzt
haben, stellen wir fest, dass diese Methode einen Bullion zurückgeben
muss Nun, es ist eigentlich ziemlich
schwer zu sagen, ob wir wahr oder
falsch zurückgeben
müssen. Ich gebe dir einen Hinweis. Wenn du herausfordern willst, probiere Board Java
aus und sieh dir die Tap-Methode an. Prüfen Sie, ob Sie ableiten können, wie
der beabsichtigte Rückgabewert
der Tap-Methode für Zellklassen bei einem erfolgreichen Tippen aussehen
sollte Und pausiere das Video, wenn du darüber nachdenken
möchtest. Wenn nicht,
sage ich dir einfach die Antwort. Die Antwort lautet 321, wir geben true zurück,
da ein wahrer Rückgabewert da ein wahrer Rückgabewert anzeigt, dass die Zelle sicher
angetippt werden konnte. Was wir aus
Board Dot Java ableiten können. Wir sehen in Board-Java, dass wir,
wenn das Tap-Ergebnis wahr ist, weiterhin nach
benachbarten leeren Zellen suchen, auf die wir
tippen können Mit anderen Worten, ein Tap-Ergebnis von true bedeutet, dass das Tippen auf die Zelle sicher
war. Andernfalls würden wir nicht nach benachbarten
leeren Zellen
suchen , auf die wir tippen könnten. Gehen wir nun zur
Zahlenzelle über und
wiederholen die Übung. Diesmal
wollen wir die abstrakten Methoden außer Kraft setzen und
auch
die Gedanken der Nachbarn betäuben Die Tap-Methode wird so
ziemlich die gleiche sein wie die leere Zelle Es ist
auch sicher, auf eine Zahlenzelle zu tippen. Wir drehen die Wahrheit um und drehen
das Goldbarren vom Wasserhahn auf wahr. Die Methode mit zwei Zeichenketten wird
auch der Zwei-String-Methode
der vorherigen Klassen
sehr ähnlich Zwei-String-Methode
der vorherigen Klassen Ausnahme, dass
wir, wenn sie angezapft wurde, die Anzahl der
Minen zurückgeben sollten , die an
diese Zelle grenzen Praktischerweise stellen wir
fest, dass es hier ein Feld namens „Taube
Nachbarschaften“ gibt. Sie sich nicht zu viele Gedanken
darüber, wie wir
diese Methode verwenden , um
Numb Neighbors zu inkrementieren nur wissen, dass wir das bereits für Sie
implementiert haben Im Grunde
rufen wir diese Methode einfach zum passenden Zeitpunkt auf , wenn wir Minen auf das Brett
pflanzen Numb Neighbor Minds gibt
uns den richtigen Wert. Da wir möchten, dass diese Methode
eine Zeichenfolge,
Numb Neighbor Minds,
als Ganzzahl zurückgibt , müssen
wir diese
Ganzzahl in eine Zeichenfolge konvertieren Aber wie machen wir
das? Nun, lassen Sie uns eine fantastische
Ressource namens Google
verwenden. Lassen Sie uns in Java suchen, wie man eine Ganzzahl in eine Zeichenfolge
konvertiert. Lass uns weitermachen und
auf das erste Ergebnis klicken. Scrollen wir ein wenig und wir sehen sofort
, dass es hier ein Beispiel
gibt , I entspricht zehn Und wir konvertieren diese Zehn mithilfe eines
Zeichenkettenwerts in eine Zeichenfolge. Lassen Sie uns weitermachen und den Stream-Wert
dieser Zahl
verwenden, die unser Nachbar kennt. Auf diese Weise
entspricht dieser Rückgabewert dem Rückgabewert
der Methode mit zwei Zeichenketten. Lassen Sie uns abschließend auch die Gedanken der
tauben Nachbarn außer Kraft setzen, was wir in der vorherigen Klasse nicht tun
mussten Numb Neighbor Minds gibt,
wie der Name schon sagt, die Anzahl der Minen
zurück
, die benachbarte Zellen sind Wir haben ein Feld, das genau das
zurückgibt. Lassen Sie uns weitermachen und die Gedanken der Nachbarn
zurückschicken. Jetzt haben wir
die Zahlenzelle fertiggestellt. Schauen wir uns die letzte Klasse
an, die wir
in diesem Video implementieren. Mind Cell
wird tatsächlich viele
Ähnlichkeiten mit den vorherigen
Zellen haben Ähnlichkeiten mit den vorherigen , die wir gerade implementiert haben. Lassen Sie uns weitermachen und
diese abstrakten Methoden kopieren. Die
Methode „Mind Cells Tap“ wird sich von
den vorherigen Klassen unterscheiden. Wir werden
das angetippte Feld weiterhin auf true setzen, aber anstatt true zurückzugeben, werden
wir false zurückgeben Da wahr bedeutet, dass
es ein sicheres Tippen war, ist
eine Mine keine sichere
Zelle, auf die man tippen kann Die
Methode mit zwei Zeichenketten wird ähnlich aussehen wie andere Klassen, außer dass
wir, wenn sie angetippt wurde, ein Sternchen zurückgeben sollten weil das ihre
Darstellung auf der Platine ist Eigentlich ist das alles, was
wir jetzt tun müssen. Wir sind mit all
unseren Zellklassen fertig. Wir werden erst
am Ende all dieser Durchgänge
überprüfen können, ob wir
es richtig gemacht haben erst
am Ende all dieser Durchgänge
überprüfen können, ob wir
es richtig am Ende all dieser Durchgänge Als Herausforderung empfehle
ich Ihnen
, den
Originalcode erneut zu
forken und zu prüfen, ob Sie alle zu erledigenden Aufgaben im Skelett
ohne meine Hilfe
wirklich verstanden Sie alle zu erledigenden haben Skelett
ohne meine Hilfe Andernfalls sehen wir
uns im nächsten Video.
11. Schnittstellen: Willkommen Freunde. In diesem Video werden
wir
über Schnittstellen sprechen. Aber warte, wir haben noch nicht
einmal über
Schnittstellen gesprochen .
Was sind sie? Schnittstellen sind
Klassen, die
einen Vertrag spezifizieren und nicht direkt
instanziiert werden können Jetzt weiß ich, was du denkst. Klingt das nicht genau der Definition, die wir
für abstrakte Klassen gegeben haben? Du hättest tatsächlich recht. Schnittstellen sind
abstrakten Klassen sehr ähnlich und ihre grundlegende
Funktionalität ist dieselbe. Jetzt fragst du
dich wahrscheinlich, warum. Warum haben wir solche Entitäten in Java, die so ziemlich dasselbe
tun? Es ist fast so, als ob die
Java-Sprachdesigner versuchen würden, uns auszutricksen. Nun, es stellt sich heraus, dass
es einige Unterschiede zwischen abstrakten Klassen und Schnittstellen gibt. Lass uns sie durchgehen. Der größte Unterschied besteht darin, dass abstrakte Klassen nur Einzelvererbung
unterstützen, während Schnittstellen
mehrere Implementierungen unterstützen In Java kann eine Klasse höchstens von
einer Klasse
erben, die
abstrakte Klassen enthält Ein brauner Hund kann vom Hund erben, aber wir könnten nicht zulassen, dass ein
brauner Hund
von etwas anderem erbt,
wie zum brauner Hund
von etwas anderem erbt, Beispiel einem braunen
Tier Schnittstellen
umgehen dieses Problem. Schnittstellen werden nicht
wie Klassen vererbt. Stattdessen werden sie implementiert und eine Klasse kann
mehrere Schnittstellen implementieren. In unserem Beispiel mit einem braunen Hund könnten
wir Brown
Dog eine Schnittstelle für Hunde und
eine Schnittstelle für braune Tiere implementieren lassen. Und dann
hätte Brown Dog zwei Verträge, um das Dog Interface und
das Brown Animal Interface zu erfüllen. Basierend auf diesen Informationen sind
abstrakte Klassen nützlich, wenn wir einfache
Objekthierarchien haben Schnittstellen sind nützlich
, wenn wir ein Objekt haben , dessen Verträge Methoden aus
mehreren Hierarchien
kombinieren sollen Methoden aus
mehreren Hierarchien
kombinieren Nehmen wir an, wir haben einen braunen Hund, der von einer Hundeklasse
erbt, und die Hundeklasse erbt
von einer Das ist eine lineare Hierarchie, und es ist sinnvoll,
unsere Methodenverträge
als abstrakte Klassen zu implementieren unsere Methodenverträge
als Nehmen wir andererseits an,
wir haben einen braunen Hund
und wir möchten, dass er
der Objektvorlage
eines farbigen Tieres entspricht. Und wir möchten auch, dass es der Vorlage eines
Tieres mit Beinen entspricht. Farbige Tiere und Tiere mit Beinen sind zwei separate
Objekthierarchien. Natürlich gibt es
viele Tiere, die beide Verträge erfüllen
sollten, aber es gibt auch Tiere, die nur den einen oder anderen erfüllen Wie Sie sehen, hängt die
Auswahl von Schnittstellen oder abstrakten Klassen davon ab, wie Sie
Ihre Klassenhierarchie gestalten Lassen Sie uns nun sehen, wie wir Schnittstellen in der Praxis tatsächlich
verwenden. Zuerst definieren wir eine Schnittstelle
namens animal with legs und deklarieren eine
Methode namens get non legs, die
implementiert werden muss . Außerdem definieren wir eine Schnittstelle
namens colored animal , die eine
Methode namens get color deklariert, die
implementiert werden muss namens get color deklariert, die
implementiert Lassen Sie uns nun eine Klasse für
braune Hunde erstellen. Als Erstes möchte ich, dass Sie
feststellen, dass wir
hier
das Schlüsselwort implements anstelle von extends verwenden . Als Nächstes möchte ich, dass Sie
sehen, dass wir hier mehrere
Schnittstellen
spezifiziert haben , die von Brown Dog implementiert werden
müssen. Wenn Sie versuchen, dies
mit dem Schlüsselwort extends zu tun, gibt
Java einen Fehler aus. Diese Funktion ist
einzigartig für Schnittstellen, da sie
mehrere Dinge implementieren können. Abgesehen von der
Klassendefinition sieht
der Rest der Klasse dem, sieht
der Rest der Klasse dem was wir gesehen haben,
ziemlich ähnlich. Da wir alle Methoden
implementieren müssen die in den Schnittstellen
deklariert sind, die
wir implementieren, definieren
wir sowohl get color
als auch get numb legs Wir fügen auch die
Override-Anmerkung hinzu, um deutlich zu machen, dass diese Implementierungen
die Deklarationen
in den Schnittstellen
überschreiben sollen Deklarationen
in den Schnittstellen
überschreiben Das ist so ziemlich
alles. In diesem Video haben
wir über Schnittstellen gesprochen handelt es
sich um einen neuen Klassentyp,
der
einen Vertrag deklariert , der von Klassen
erfüllt werden muss , die sie implementieren Mithilfe von Schnittstellen können Sie
mehrere
Vererbungsmuster erstellen , was mit normalen
abstrakten Klassen nicht Hier ist der Link zum
Repo-Code, der in diesem Video verwendet wird. Bitte besuchen Sie den Link das Repo und
basteln Sie an dem Code Wir sehen uns im nächsten Video.
12. Enums: Hallo Freunde. In diesem Video werden
wir über Aufzählungen sprechen. Beginnen wir mit der heutigen
Abbildung, indem eine Klasse namens dog one
definieren, die über eine Get-Type-Methode verfügt,
die lediglich Brown Dog zurückgibt Nehmen wir an, wir haben auch
eine Klasse namens Dog Two, die ebenfalls eine
Get-Type-Methode hat, aber diese gibt White Dog zurück. Endlich haben wir Hund drei. Hund drei bekommt Typ
gibt gelben Hund zurück. Ja, das ist gelb
mit einem H statt einem W. Lassen Sie uns nun
alles zusammenfügen. Wir haben unsere drei
Hundedefinitionen auf der linken Seite und dann auf der rechten Seite
instanziieren wir drei Hunde, eine Instanz für jede Klasse Nehmen wir an, wir wollen ein paar einfache
Checks durchführen. Wir wollen nur anrufen und uns
über jeden dieser Hunde informieren. Dann überprüfe die Ausgabe. Wenn die Ausgabe einem
erwarteten Wert entspricht. Wir drucken etwas
für unseren ersten Hund. Wir wollen überprüfen, ob der Typ
eines Hundes ein brauner Hund ist. Beim zweiten Hund werden wir prüfen
wollen, ob
es ein weißer Hund ist. Schließlich wollen
wir beim dritten Hund überprüfen, ob
es sich um einen gelben Hund handelt. Nun, da wir bei der Typdefinition von Hund
drei bekommen
versehentlich den
gelben Hund falsch geschrieben haben, diese Bedingung
falsch und wir drucken
nicht aus, dass
Hund drei gelb ist Das ist in
einem einfachen Programm wie diesem kein großes Problem,
aber ich kann Ihnen eine Situation bieten, in der
mehr auf dem Spiel steht Stellen Sie sich vor, Ihre
Website sucht nach Traffic aus mehreren Ländern und Sie möchten
die Sprache
der Website je nach
Land ändern , aus dem der Benutzer stammt. Nehmen wir an,
Sie möchten für
jemanden in Japan die Sprache
der Website auf Japanisch einstellen . Ähnlich wie bei dieser Logik hätten
Sie eine Reihe
von IF-Anweisungen. Auswahl der Sprache
der Website anhand des Benutzerpunkts Land. Nehmen wir nun an, dass wir
Japan irgendwo in unserem Code falsch buchstabieren Japan irgendwo in unserem Code Jetzt
wird dieser japanische Benutzer nicht die richtige Sprache verstehen und Sie
haben gerade potenzielle Verkäufe verpasst Es wäre großartig, wenn wir unseren Code
gegen solche Tippfehler schützen könnten ,
und wir haben ein Tool, das genau das
tut Lassen Sie uns eine
Enum-Klasse namens Dogtype erstellen. Wenn wir eine Klasse erstellen, schreiben
wir normalerweise den Namen einer öffentlichen Klasse Beachten Sie jedoch, dass wir in dieser
Aufzählung öffentliche Aufzählung,
Hundetyp, sagen dieser
Aufzählung öffentliche Aufzählung,
Hundetyp Dann definieren wir drei Werte:
gelb, braun und weiß Beachten Sie, dass diese drei Werte
nicht in Anführungszeichen stehen , sie
sind keine Zeichenketten. Es ist möglicherweise immer noch nicht
klar, wie das hilft. Schauen wir uns an,
wie wir diese verwenden. Definieren wir für jede
unserer Hundeklassen eine neue
Methode namens get enum type Wir können dann für Hund eins sehen, diese Methode den
Typ braun zurückgibt und wir den Typ weiß
und den Typ doc den Typ gelb zurückgeben Bei den anderen beiden
Hunden mag das im Grunde so
aussehen, wie wir es zuvor hatten, aber hier gibt es einen sehr
wichtigen Unterschied. Enum verhält sich ähnlich wie eine
Variable oder ein Feld in Java, Java eine Suche
durchführt, wenn
Sie darauf verweisen Wenn ich doctype brown sage, sucht
Java tatsächlich nach
der
Enum-Klasse vom Typ Hund und prüft , ob da Java eine Suche
durchführt, wenn
Sie darauf verweisen.
Wenn ich doctype brown sage, sucht
Java tatsächlich nach
der
Enum-Klasse vom Typ Hund und prüft, ob sich darin
ein Wert namens Wenn es keinen solchen Wert gibt, Java nicht kompiliert werden Das ist einer der
Hauptvorteile von Enums. Enums ermöglichen es Java, während
der Kompilierung zu überprüfen, ob alle
Referenzwerte tatsächlich existieren. Dies verringert die Wahrscheinlichkeit, dass Sie Ihre
Referenzwerte falsch schreiben Aufzählungen bedeuten auch, dass es
eine einzige Quelle der Wahrheit für
konstante Werte gibt ,
anstatt wie zuvor, als wir jede
Zeichenfolge manuell herausgeschrieben haben, um Werte zu vergleichen Wir können jetzt so
etwas tun, wo wir eine
stärkere Garantie dafür haben, dass der konstante Wert, auf den wir uns
beziehen, tatsächlich existiert Wenn wir hier versehentlich
Doctype gelb falsch geschrieben haben, wo wir Y E L
O H eingeben, würde Java nicht kompilieren, weil es Doc-Typ-Enumeration
einchecken
würde bewusst, dass
es so etwas wie den
Dokumenttyp Y L L O H nicht gibt. Das war's für
dieses Wir haben über Aufzählungen gesprochen, die es uns ermöglichen,
konstante Werte für
unsere Anwendungen zu definieren konstante Werte für
unsere Anwendungen Diese konstanten Werte
sind hilfreich, denn wenn wir jemals einen falsch geschriebenen
Verweis auf eine Aufzählung haben, Java einen
Kompilierungsfehler und wir wissen genau,
wo das Problem behoben werden Enums bieten auch eine Informationsquelle für unsere
Konstanten. Sie definieren Ihre
Konstanten an einer Stelle, und Sie verweisen immer an anderer Stelle in
Ihrem Programm auf
diese Konstanten , anstatt den Wert
immer
wieder neu zu schreiben Hier ist der Link zum
Repl-Code in diesem Video. Wir sehen uns im nächsten.
13. Schalter: Hallo Freunde. In diesem Video werden
wir über Switch
sprechen. Beginnen wir unsere
Illustration mit ähnlichen Definitionen
aus dem letzten Video. Wir haben einen Hundetyp mit drei Farbtypen und
wir werden einen braunen Hund haben dessen Get-Type-Methode den Hundetyp braun
zurückgibt. nun in unserer Hauptmethode Lassen Sie uns nun in unserer Hauptmethode einen braunen Hund instanziieren Wir sagen, wenn der Typ eines braunen Hundes weiß
ist, geben wir an, dass
der Hund weiß ist Wenn der
Typ des braunen Hundes gelb ist, Sie an, dass der Hund gelb ist. Wenn der Hundetyp braun ist, Sie an, dass der Hund braun ist. Andernfalls geben Sie an, dass die Farbe des
Hundes unbekannt ist. Nun, an diesem Code ist eigentlich nichts
falsch. Es funktioniert einwandfrei. Beachten Sie jedoch, dass wir hier in
jeder if-Klausel denselben Wert haben . Und nicht nur das, wir haben dieselbe logische Struktur
in jeder if-Klausel, derselbe Wert mit einem anderen
Aufzählungstyp
verglichen Auch hier ist aus funktionaler
Sicht nichts falsch daran , aber es sieht einfach Es stellt sich heraus, dass Java dafür
eine Lösung hat. Hier ist eine alternative Art, dasselbe zu
schreiben. Bevor ich anfange,
über diesen Code zu sprechen, möchte
ich, dass Sie selbst
einen Blick darauf werfen. Kannst du dir vorstellen, was jedes
neue Keyword bewirkt? Pausiere das Video und
wenn du bereit bist. Lass uns sehen, wie nah du dran warst. Erstens besagt diese
Switch-Klausel oben im
Grunde nur
, dass wir diesen Wert
immer wieder
vergleichen wollen . Wir werden
den Wert in den Switch-Klammern mit
den Werten vergleichen , die
diesen Case-Schlüsselwörtern folgen Diese Klausel für den ersten Fall entspricht
in etwa der Frage, ob brauner Punkt“ dem Typ „weißer Hund“
entspricht Die zweite ist gleichbedeutend damit, ob brauner Hundetyp gleich
dem Hundetyp gelb ist Sie können wahrscheinlich erraten, was
die letzte Fallklausel bedeutet. Beachten Sie, dass wir in diesen
Fallklauseln nicht
Hundetyp weiß und
Hundetyp gelb sagen Hundetyp weiß und
Hundetyp gelb Wir sagen einfach weiß und gelb. Der Grund dafür ist, dass
Java
in Switch-Blöcken den Enum-Typ, den Wert in
den
Switch-Klammern, ableitet und erwartet, dass Sie einfach die Aufzählungswerte ohne
den Namen der Enum-Klasse davor schreiben Aufzählungswerte ohne
den Namen der Enum-Klasse Das ist ein ziemlich kleiner Punkt, aber denken Sie einfach daran, falls
Sie auf Fehler stoßen Schließlich ist dieser Standardfall ungefähr äquivalent zu
else, aber nicht genau. Es bedeutet eigentlich,
diesen Fall immer auszuführen , wenn das Programm diese Zeile
erreicht. dieser Break-Anweisungen
erreichen wir
diesen Fall jedoch nur im Aufgrund dieser Break-Anweisungen
erreichen wir
diesen Fall jedoch nur im
Fall Ls. Aber was sind sie? Es stellt sich heraus, dass diese
Break-Anweisungen die
weitere Auswertung
innerhalb des Switch-Blocks beenden weitere Auswertung
innerhalb des Switch-Blocks falls der Codepfad sie
jemals erreicht. Nehmen wir zum Beispiel an, dass wir im Fall Brown
die
Break-In-the-Brown-Klausel nicht hatten . Wenn das der Fall wäre, würde der
gesamte Code ausgeführt werden. Wir würden ausdrucken
, dass der Hund braun ist. Und da es dann
keine Bremsleitung mehr gibt, würde
Java
den Code im nächsten Fall weiter ausführen. Der nächste Fall hier
ist der Standardfall. Wir drucken auch
Unbekannte Hundefarbe aus. Wie Sie sehen können, wäre es eine große
Zeitverschwendung,
wenn unser Switch-Block
viel mehr Fälle enthalten würde, wenn wir
den Code weiter ausführen würden, auch wenn wir den Typ
des braunen Hundes
bereits gefunden haben. Wenn Sie
erwarten, dass nur ein Fall
zugeordnet wird, empfiehlt
es sich im Allgemeinen erwarten, dass nur ein Fall
zugeordnet wird, empfiehlt , für jeden Fall
eine Bremsleitung einzurichten. Das war's für dieses Video. In dieser Lektion
haben wir über Switch gesprochen, was im Grunde nur
eine prägnantere Art ist sich wiederholende
Logik zu schreiben,
wenn auch sonst Hier ist der Link zum
Repl-Code in diesem Video. Wir sehen uns im nächsten.
14. Minesweeper Walkthrough 2: Willkommen Freunde. In diesem Video gehen
wir den zweiten Teil
dieses Projekts
durch und verwenden dabei das , was wir in den letzten Lektionen
gelernt haben , insbesondere Enums und Switch Dieses Mal werden wir uns
tatsächlich die Hauptklasse ansehen In dieser Akte ist viel
los. Bevor wir beginnen, nehmen Sie sich bitte
einen Moment Zeit, um sie durchzulesen. Es ist okay, wenn es
Teile gibt, die du nicht verstehst. Viele der Variablennamen
sind ziemlich beschreibend und sollten
Ihnen zumindest einen guten Hinweis darauf
geben , was sie tun Lassen Sie uns das jetzt gemeinsam
durchgehen. Zuerst erstellen wir ein Board, drucken das Board und dann beginnen wir hier eine
Endlosschleife. Diese Eingabezeile des Scanners teilt
der Konsole
im Grunde nur mit, dass sie sehen soll, was der Benutzer in
der aktuellen Runde eingegeben hat. Erinnern wir uns, dass
wir in unserer Demo Dinge wie „Zeilenspalte
markieren“ und
„Zeilenspalte antippen“ gemacht haben . Was auch immer Sie in die
Konsole eingeben, wird
hier in der Zeichenfolge Benutzereingabe gespeichert , wird
hier in der Zeichenfolge Benutzereingabe Aufteilung der
Benutzereingaben
bedeutet lediglich, dass wir die eine Zeichenfolge
anhand des Leerraums
trennen. Wenn wir zum Beispiel ein
Leerzeichen und ein Leerzeichen B haben, dann sollten wir am Ende ein Array haben, das
drei Elemente enthält. Das erste Element ist tap, das zweite Element ist A und das dritte
Element sollte B sein. Wenn
die Länge
des Arrays also nicht drei beträgt, lehnen
wir den Befehl ab
und starten den Loop Over. Möglicherweise sind Sie
mit dieser Continue-Zeile nicht vertraut. Sie weist Java lediglich an, den Rest der Schleife zu überspringen
und ganz oben zu beginnen. Auch hier kehren wir zum Anfang dieser Y-Schleife zurück suchen nach der nächsten Benutzereingabe. Hier haben wir eine Zeile, die
gleich minus eins ist, gefolgt von einer leeren Schleife Spalte entspricht minus eins, gefolgt von
einer leeren Schleife Wir werden in einem späteren Video
darauf zurückkommen. Es ist vorerst nicht besonders
wichtig. Wisse nur, dass Zeile und Spalte ganze Zahlen
sein werden, die die Indizes
der Platine
darstellen, auf
der der Benutzer eine Aktion
ausführen möchte Endlich haben wir einen Teil
des Codes erreicht , der
uns interessiert Hier stellen wir ein Edelmetall her, das
als sichere Zelle bezeichnet wird. Wir haben einen leeren
Schalterblock, der darauf folgt. Im Folgenden sagen wir, dass das Spiel vorbei ist,
wenn die sichere Zelle
falsch ist. Das bedeutet, dass
dieser Schalterblock den
Wert der sicheren Zelle ändern
sollte. Andernfalls wird
diese sichere Zelle einfach immer wahr sein. Und es wäre überflüssig, diesen F-Fall hier zu
haben. Denk an den letzten
Rundgang, den wir gemacht haben. Können Sie sich die Methode vorstellen, die wir implementiert haben und die
einen Goldbarrenwert zurückgibt, der angibt , ob ein Wasserhahn
ein sicherer Wasserhahn war oder nicht? Die Antwort ist, dass Sie die Tap-Methode
implementiert haben. Denken Sie daran, dass wir
diese Tap-Methode
hatten ,
die aufzeichnet, dass die Zelle für
Zahlenzellen angetippt wurde und leere Zellen für
Gedankenzellen wahr
zurückgeben, wir geben falsch zurück Und wenn Sie
einen Code genauer untersucht hätten, hätten
Sie gesehen, dass wir in Board Java auch eine
Tap-Methode haben. Und was machen wir? Zuerst tippen wir auf die
Zelle, die sich in der Spalte der
Indexzeile befindet , und speichern das Ergebnis dieses Abgriffs in
diesem Bullion-Tap-Ergebnis Handelt es sich um einen sicheren Hahn und es gibt keine
Minen um ihn herum, dann tippen wir auf alle
benachbarten Zellen um ihn herum und geben „Wahr“ zurück Andernfalls geben wir Falsch zurück, wenn wir auf
eine Mine geklebt haben. Das bedeutet, dass
wir innerhalb
dieses Switch-Blocks Tap Row Column aufrufen und das Ergebnis dieses
Aufrufs in einer sicheren Zelle
speichern sollten das Ergebnis dieses
Aufrufs in einer sicheren Zelle
speichern Denken Sie jedoch daran, dass ein Schalterblock verwendet
wird, wenn wir
mehrere Fälle haben, um zu überprüfen, welche Fälle
wir innerhalb
dieses Switch-Gehäuses prüfen sollten . Halten Sie das
Video noch einmal an und denken Sie darüber nach, was wir besprochen haben,
vorhin in der Schaluppe passiert Ich werde die Antwort in 321 veröffentlichen. Nun,
wir erhalten nur dann einen Wert für eine sichere Zelle, wenn
wir auf eine Zelle tippen. Dies sind jedoch nicht die einzigen
Aktionen, die ein Benutzer ausführen kann. Erinnern Sie sich an das
Einführungsvideo zum Projekt, dass ein Benutzer auch eine Zelle
markieren und die Markierung aufheben kann , wenn
Sie vergessen haben, was diese tun Im Grunde genommen markiert
die Markierung ein Feld als potenziellen Verstand, aber das Feld
wird nicht angetippt Entfernt eine Flagge aus
dem Feld, auch ohne
auf das Feld zu tippen Da der Benutzerbefehl
das Formular „Aktion“ in
der Zeilenspalte annehmen wird , werden
wir hier den Befehl
Null in diese
Klammern setzen Null in diese
Klammern Unser erster Fall
wird ein Tippen sein. Wenn der Benutzer
ein Tippen als Befehl eingibt ,
dann sagen wir,
dann werden wir den Wert einer sicheren Zelle neu zuweisen, dann werden wir den Wert einer sicheren Zelle neu zuweisen sodass er
das Ergebnis eines Tippens auf der Platine an der Position
der Zeilenspalte Vergessen Sie nicht, dass wir, nachdem wir die Aktion
ausgeführt haben die
wir
in diesem Fall ausführen
möchten, vor dem nächsten Fall eine
Break-Anweisung hinterlassen müssen Wenn der Benutzerbefehl ein Flag wäre, welche Methode sollte zurückgerufen werden? Nun, hier ist eine gute Gelegenheit unsere Fähigkeiten
zum Lesen von Code zu nutzen. Mal sehen, welche anderen Methoden
es in der Board-Klasse gibt. Wir haben hier eine
Methode, die gelöst ist, aber das scheint nicht
wirklich wahrscheinlich. Hey, hier haben wir eine Flagge
und eine Unfeed-Methode. Diese scheinen zu unserem Anwendungsfall zu passen, lassen Sie uns sie wieder
in unserer Hauptklasse verwenden Im Fall von Flag nennen
wir Flag Column. Da diese Methode zurückkehrt, beabsichtigen
wir nicht wirklich,
den Rückgabewert dieser Methode für etwas anderes
zu verwenden den Rückgabewert dieser Methode ,
wir brechen einfach ab. Endlich haben wir
unseren letzten Fall, hier der Flaggenfall ist. Wir machen Flaggenkolumne, dann machen wir auch kaputt. Wir haben hier allerdings ein kleines
Problem. Es ist durchaus möglich
, dass ein Benutzer eine zufällige Zeichenfolge
als Eingabebefehl eingegeben hat
oder dass der Benutzer versehentlich Tap Flag oder Unflag
falsch geschrieben
hat Tap Flag oder Unflag
falsch geschrieben Aber wir wollen
diesen Code
robuster machen und hier kommen
Enums Lassen Sie uns einige
mögliche Werte vordefinieren , die wir vom Benutzer
akzeptieren möchten Hier oben in der Action, ähm, lassen Sie uns weitermachen und unflagg
definieren Es ist nicht wirklich wichtig, in welcher
Reihenfolge du sie schreibst. Lassen Sie uns nun
diese Fallwerte aus
Zeichenketten, Enum-Werten, konvertieren diese Fallwerte aus
Zeichenketten, Enum-Werten, Dies schützt vor
möglichen Tippfehlern. Machen wir weiter und machen
daraus einen Wasserhahn. Machen wir daraus eine Flagge, machen
wir daraus eine UN-Flagge. Aber jetzt haben wir ein kleines Problem. Denken Sie daran, dass Java
den Typ des Werts in diesen Klammern ableitet und überprüft, ob
dieser Typ dem Typ
dieser Fallwerte entspricht Aber das ist hier nicht der Fall. Der Befehlstyp
Null ist eine Zeichenfolge. Der Typ dieser
Fallwerte ist eine Aktionsaufzählung. Wie konvertieren wir eine Zeichenfolge
in eine Aktionsaufzählung? Nun, das ist eine
fantastische Gelegenheit unsere Googling-Fähigkeiten unter Beweis
zu Lassen Sie uns weitermachen und in Google
Java nachlesen, wie man eine Zeichenfolge, in
eine Aufzählung umwandelt eine Aufzählung umwandelt Lass uns weitermachen und
hier
auf das erste Ergebnis klicken . Wir scrollen nach unten. Wir
müssen das meiste davon nicht wirklich lesen, aber wir können genau
hier im Codeblock sehen, dass sie
dir sagen, dass
sie
eine Aufzählung namens Pisa-Status haben eine Aufzählung namens Pisa-Status Ähm, und es hat einen
Wert in sich. Aufzählung des Artikelstatus. Bereit? Scrollen
wir noch ein bisschen runter. Wir sehen, dass wir dieses
Beispiel haben, Pisa Status Enum. Aber diesmal leiten wir
den Wert der Enumeration
nicht ab, indem wir patatenum, ready sagen,
sondern piece of status, enum-Wert von string, Das ist ein ziemlich guter
Hinweis, weil er uns sagt , dass die Wertmethode einer Enum-Klasse eine
Zeichenkette in eine Aufzählung umwandelt Lassen Sie uns das
anstelle von Befehl Null verwenden, lassen Sie uns den Aktionswert
von Befehl Das ist so ziemlich alles, was wir für diesen Rundgang tun
mussten. Leider werden
wir das Ergebnis
unserer Arbeit erneut nicht sehen können bis wir das gesamte Projekt
abgeschlossen haben. Aber ich hoffe, Sie bleiben hier,
um das Endergebnis zu sehen. Das ist alles für dieses Video. Danke fürs Zuschauen und wir
sehen uns im nächsten.
15. Ausnahmen: Hallo Freunde. In diesem Video werden
wir
über Ausnahmen sprechen. Schauen wir uns noch einmal das Beispiel an, das wir im vorherigen Video
hatten. Denken Sie daran, dass unser
Hundetyp-Enum drei Typen hatte:
weiß, braun und gelb Wenn der Hundetyp mit einem dieser drei Fälle übereinstimmt
, würden
wir eine Erklärung drucken und dann
den Schalterblock verlassen Das einzige Mal, dass wir auf
diesen Standardfall stoßen, ist, wenn der Typ „
Brauner Hund“ keine dieser drei Farben hat, aber dann haben wir nur
diese drei Typen definiert. Wann würden wir jemals
auf diesen Fall stoßen? Nun, es könnte sein, wenn der Typ
Null ist , oder vielleicht fügen wir in Zukunft einen zusätzlichen Hundetyp
hinzu. Aber vergiss,
diesen Switch-Block zu aktualisieren. Im Allgemeinen
erwarten
wir jedoch nicht, dass dieser
Standardfall in den meisten Anwendungsfällen erreicht wird. Wenn wir diesen
Standardfall mit diesem Code erreichen, wird es tatsächlich
zu einem stillen Fehler kommen. Es wird eine zusätzliche Zeile
ausgedruckt , Unbekannte Hundefarbe. Aber das Programm läuft einwandfrei. Es schlägt nicht fehl beim Kompilieren und es gibt keinen Fehler
, wenn wir es ausführen. Wir wissen nicht, ob mit dem Ausdrucken
einer
unbekannten Hundefarbe gerechnet
wurde oder nicht. Stattdessen sollten
wir eine Ausnahme auslösen. Hier ist ein Beispiel für eine
der häufigsten
Arten von Ausnahmen, illegale staatliche Ausnahme. Beachten Sie dies hier im Text. Wir sagen throw, was
Java anweist, einen Fehler auszulösen. Und dann stellen wir eine neue
Instanz der Ausnahme mit new zur Verfügung und übergeben eine
Fehlermeldung an die Ausnahme. Wenn Java nun jemals
diese Codezeile erreicht, wird beim Ausführen des Programms
ein Fehler
ausgelöst und
das
Programm wird beendet. Das ist eigentlich eine gute Sache. Nehmen wir an, Sie haben einen
zusätzlichen Hundetyp namens Blue hinzugefügt, aber Sie haben vergessen, einen Fall dafür
hinzuzufügen. Sie möchten, dass der Code stoppt
und Ihnen mitteilt, dass es
einen unbekannten Typ gibt , anstatt weiter zu laufen, als
ob nichts passiert wäre. Bei
diesem kleinen Programm ist das schwer zu erkennen. Aber stellen Sie sich vor, Sie haben eine viel
wichtigere Anwendung. Nehmen wir zum Beispiel an,
es gibt eine Anwendung , die Ihnen sagt, wie viel
Geld Sie auf der Bank haben. Es ist viel besser, wenn
die Bank sagt, dass beim Laden
Ihres Kontos ein Fehler aufgetreten ist, als stillschweigend zu versagen und Ihnen mitzuteilen , dass Sie
sowohl für den Entwickler
als auch für den Benutzer der Anwendung
negative 50.000$ auf
Ihrem Konto haben sowohl für den Entwickler
als auch für den Benutzer der Anwendung
negative 50.000$ auf
Ihrem Konto Benutzer der Der explizite Fehler ist viel
informativer als eine willkürliche, seltsame Ausgabe Der zusätzliche Vorteil für
den Entwickler besteht darin, dass der benutzerdefinierte Fehler
Ihnen tatsächlich mitteilt wo etwas
Unerwartetes passiert ist. Es macht auch das Debuggen
viel einfacher. Das war's für dieses Video. Wir haben über Ausnahmen gesprochen, die bewusst Programme
mit der benutzerdefinierten Fehlermeldung beenden. Obwohl es auf den ersten Blick schrecklich erscheinen mag,
diese zu Ihrem Programm hinzuzufügen. Tatsächlich tragen sie jedoch dazu bei, die
Programmstabilität zu gewährleisten , indem sie Plausibilitätsprüfungen durchführen und
dem Entwickler im
Falle eines Fehlers Hinweise geben dem Entwickler im
Falle eines Fehlers Hier ist der Link zum
Abstoßcode, der in diesem Video verwendet wird. Wir sehen uns im nächsten.
16. HashMap: Willkommen Freunde. In diesem Video werden
wir
über die Hash-Map sprechen. Das heutige Beispiel ist ziemlich kurz und kann in eine Datei passen. Als Erstes
möchte ich, dass Sie
diesen Import am
Anfang der Datei bemerken . Die Hash-Map ist eine
Datenstruktur, die im
Java Util-Paket enthalten
ist, dem es sich um ein integriertes Paket handelt Schauen wir uns als Nächstes an,
wie wir eine Hashmap deklarieren. Wie üblich deklarieren wir zuerst den Typ der Variablen, bei der es
sich um eine Hashmap handelt Dann verwenden wir diese abgewinkelten
Klammern, um
die Typen der Schlüssel und
Werte innerhalb dieser Map anzugeben die Typen der Schlüssel und
Werte innerhalb dieser Die Ganzzahl in
eckigen Klammern gibt den Typ der Schlüssel Die Zeichenfolge in den Klammern gibt den Typ
der Werte Ein Schlüssel ist im Grunde
etwas, das
wir verwenden werden, um Werte nachzuschlagen. Denken Sie zum Beispiel an die
Kontextliste auf Ihrem Telefon. Wenn Sie die Telefonnummer
Ihres Freundes nachschlagen möchten, suchen
Sie zuerst nach
seinem Namen. Wenn Sie auf den Namen klicken, wird auf
Ihrem Telefon die Telefonnummer
Ihres Freundes angezeigt. Der Name Ihres Freundes ist ein Schlüssel, einer Telefonnummer
zugeordnet ist,
bei der es sich um einen Wert handelt. In diesem Fall werden wir ganze Zahlen Zeichenketten
zuordnen Beachten Sie auch, dass wir
hier eine Ganzzahl in
Großbuchstaben I anstelle von
Kleinbuchstaben T verwendet hier eine Ganzzahl in
Großbuchstaben I anstelle von haben. Wenn wir Ganzzahltypen, die in anderen
Objekten enthalten
sind, als Schlüssel innerhalb einer Map
deklarieren , verwenden
wir eine Ganzzahl von Groß I, aber ansonsten
sind große Ganzzahl und Kleinbuchstabe T
so gut wie austauschbar Schauen wir uns als Nächstes an, wie wir eine
Hashmap instanziieren. Beachten Sie, dass wir immer noch die spitzen Klammern
einschließen, aber
nichts in sie einfügen Das liegt daran, dass diese
Syntax Java anweist, einfach die Typen
der Schlüssel und Werte abzuleiten Von der linken Seite dieser Zuweisung
aus wird
Java wissen, dass es eine Hash-Map
mit Integer-Schlüsseln
und Zeichenkettenwerten
erstellen muss mit Integer-Schlüsseln
und Zeichenkettenwerten In der nächsten Zeile bedeutet map put
one yellow, dass
wir jetzt innerhalb der Map eins auf
gelb abbilden . Punkt auf braun bedeutet, dass
wir zwei auf braun abbilden. Wenn wir Map Dot Get One drucken, drucken
wir Gelb aus. Wenn wir Map Dot Get Two drucken, drucken
wir braun aus. Es scheint ziemlich einfach zu sein
und ist es normalerweise auch. Eine Sache, auf die ich hier
hinweisen möchte, ist, dass dieses Hin und Her
in konstanter Zeit stattfindet. Wir haben noch nicht wirklich
darüber gesprochen, was dieses O in
einer Notation bedeutet, weil es in diesem Kurs nicht wirklich im
Mittelpunkt steht. Du musst nicht wirklich
im Detail wissen, was vor sich geht, aber ich gebe dir
einen kurzen Überblick. Die Hash- und
Hash-Map ist eigentlich ein
Programmiermechanismus,
der es dem Computer ermöglicht ,
Objekte so zu speichern, dass sie später sehr einfach und schnell
abgerufen werden können. Das Abrufen
und Speichern dieser Objekte nimmt immer noch Zeit in Anspruch, aber die Zeit ist in den meisten Anwendungsfällen so gut wie
vernachlässigbar Karten eignen sich hervorragend
zum Speichern von Daten. In Ordnung, das
war's für dieses Video. Wir haben über die Hash-Map gesprochen
, eine Datenstruktur, die Schlüssel
speichert und Werten zuordnet. All dies erfolgt
in konstanter Zeit,
was bedeutet, dass die Latenz zum Schreiben in die Map und zum Lesen aus
der Map
erforderlich ist, nicht wesentlich zunimmt, wenn wir die
Anzahl der Elemente in der Map erhöhen. Hier ist der Link zum
Abstoßcode, der in diesem Video verwendet wird. Wir sehen uns im nächsten.
17. Karten-Addendum: Willkommen Freunde. In diesem
Video gehen
wir auf eine zusätzliche Funktion von
Java im Zusammenhang mit Hash-Maps ein. Hier ist das Beispiel,
das wir im vorherigen Video hatten , mit
etwas mehr Code darin. Lassen Sie uns zunächst
Java Util Dot Map importieren. Schauen wir uns als Nächstes diese Zeile an. Unten deklarieren wir
eine Variable namens x und geben ihr den Typ
Map, Integer, Integer. Wir instanziieren es
mit Map 1234. Ein paar Dinge, die Sie hier beachten sollten. Erstens ist eine Map nicht
dasselbe wie eine Hash-Map. Eine Map ist eigentlich eine Schnittstelle, und eine Hash-Map ist eine konkrete Implementierung
dieser Schnittstelle. Zweitens ist eine mit map of erstellte
Map unveränderlich,
was bedeutet, dass Sie
ihre Schlüssel oder Werte nicht mehr ändern können ,
sobald sie erstellt wurde Diese Syntaxzuordnung sieht lustig aus, entspricht
aber im Grunde der Zuordnung von Schlüssel eins zu Wert zwei und Schlüssel
drei zu Wert vier Wenn wir
einen bekommen, bekommen wir zwei. Da eins zwei entspricht, erhalten wir, wenn wir x Punkt zwei bekommen, einen Nullwert, weil
zwei ein Wert ist, kein Schlüssel. Da der Schlüssel zwei nicht
existiert, erhalten wir ein Nullergebnis. Schlussendlich gibt uns Docket drei
vier, da sich Schlüssel und Werte in der Map of
Creation Call
abwechseln und wir den Wert drei hinter dem Wert zwei angeben drei hinter dem Wert zwei Das war's für dieses Video. Ich wollte
Ihnen nur eine Einführung in
eine schnelle Methode zum Instanziieren
einer Map geben , wenn Sie nicht zuerst die Map erstellen und sie
dann nacheinander mit Schlüsseln und
Werten füllen möchten ,
um es schnell zusammenzufassen Karten, die auf diese
Weise erstellt wurden, sind unveränderlich. Wenn wir das tun, wechseln wir Schlüssel und Werte innerhalb
der Aufrufkarte Hier ist der Link zum
Abstoßcode in diesem Video. Wir sehen uns im nächsten.
18. HashSet: Willkommen Freunde. In diesem Video werden
wir
über das Hash-Set sprechen. Das heutige Beispiel ist dem
im letzten Video ziemlich ähnlich. Es passt in eine Datei und sogar die Syntax ist ziemlich
ähnlich. Lass uns darauf eingehen. Das Erste, was
Sie beachten sollten ,
ist, dass Hash-Sets genau wie bei der
Hash-Map explizit importiert werden müssen. Hash-Sets sind auch
im Java Util-Paket enthalten. Schauen wir uns als Nächstes die
Variablendeklaration an. Wir deklarieren ein Hash-Set, und dann
deklarieren wir innerhalb dieser
spitzen Klammern den Typ der Elemente , die
darin enthalten sein werden Wir verwenden eine Ganzzahl in Großbuchstaben I da wir die
Ganzzahlen in einen Container packen, genau wie Listen oder Hashmaps Wenn wir
die Hash-Sets instanziieren, müssen
wir den Typ der Elemente auf der rechten
Seite
der Zuweisung nicht
angeben Elemente auf der rechten
Seite
der Wir können einfach leere eckige Klammern
setzen und Java leitet den
Typ der Elemente aus der Variablendeklaration auf
der linken Seite
der Zuweisung ab Variablendeklaration auf
der linken Seite
der Die AD-Methode ermöglicht es uns, Artikel im Set zu
speichern. Beachten Sie, dass Java es Ihnen
nicht erlaubt, ein Objekt mit etwas anderem
als einer Ganzzahl in das Set aufzunehmen. Sie können keine
Zeichenketten oder Bullionwerte eingeben. Sie würden einen
Fehler bei der Kompilierung erhalten, wenn Sie das versuchen würden. Wenn wir hier versuchen,
35 hinzuzufügen , nachdem wir
dies bereits zuvor getan haben, wird sich tatsächlich
nichts ändern. Dies ist eines der
Hauptmerkmale von Hash-Sets. Hash-Sets
speichern nur einzigartige Elemente. Wenn Sie versuchen,
dasselbe Objekt zweimal hinzuzufügen, wird
Java keinen Fehler machen, aber es wird auch
nichts anderes tun. Wir haben auch eine Größenmethode, und Sie können sich wahrscheinlich
vorstellen, was das bewirkt. Es gibt nur die Anzahl
der Artikel im Set zurück. In diesem Fall sind das zwei. Da wir nur
35,91 in der Menge haben, die enthaltene Methode wahr oder falsch
zurück je nachdem, ob
das angeforderte Element bereits in der Menge enthalten ist Es ist wahr für 35 und
es ist falsch für 36. Sie können auch
Artikel aus dem Set entfernen. Wenn Sie Artikel aufrufen
, die 35 entfernen, 35
nicht mehr im Set enthalten. Wir können das bestätigen, indem wir
Elemente aufrufen, die 35 enthalten, was „Falsch“ zurückgibt. Jetzt noch ein letzter wichtiger
Hinweis für Sie. Genau wie Hash-Maps verwenden
auch Hash-Sets den Hash-Mechanismus Sie müssen die
Details nicht kennen, sondern nur wissen, dass diese Aufrufe
Hinzufügen und Entfernen enthalten, alle in konstanter Zeit erfolgen bedeutet, dass die Zeit
, die für die Ausführung dieser Methoden benötigt zunehmender Größe
des Sets
nicht wesentlich zunimmt. Dies kann sehr hilfreich sein
, wenn Sie
eine Datenstruktur für wirklich
schnelles Suchen und Speichern verwenden möchten. Nehmen wir zum Beispiel an, Sie
möchten überprüfen, ob eine bestimmte Werbung
bereits für einen Nutzer abgespielt wurde. Auf diese Weise können wir immer
einzigartige Werbung schalten. Nun, eine Möglichkeit, das
darzustellen, ist, dass jedem Benutzerobjekt ein
Hash-Set zugeordnet ist. Set enthält
die
Werbeobjekte , die der Benutzer bereits gesehen
hat. Das ist nur ein einfaches Beispiel. Und wir werden einen weiteren Anwendungsfall
für Hash-Sets im Projekt haben , den Sie sehr bald sehen werden. In Ordnung, und das
war's für dieses Video. In dieser Lektion
haben wir über Hash-Sets gesprochen, die es uns ermöglichen,
Werte für spätere Nachschlagevorgänge zu speichern. Sie verfügen außerdem über konstante
Leserechte, was sie
in verschiedenen Anwendungsfällen sehr hilfreich macht, wie zum Beispiel bei dem einzigartigen
Werbebeispiel, über das wir gesprochen haben. Hier ist der Repo-Link für
den Code in diesem Video. Wir sehen uns im nächsten.
19. Minesweeper Walkthrough 3: Willkommen Freunde. In
diesem Video werden
wir einen der
wirkungsvollsten Teile des Projekts durchgehen wirkungsvollsten Teile des verwenden das, was wir
in den letzten Videos
in Board-Java gelernt haben in Board-Java Scrollen Sie nach unten zu dieser Methode als Sammeln
benachbarter leerer Zellen bezeichnet wird. Schauen wir uns
an, was es macht. Dieses mit der Q-Klasse verknüpfte Blockieren Q kommt
Ihnen vielleicht nicht bekannt vor, machen Sie sich darüber keine Sorgen. Es ist für den Kurs nicht so relevant
. Alles, was Sie hier wirklich
wissen müssen,
ist, dass es uns dabei hilft sogenannte BFS
- oder Breadth-First-Suche
durchzuführen - oder Breadth-First-Suche Das ist Atem, wie in B, R, E, A,
D, T, H. Darüber haben wir im Diskurs nicht
gesprochen Und es ist nicht wirklich
notwendig, dass Sie wissen, wie es konkret
funktioniert. Aber wenn Sie
neugierig sind, können Sie es gerne
googeln , denn es ist
ein sehr cooles Konzept. Bei dieser Methode sammelt unsere
BFS-Suche alle leeren Zellen, die an die angegebene
Zeile und Spalte
angrenzen Sobald es alle
angrenzenden leeren Zellen gesammelt hat, sucht
es nach
leeren Zellen, die
an die leeren Zellen angrenzen, die
wir bereits gesammelt haben Und dann
suchen wir weiter nach leeren Zellen die an diese leeren
Zellen
angrenzen, und so weiter. Wie Sie vielleicht vermutet haben, ist
dies Teil des Codes,
der das
Tippen auf eine leere Zelle behandelt Denken Sie daran, dass beim
Tippen auf ein leeres Feld normalerweise ein großer Teil
der Tafel für
uns abgetippt wird Das geschieht mit dieser Methode, die dem Programm mitteilt,
wo sich alle leeren Zellen
neben der Zelle befinden, auf die Sie
getippt haben Bevor wir weitermachen,
möchte ich anerkennen, dass einige von Ihnen aufgrund dieser Komplettlösungen vielleicht etwas
frustriert sind. Vielleicht denkst du, hey, warum haben wir
in den Walk-Through-Videos nicht über BFS gesprochen Warum werden wir in diesem Projekt mit
neuen Datenstrukturen und
Algorithmen vertraut gemacht Nun, dafür gibt es ein paar
Gründe. Der Hauptgrund ist, dass
ein großer Teil des Programmiererdaseins darin besteht, unbekannten Code
zu lesen, ihn zumindest
teilweise zu
verstehen und ihn dann zu modifizieren Es stimmt nicht, dass es
eine begrenzte Menge an
Java gibt , die man Und erst wenn
Sie es gelernt haben, Sie bereit, den
gesamten Code der Welt in Angriff zu nehmen Die Wahrheit ist, dass es da draußen
eine Menge kluger Leute gibt. Und die Leute verwenden alle möglichen
schwer verständlichen
Algorithmen und Codes. Es gibt keine magische Menge an Java, die Sie kennen müssen, bevor Sie bereit sind, sich der Welt
zu stellen. lernen,
mit Code zu arbeiten, mit dem Sie nicht zu 100% vertraut sind, ist
alltägliche Realität. Wenn Sie es im Kurs so
weit geschafft haben, freue
ich mich, dass Sie immer noch hier sind und mit mir
lernen, zu lernen. Ordnung, jetzt
schauen wir uns endlich einige
Schlüsselkomponenten dieser Methode genauer an. Schau dir diese Variable an, besonders die Zeile
hier, in der Polteilung steht. Dabei
wird
eine Zeichenfolge aus der
Datenstruktur entfernt , die Zeichenfolge des
Trennzeichens in
Komponenten aufgeteilt mithilfe des
Trennzeichens in
Komponenten aufgeteilt
und dann das Ergebnis
dieser Aufteilung in
disvariable Koordinaten gespeichert dieser Aufteilung in
disvariable Wenn
es beispielsweise ein Element in Q gäbe, das eine Zeichenfolge a B wäre, dann wäre das Ergebnis der
Teilung durch die ein Array mit zwei Elementen dessen erstes Element a und dessen zweites
Element B wäre. Hier können Sie sehen,
dass in unserem Fall A tatsächlich ein Zeilenindex und B tatsächlich
ein Spaltenindex ist. Wir verwenden diese Indizes, um eine Zelle in unserem Board
auszuwählen, und dann haben wir das zu erledigen Es ist wirklich schwer zu
verstehen, was wir hier tun
müssen. Wenn Sie BFS noch nie gesehen haben, sich
nicht entmutigen,
wenn Sie sich ratlos fühlen Ich werde dir aber sagen, was hier vor sich geht
. In dieser Schleife, die
der Aufgabe folgt, haben wir diese Zeile A plus j. Wie Sie sich wahrscheinlich vorstellen können, wird
Ad die Zeichenfolge hinzufügen,
wir geben sie an Q weiter. Eine Sache, die Sie vielleicht nicht sofort
bemerken,
ist, dass wir möglicherweise
unendlich viele Elemente zu Q hinzufügen. Und dann werden wir
diese Schleife, die prüft,
ob Q leer ist, nie verlassen diese Schleife, die prüft,
ob Q Im Grunde ist die Idee, dass wir diese verschachtelte Schleife hier nur ausführen
wollen, höchstens einmal, für jede
einzelne Zelle auf der Platine. Aber im Moment, wenn Sie
bereits Zeile A in Spalte B gesehen haben, könnten
Sie immer noch
versehentlich ein B
zu Q hinzufügen und diese
verschachtelte Schleife erneut durchlaufen Wir müssen also den Überblick über
alle Zellen behalten , die wir
bereits besucht haben Wir möchten
Zellen speichern, die wir
bereits in der
Datenstruktur gesehen haben , und dann diese
doppelt verschachtelte Schleife
nur dann ausführen die aktuelle Zelle
noch nicht besucht wurde Können Sie sich
eine Datenstruktur vorstellen
, von der wir gelernt haben und die schnelles Einfügen
und schnelles Nachschlagen
ermöglicht? Denken Sie darüber nach und ich
unterbreche das Video und
antworte mit 321 Die Antwort ist ein Hash-Set. Wir können Zellen, die wir
bereits besucht haben, in einem Hash-Set speichern . Das heißt, wenn Sie auf
eine Zelle stoßen , die nicht
im Hash-Set enthalten ist, bedeutet
das, dass Sie noch nie zuvor
auf eine Zelle gestoßen sind. Auf diese Weise können wir
sicherstellen, dass wir
diese doppelt verschachtelte Schleife für
jede Zelle höchstens einmal ausführen diese doppelt verschachtelte Schleife für
jede Zelle höchstens einmal Folgendes
müssen wir tun: Zuerst
werden wir hier oben unser
Hash-Set namens
Scene instanziieren Dann werden wir hier unten
zuerst überprüfen, ob wir diese Zelle
schon gesehen haben? zuerst überprüfen, ob wir diese Zelle
schon gesehen haben Wir können die Methode sets
contains für
T verwenden . Dann wickeln wir diese ganze doppelt verschachtelte,
vierfach verschachtelte Schleife hinein und drehen sie in ein Negativ
um Wenn wir die angegebene Zelle noch nicht
gesehen haben, fügen wir diese Zelle
dem Szenen-Hash-Set hinzu , weil
wir diese Zelle jetzt besucht haben Nachdem wir diese Zelle
besucht haben, führen
wir unseren Loop durch. Jetzt stellen wir sicher, dass
diese Schleife
nie wieder ausgeführt wird . Warum ist das so? Nun, mal sehen, 1 Sekunde. Ich glaube, ich habe diese Einbuchtung
durcheinander gebracht. Da haben wir's Okay. Warum funktioniert das? Nehmen wir an, wir stoßen auf eine Zelle, die noch nie
zuvor gesehen wurde. Es wird nicht innerhalb der Szene
sein. Wir fügen es der Szene hinzu und dann führen wir
diese Doppelschleife durch. Nehmen wir an, wir fügen
versehentlich die Zelle, die wir gerade gesehen
haben, wieder in Q ein. Wenn wir
dann
die Schleife erneut durchlaufen, gehen wir zu dem, dass
wir die Zelle, die wir
bereits gesehen haben, aus der Warteschlange herausnehmen. Und dann werden wir überprüfen, ob die Szene nicht Popped enthält Nun, weil wir die Zelle,
die wir gesehen haben,
bereits zu der
Szene hinzugefügt haben,
die sich hier eingestellt hat wir in der nächsten Runde
auf
diese If-Anweisung zurückkommen wenn wir in der nächsten Runde
auf
diese If-Anweisung zurückkommen,
wird das Ergebnis falsch zurückgegeben Wir werden nicht in der Lage sein, diese doppelt
verschachtelte For-Schleife auf dieser
Zelle ein anderes Mal
auszuführen verschachtelte For-Schleife auf dieser
Zelle ein anderes Mal Das war's für dieses Video. Jetzt haben wir unsere Aufgabe erfüllt. Wir sind nur noch einen Katzensprung davon
entfernt , unser Spiel spielen
zu können. Wir sehen uns im nächsten Video.
20. Minesweeper Walkthrough 4: Willkommen Freunde. In diesem Video werden
wir unser Spiel endlich
fertigstellen. Wenn du
mit diesem Video fertig bist, solltest
du in der Lage sein,
das Spiel interaktiv zu spielen und den Link mit deinen
Freunden zu teilen , damit sie auch spielen können Ordnung, für den ersten
Teil dieses Rundgangs werden wir uns Board Java noch einmal
ansehen Am Anfang dieser Datei sollten
Sie sehen, dass wir
diese Buchstaben-zu-Nummer-Zuordnung definiert haben diese Buchstaben-zu-Nummer-Zuordnung definiert Denken
Sie daran, dass
unsere Befehle beim Spielen des Spiels die folgende Form annehmen. Aktion, Zeile, Spalte wie a, B. Unsere Zeile und Spalten
werden als Buchstaben eingegeben, aber wir müssen
diese Buchstaben in Indizes umwandeln. Und unser Minesweeper-Board, unsere Board-Indizes,
werden
von oben nach unten und von
links nach rechts beginnen von oben nach unten und von
links nach rechts Mit anderen Worten, A
wird auf Index Null abgebildet, Maps auf Index eins und Maps auf Index
zwei und so weiter Hier müssen wir nur diese Zuordnungen
definieren.
Lass uns das machen Wir haben ein Mapping auf Null, Mapping auf eins. Schnell
ist zu beachten, dass ich
zwischen jedem Wertepaar eine neue Zeile gelassen habe zwischen jedem Wertepaar Schlüsselwerte sind eigentlich
nicht notwendig. Sie können
diese auch einfach alle in eine Zeile setzen. Ich habe es einfach in verschiedene
Zeilen gelegt, damit es schöner aussieht. Sie außerdem sicher, dass Ihre Schlüssel in doppelte
Anführungszeichen gesetzt
sind Wenn Sie einfache Anführungszeichen setzen, ist
das eigentlich ein anderer
Java-Typ, der als Zeichen bezeichnet wird. Als Nächstes
gehen wir zu Main Java und
scrollen nach unten bis zu der Stelle, an der ganze Zeilen gleich
sind Hier führen wir die
Konvertierung von einem Buchstaben in eine Zahl durch. Erinnern Sie sich an das
vorherige Video, in dem wir hier über dieses
Befehls-Array
gesprochen Wenn wir den Benutzerbefehl nach Leerzeichen aufteilen, teilen
wir den Benutzerbefehl
in drei Elemente auf. Der Befehl ist das
erste Element, der Zeilenbuchstabe ist
das zweite Element und der Spaltenbuchstabe
ist das dritte Element. Denken Sie daran, dass unsere Indizes bei Null
beginnen. Das bedeutet, dass der Zeilenbuchstabe bei Index eins stehen
wird. In Befehlen rufen wir
die Zahlenzuweisung
der Zeile ab, indem wir den Befehl
board letter to nu map ausführen board letter to nu map Befehle 1 hier
abrufen. Diese Zuordnung von Buchstaben zu Numb haben wir gerade hier
definiert. Es nimmt den
Zeilenbuchstaben, den der Benutzer eingegeben hat, und ruft
dann den
numerischen Index ab, dem dieser Buchstabe entspricht
, wir gerade in
der anderen Klasse definiert In ähnlicher Weise machen wir dasselbe mit
dem Buchstaben in der
Spalte, um Mapget-Befehle zu
betäuben Jetzt müssen wir tatsächlich
ein paar Verbesserungen hinzufügen und einen Tippfehler
korrigieren, den ich in
früheren Videos in Board Java gemacht habe früheren Videos in Board Java Dort haben wir implementiert,
benachbarte leere Zellen zu sammeln, Szene zu Szenenzellen zu
ändern der letzten Zeile
dieser Methode erwarten wir
tatsächlich , dass eine Variable existiert
, die als Szenenzellen bezeichnet wird Das war mein Fehler, ich entschuldige mich. Lassen Sie uns die
Szene in Szenenzellen ändern. abschließend in den
Zellenklassen, die wir in einer der
ersten Anleitungen zu diesem Thema
implementiert
haben,
sicher, dass Sie zuerst den Fall „Tapped“,
„Tapped vor
dem Fall „Ist Das liegt daran, dass, sobald
Sie auf eine Zelle tippen,
dieser Zellenstatus endgültig ist Sie können es nicht kennzeichnen oder es entzippen. Wenn jedoch die Flagge
bei der Methode mit zwei Zeichenketten an erster Stelle steht, bedeutet das, dass, wenn Sie zuerst
eine Zelle markieren und
dann darauf tippen, das Board immer noch
das Dreieckssymbol für
das Board rendert und nicht
den angetippten Status, da es
das Flaggensymbol vor
dem getippten Bullen überprüft Flaggensymbol vor
dem getippten Bullen Machen Sie sich keine Sorgen, wenn das ein bisschen
verwirrend ist, es ist ein kniffliger Fehler. Der Hauptpunkt dieses Projekts
bestand darin, das Programmieren zu üben und
nicht darin, obskure Fehler zu finden.
Mach dir darüber keine Sorgen Versuchen wir nun, auf Ausführen zu klicken und unser Spiel zu
spielen. Nett. Sieht aus, als ob das
Spiel funktioniert. Es werden
Zahlenzellen aufgedeckt, leere Zellen werden an
den richtigen Stellen aufgedeckt. Wir können auch versuchen zu markieren, und wir bekommen eine Flagge an
der richtigen Stelle In Ordnung, das
war's für dieses Video. Danke, dass du es bis hierher geschafft hast. Jetzt kannst du das Spiel spielen
und es mit deinen Freunden teilen. Wir sehen uns im nächsten Video.
21. Modul 2 Schlussfolgerung: Hallo nochmal. Willkommen
am Ende dieses Kurses. Herzlichen Glückwunsch. Sie haben jetzt eine
funktionierende Minengebühr pro Spiel berechnet, mit der mehr
als 1 Billion Konfigurationen generiert werden können . Und du kannst sie verwenden
, um
deine Freunde herauszufordern und in deinem
Lebenslauf damit zu prahlen. Und übrigens, ich übertreibe
nicht, ich meine wirklich mehr
als 1 Billion Du kannst meine
Mathematik überprüfen. Sie haben auch verschiedene Methoden zum Entwerfen
von Code
gelernt. Verwendung von Vererbung, abstrakten
Klassen und Schnittstellen. Sie haben auch
nützliche Datenstrukturen
wie Hash-Maps und -Sets kennengelernt . Es mag im Moment schwer sein, mir zu
glauben, aber im
Laufe Ihrer Karriere werden
Sie feststellen, dass viele fortschrittliche Technologien
eigentlich nur auf
grundlegenden Dingen wie
Vererbung und
grundlegenden Datenstrukturen aufbauen grundlegenden Dingen wie
Vererbung und
grundlegenden , wie Sie sie in diesem Kurs
gelernt haben. Sie müssen
mir vorerst nur beim Wort nehmen. Aber irgendwann hoffe ich, dass du
eines Tages verstehst, was ich meine. Am wichtigsten ist, dass Programmieren eine Fähigkeit
ist, in der jeder kontinuierlich lernt. Ich verspreche nicht, Ihnen
alles beigebracht zu
haben , was es
über Java-Programmierung zu wissen gibt, aber ich hoffe,
dass ich
Ihnen ein klareres Bild von
den Grundlagen vermittelt habe , sodass Sie gut
gerüstet sind , um selbst noch
weiter zu lernen, sei es durch
meine zukünftigen Kurse oder durch die von jemand anderem Nochmals herzlichen
Glückwunsch zum Abschluss des Kurses und ich wünsche Ihnen bis zum nächsten Mal alles
Gute