Baue dein eigenes Minesweeper-Spiel in Java | Alvin Wan | Skillshare
Suchen

Playback-Geschwindigkeit


1.0x


  • 0.5x
  • 0.75x
  • 1x (normal)
  • 1.25x
  • 1.5x
  • 1.75x
  • 2x

Baue dein eigenes Minesweeper-Spiel in Java

teacher avatar Alvin Wan, Research Scientist

Schau dir diesen Kurs und Tausende anderer Kurse an

Erhalte unbegrenzten Zugang zu allen Kursen
Lerne von Branchenführern, Ikonen und erfahrenen Experten
Wähle aus einer Vielzahl von Themen, wie Illustration, Design, Fotografie, Animation und mehr

Schau dir diesen Kurs und Tausende anderer Kurse an

Erhalte unbegrenzten Zugang zu allen Kursen
Lerne von Branchenführern, Ikonen und erfahrenen Experten
Wähle aus einer Vielzahl von Themen, wie Illustration, Design, Fotografie, Animation und mehr

Einheiten dieses Kurses

    • 1.

      Einführung

      1:34

    • 2.

      Über dich und mich

      3:27

    • 3.

      Einführung von Projekten

      7:05

    • 4.

      Illustration der Erbschaft

      3:09

    • 5.

      Beispiele für Vererbung

      3:31

    • 6.

      Super-Beispiele

      2:24

    • 7.

      Subtyp-Polymorphismus

      4:40

    • 8.

      Abstrakte Illustration

      3:53

    • 9.

      Abstrakte Beispiele

      7:09

    • 10.

      Minesweeper Walkthrough 1

      10:57

    • 11.

      Schnittstellen

      4:20

    • 12.

      Enums

      4:39

    • 13.

      Schalter

      3:47

    • 14.

      Minesweeper Walkthrough 2

      9:14

    • 15.

      Ausnahmen

      2:57

    • 16.

      HashMap

      3:14

    • 17.

      Karten-Addendum

      1:48

    • 18.

      HashSet

      3:22

    • 19.

      Minesweeper Walkthrough 3

      7:11

    • 20.

      Minesweeper Walkthrough 4

      5:19

    • 21.

      Modul 2 Schlussfolgerung

      1:15

  • --
  • Anfänger-Niveau
  • Fortgeschrittenes Niveau
  • Fortgeschrittenes Niveau
  • Jedes Niveau

Von der Community generiert

Das Niveau wird anhand der mehrheitlichen Meinung der Teilnehmer:innen bestimmt, die diesen Kurs bewertet haben. Bis das Feedback von mindestens 5 Teilnehmer:innen eingegangen ist, wird die Empfehlung der Kursleiter:innen angezeigt.

118

Teilnehmer:innen

--

Projekte

Über diesen Kurs

Dieser Kurs wird von Gastlehrer Derek Wan geleitet (Link zur Skillshare-Profilseite)

[Die diskutierten Themen bauen auf den Themen auf, die in meinem anderen Kurs präsentiert werden https://skl.sh/445M6ks. Obwohl keine strenge Voraussetzung ist, empfehle ich dir, meinen Kurs zu besuchen, wenn du dich in diesen Videos verirrst.]

Dieser Kurs behandelt grundlegende Java-Konzepte und bringt dir alles bei, was du wissen musst, um ein Minesweeper-Spiel zu bauen, das mehr als 17 Billionen Spielkonfigurationen generieren kann. Dieser Kurs vermittelt dir die erforderlichen Fähigkeiten, um große Programmierprojekte anzugehen und deine Programme mit zunehmender Komplexität zu skalieren.

Was du lernen wirst

  • Vererbung
  • Super
  • Polymorphismus
  • Abstrakte Kurse
  • Schnittstellen
  • Enums
  • Schalter
  • Ausnahmen
  • HashMaps
  • HashSets
  • Replit

Es ist keine spezialisierte Hardware oder kein spezielles Setup erforderlich, um Java mit mir zu lernen! Sämtlicher Code wird durch eine Sandbox-Umgebung in deinem Browser ausgeführt, in der alle Abhängigkeiten bereits installiert und für dich konfiguriert sind.  Du kannst deine ganze Energie auf Java konzentrieren, anstatt mit den Macken deines Computers zu feilschen. Alles, was du für diesen Kurs brauchst, ist Internet, dein Gerät und etwas Freizeit.

Folien findest du hier: https://drive.google.com/drive/folders/1ZmmSP7P82_LJZ9OXhg5kWbYei2e5UIPu?usp=sharing

Triff deine:n Kursleiter:in

Teacher Profile Image

Alvin Wan

Research Scientist

Top Teacher

Hi, I'm Alvin. I was formerly a computer science lecturer at UC Berkeley, where I served on various course staffs for 5 years. I'm now a research scientist at a large tech company, working on cutting edge AI. I've got courses to get you started -- not just to teach the basics, but also to get you excited to learn more. For more, see my Guide to Coding or YouTube.

Welcoming Guest Teacher Derek! I was formerly an instructor for the largest computer science course at UC Berkeley, where I taught for several years and won the Distinguished GSI (graduate student instructor) award. I am now a software engineer working on experimentation platforms at a large tech company. 4.45 / 5.00 average rating (943 reviews) at UC Berkeley. For more, see my Skillshare or Webs... Vollständiges Profil ansehen

Skills dieses Kurses

Entwicklung Programmiersprachen Java
Level: Intermediate

Kursbewertung

Erwartungen erfüllt?
    Voll und ganz!
  • 0%
  • Ja
  • 0%
  • Teils teils
  • 0%
  • Eher nicht
  • 0%

Warum lohnt sich eine Mitgliedschaft bei Skillshare?

Nimm an prämierten Skillshare Original-Kursen teil

Jeder Kurs setzt sich aus kurzen Einheiten und praktischen Übungsprojekten zusammen

Mit deiner Mitgliedschaft unterstützt du die Kursleiter:innen auf Skillshare

Lerne von überall aus

Ob auf dem Weg zur Arbeit, zur Uni oder im Flieger - streame oder lade Kurse herunter mit der Skillshare-App und lerne, wo auch immer du möchtest.

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