[JAVA] Ein Memo für mich, dass Objektorientierung etwas ist

Es ist ein Jahr her, seit ich angefangen habe zu programmieren. Es ist nicht so, dass ich es überhaupt nicht angefasst habe, weil ich eine Android-App erstellt habe, aber ich denke immer wieder, dass es objektorientiert ist. Wenn Sie es nicht verstehen, wird es in Zukunft schwierig sein, machen Sie sich also eine Notiz. Geschrieben in Java und Ruby

Was hier geschrieben steht, ist eine Zusammenstellung von Recherchen des Autors, der ein Super-Anfänger in der Programmierung ist. Ich denke, es gibt viele falsche Notationen und Bedeutungen.

Ich wäre Ihnen dankbar, wenn Sie auf Fehler hinweisen könnten.

Ein bisschen über die Klasse

Ich habe viele Methoden in der Hauptklasse gemacht! !! Ich weiß das nicht mehr!

Main.java


class Main{
 public static void main(String[] args){
  hello();
  sorry();
  goodbye();
  fine();
  .
  .
  .
 }
  public static void hello(){
   //Prozessanweisung
  }
  public static void sorry(){
   //Prozessanweisung
  }
  .
  .
  . 
}

↓ Erstellen Sie andere Klassen und schreiben Sie viele Methoden!

Main.java


class Main{
 public static void main(String[] args){
  Person.hello();
 }
}

Person.java


class Person{
 public static void hello(){
  System.out.println("Hello World");
 }
}

(In Ruby)

index.rb


class Person
 #Inhalt
end

groß! Sauber!

Was ist ein Objekt?

Repräsentiert "Dinge" in der realen Welt (oft an verschiedenen Orten geschrieben) Zum Beispiel, wenn es ein Objekt namens Otaku gibt

Technische Daten (Informationen) --28 Jahre alt --Single

Was Sie tun können (Verhalten)

Kann mit dem Gefühl (Voreingenommenheit) erklärt werden

Objekte werden auch als Instanzen bezeichnet.

Objekt = Instanz!

Sie benötigen eine Klasse, um eine Instanz zu erstellen. Mit anderen Worten, die Klasse ist eine Instanzentwurfszeichnung. (Es wird oft an verschiedenen Stellen geschrieben)

Nun definieren wir Otaku. Es ist einfach. Schreiben Sie einfach die "Spezifikationen" und "Was Sie tun können" der Instanz in die Otaku-Klasse (Konstruktionszeichnung).

Lass uns Otaku machen

Main.java


class Main{
 public static void main(String[] args){
   Otaku otaku1 = new Otaku();  //➀ Erstellen Sie eine Instanz der Otaku-Klasse! Weisen Sie die Instanz einer Variablen zu und verwenden Sie sie!
 //Klassentyp Variablenname(Instanzname) =neuer Klassenname();
   Otaku otaku2 = new Otaku();
   Otaku otaku3 = new Otaku();  //➁ Sie können viele Instanzen aus demselben Klassentyp erstellen! Es gibt viele Otaku!

   //➃ Instanzname.Methodenname()Sie können verwenden, was Otaku kann!
   otaku1.usePC();  
   otaku1.specBody();  //➄ In der specBody-Methode "Ich bin fett!Ich möchte sagen! Wert des Instanzfeldkörpers("Fett")Möchte benutzen!
 }
}

Otaku.java


class Otaku{
 //➂ Hier sind die Spezifikationen von Otaku(Information)Ich werde definieren! Es scheint, dass das schwierige Wort Instanzfeld ist? Aber es ist eine Variablendeklaration!(vielleicht!)
 public String age;
 public String body;

 //➂ Weisen Sie im Konstruktor einen Wert zu!
 Otaku(){
  otaku1.age = "28 Jahre alt"; 
  otaku1.body = "Fett";
 }  

 //➃ Was Otaku von hier aus tun kann(Verhalten)Wird durch eine Methode ausgedrückt! Wird auch als Instanzmethode bezeichnet!
 public void usePC(){
  System.out.println("Ich bin ein großer Lehrer für PCs!");
 }
 public void specBody(){
  System.out.println("ich" * this.body + "ist!");  //➄ MainクラスでspecBodyメソッドが呼ばれた時に、thisをインスタンス名に置き換えるよ! これで「ichデブist!Sie können sagen!
 }
}

(Verwendung der Instanzmethode in Ruby)

otaku.rb


class Otaku
 def usePC  #Definition der Instanzmethode
   puts "Ich bin ein großer Lehrer für PCs!"
 end
end

otaku = Otaku.new  #Instanzgenerierung
otaku.usePC

öffentlich oder statisch

public ・ ・ ・ Kann von außerhalb der Klasse aufgerufen werden static ・ ・ ・ Kann aufgerufen werden, ohne eine Instanz zu erstellen

Ein bisschen mehr über den Konstruktor

Ein Konstruktor ist eine spezielle Methode, die automatisch aufgerufen wird, nachdem eine Instanz mit new erstellt wurde. Synonym für "Methode initialisieren" in Ruby

Wenn Sie den Konstruktor beim Festlegen des Werts des Instanzfelds verwenden und nicht verwenden, ändert sich der Code erheblich! Erinnern wir uns richtig!

Kein Konstruktor ver

Main.java


class Main{
 public static void main(String[] args){
   Otaku otaku1 = new Otaku();  //➀ Erstellen Sie eine Instanz der Otaku-Klasse! Weisen Sie die Instanz einer Variablen zu und verwenden Sie sie!
 //Klassentyp Variablenname(Instanzname) =neuer Klassenname();
   Otaku otaku2 = new Otaku();
   Otaku otaku3 = new Otaku();  //➁ Sie können viele Instanzen aus demselben Klassentyp erstellen! Es gibt viele Otaku!
   
   otaku1.age = "28 Jahre alt";  //➂ Ich werde in jedem Fall detaillierte Informationen über Otaku geben! Das ist kein guter Mensch!
   otaku1.body = "Fett";  

   otaku1.usePC();  //➃ Instanzname.Methodenname()Sie können verwenden, was Otaku kann!
   otaku1.specBody();  //➄ In der specBody-Methode "Ich bin fett!Ich möchte sagen! Wert des Instanzfeldkörpers("Fett")Möchte benutzen!
 }
}

Von diesem Code otaku1.age = "28 Jahre alt"; otaku1.body = "Fett"; Ich setze den Wert auf. Damit wäre es schwierig, die Anzahl der Instanzfelder zu erhöhen! Ich weiß es nicht, weil es so viele gibt!

Mit Konstruktor ver

Main.java


class Main{
 public static void main(String[] args){
   Otaku otaku1 = new Otaku();  //➀ Erstellen Sie eine Instanz der Otaku-Klasse! Weisen Sie die Instanz einer Variablen zu und verwenden Sie sie!
 //Klassentyp Variablenname(Instanzname) =neuer Klassenname();
   Otaku otaku2 = new Otaku();
   Otaku otaku3 = new Otaku();  //➁ Sie können viele Instanzen aus demselben Klassentyp erstellen! Es gibt viele Otaku!
   
   //Nein!

   otaku1.usePC();  //➃ Instanzname.Methodenname()Sie können verwenden, was Otaku kann!
   otaku1.specBody();  //➄ In der specBody-Methode "Ich bin fett!Ich möchte sagen! Wert des Instanzfeldkörpers("Fett")Möchte benutzen!
 }
}

Otaku.java


class Otaku{
 //➂ Hier sind die Spezifikationen von Otaku(Information)Ich werde definieren! Es scheint, dass das schwierige Wort Instanzfeld ist? Aber es ist eine Variablendeklaration!(vielleicht!)
 public String age;
 public String body;

 //Ich werde den Konstruktor hier verwenden! neuer Otaku();Diese Methode wird immer verwendet, wenn sie aufgerufen wird!
 Otaku(){
  otaku1.age = "28 Jahre alt";  //➂ Ich werde in jedem Fall detaillierte Informationen über Otaku geben! Das ist kein guter Mensch!
  otaku1.body = "Fett"; 
 }

 //➃ Was Otaku von hier aus tun kann(Verhalten)Wird durch eine Methode ausgedrückt! Wird auch als Instanzmethode bezeichnet!
 public void usePC(){
  System.out.println("Ich bin ein großer Lehrer für PCs!");
 }
 public void specBody(){
  System.out.println("ich" * this.body + "ist!");  //➄ MainクラスでspecBodyメソッドが呼ばれた時に、thisをインスタンス名に置き換えるよ! これで「ichデブist!Sie können sagen!
 }
}

Regeln zum Schreiben von Konstruktoren!

Sie können beim Erstellen einer Instanz auch einen Wert als Argument festlegen und an den Konstruktor übergeben!

Main.java


Otaku otaku = new Otaku("Fett");

Otaku.java


class Otaku{
  public String body;
 Otaku(String body){  //"Fett"Eingeben
  this.body = body;  //otaku.body = "Fett";Gleich wie!
 }
}

Dies ist bei Ruby der Fall

index.rb


class Otaku
 def initialize(name)  //Was Sie beim Erstellen einer Instanz tun möchten
  @name = name  #Instanzvariable(Informationen, die die Instanz hat(Daten))
 end
 def info
  puts "ich#{@name}ist"  #Instanzvariablen nur innerhalb der Klasse verfügbar
 end
end

otaku = Otaku.new("Fett")
otaku.info

Informationen zu Klassenfeldern und Klassenmethoden

Es ist an der Zeit, dass mein Kopf nicht aufholt. Bedeutet das, dass die Klasse auch Informationen haben kann?

Klassen können auch Methoden haben. An erster Stelle public static void main(String[] args){ } Dies ist auch eine Klassenmethode, nicht wahr?

Otaku.java


class Otaku{
  static int count = 0;  //Klassenvariable(Variablen, die in allen Fällen verwendet werden können)
  
  //Instanzfeld
  public String age;
  public String body;

  //Konstrukteur
  Otaku(){
   Otaku.count++;  //Zugriff auf Klassenfelder
  }
}

So schreiben Sie Klassenmethoden in Ruby

index.rb


class Otaku
 @@count = 0  #Definition von Klassenvariablen

 def initialize(name)
  @name = name
  @@count += 1
 end
 def Otaku.data  #Klassenmethodendefinition selbst.Kann auch eine Klassenmethode sein
  puts "ist Name"
 end
end

Otaku.data  #Aufrufen einer Klassenmethode
#Name des Ausgabeergebnisses

Was ist Kapselung ...?

Nein, es ist eng Einfach ausgedrückt, legen Sie die sicheren Teile der von Ihnen erstellten Funktionen offen und begrenzen (kapseln) Sie die Teile, die Sie nicht verwenden möchten. Dies kann durch Einschränken des Zugriffs auf Felder und Methoden erfolgen.

Wai "Ich habe eine Klasse gemacht! Schau dir das an! Es ist erstaunlich! Ich habe es auch in anderen Klassen benutzt!" Fügen Sie "public" hinzu!

Main.java


class Main(){
 public static void main(String[] args){
  Otaku otaku = new Otaku("wai");  //Instanzgenerierung
  System.out.println(otaku.name);  //Es ist für die Öffentlichkeit zugänglich, so dass Sie es verwenden können!
 }
}

Otaku.java


class Otaku{
 //Instanzfeld
 public String name;  //Fügen Sie "public" hinzu, damit von außerhalb der Klasse darauf zugegriffen werden kann!

 //Konstrukteur
 Otaku(String name){
  this.name = name;
 }
}

Wai "Ich habe eine Klasse gemacht! Schau dir das an! Aber wenn ich es in einer anderen Klasse benutze, scheint es einen Fehler zu verursachen, also kann ich es nicht benutzen ..." Fügen Sie "privat" hinzu!

Main.java


class Main(){
 public static void main(String[] args){
  Otaku otaku = new Otaku(28);  //Instanzgenerierung
  System.out.println(otaku.age);  //Error! !! !! Kann ich nicht benutzen!
}

Otaku.java


class Otaku{
 //Instanzfeld
 private int age;  //Fügen Sie "privat" hinzu, um den Zugriff von außen zu verhindern!

 //Konstrukteur
 Otaku(int age){
  this.age = age;  //Sie können es in der gleichen Klasse verwenden!
 }
}

Ruby-Methoden sind öffentliche Methoden, sofern Sie nichts angeben. Die nach private geschriebene Methode wird zu einer privaten Methode und kann nur innerhalb der Klasse aufgerufen werden.

Jedoch, Für Kunden, die einen sicheren Wert erhalten möchten, auch wenn das Instanzfeld privat ist, bieten wir eine Methode namens "getter" an, die nur den Rückgabewert des Felds verwenden kann!

Main.java


class Main{
 public static void main(String[] args){
  Otaku otaku = new Otaku("~","~","~");
  System.out.println(otaku.getName());
 }
}

Otaku.java


class Otaku{
 //Instanzfeld
 ~
 private String name;  //Das ist "privat", aber ...
 ~

 //Instanzmethode
 public String getName(){  //Da dies "öffentlich" ist, kann von außerhalb der Klasse darauf zugegriffen werden
  return this.name;  //Gibt den Wert des Feldes zurück
 }
}

Selbst in Ruby kann der Wert einer Instanzvariablen nur innerhalb der Klasse abgerufen werden, sodass er mit einem Getter von außerhalb der Klasse abgerufen werden kann.

index.rb


class Otaku
 attr_reader:name  #Getter Definition
 def initialize(name)
   @name = name
 end
end

otaku = Otaku.new("Beschäftigt")
puts otaku.name

Attr_reader definiert Getter, indem es dasselbe wie ↓ tut

def name
   @name  #Rückgabewert(Rückgabe weggelassen)
end

Im Gegenteil, es gibt auch eine Methode "Setter", die den Wert des Feldes von außen ändert.

Main.java


class Main{
 public static void main(String[] args){
  Otaku otaku = new Otaku("~","~","~");
  otaku.setName("washi");  //In der setName-Methode festgelegtes Argument
  System.out.println(otaku.getName());
  //Ausgabeergebnis: washi
 }
}

Otaku.java


class Otaku{
 ~
 private String name;
 ~

 public void setName(String name){
  this.name = name;  //Wert im Feld einstellen
 } 
}

Setter Definition in Ruby

index.rb


class Otaku
 attr_writer:name #Definition des Setzers
 
 def initialize(name)
  @name = name
 end
end

otaku = Otaku.new("Beschäftigt")

otaku.name = "süß"  #Setter anrufen
puts otaku.name  #Das Ausgabeergebnis ist niedlich

Attr_writer definiert einen Setter, indem er dasselbe wie ↓ tut

def name=(value)
 @name = value
end

Wenn Sie in Ruby Getter und Setter gleichzeitig definieren, können Sie beide gleichzeitig definieren, indem Sie "attr_accessor" verwenden.

Grundsätzlich,

--Feld ist privat

Durch Setzen auf wird die Variable privat geschützt und die Methode kann in anderen Klassen öffentlich verwendet werden, was praktisch ist.

Erbe! ??

Was für eine coole Sache.

Sie möchten Code mit ähnlichem Inhalt zusammenstellen. Gleiches gilt für den Inhalt der Klasse. Vererbung des Inhalts einer Klasse durch eine andere Klasse.

Senior "Meine Spezialfähigkeit ist vielseitig! Super verwendbar!" (Geerbte Spezialfähigkeit (Klasse): Superklasse)

Super.java


class Super{
 public void setName(String name){
  System.out.println(name);
 }
}

Junior "Senior! Lass es mich benutzen!" (Spezialfähigkeit (Klasse), die vererbt werden kann: Unterklasse)

Sub.java


class Sub extends Super{  //Erbt die Instanzmethode der Super-Klasse
 
}

Main.java


class Main{
 public static void main(String[] args){
  Sub sub = new Sub();
  sub.setName("Hyperkinetischer Positionsumkehrer!!!");  //Rufen Sie eine Instanzmethode einer Oberklasse auf
 }
}

In Ruby sieht es so aus

index.rb


class Super
 def initialize(name)
   @name = name
 end
 def info
   puts @name
 end
end

class Sub < Super
end

sub = Sub.new("Hyperkinetischer Positionsumkehrer!!!")  #Wenn new ausgeführt wird, wird die Initialisierungsmethode der übergeordneten Klasse ausgeführt.
sub.info  #Da es von der übergeordneten Klasse erbt, kann die info-Methode verwendet werden

Durch Definieren einer Methode mit demselben Namen wie die von der Oberklasse in der Unterklasse geerbte Methode kann der Inhalt der Oberklasse überschrieben werden. Dies wird als "Überschreiben" bezeichnet.

Außerdem kann nur innerhalb dieser Klasse auf "privat" zugegriffen werden, während auf "geschützt" nur innerhalb dieser Klasse und ihrer Unterklassen zugegriffen werden kann.

Was mir aufgefallen ist / Notizen

--Methoden werden in der Klasse definiert --dies wird verwendet, um auf eine Methode oder Instanz in einer Klasse zu verweisen

Recommended Posts

Ein Memo für mich, dass Objektorientierung etwas ist
Ein Memo, das Spring Boot berührte
Docker-Ausführungsnotiz für mich zusammengestellt
[MVC-Modell] Ein Memo, das ein Anfänger MVC gelernt hat
java.util.Arrays.asList () ist kein Ersatz für neue ArrayList <> ()
Kenntnis der Objektorientierung für ein halbes Jahr Programmierung
[Memo lesen] Refactoring-Typecode ersetzen (für Typecodes, die das Verhalten beeinflussen) -2
[Memo lesen] Refactoring - Ersetzen von Typcodes (für Typecodes, die das Verhalten beeinflussen) -1
[# 2 Java] Welche Objektorientierung hören Sie oft?
Über eine Doppelschleife, die eine For-Anweisung in eine For-Anweisung einfügt
Ein Memo, das eine Klasse behandelt, die unabhängig mit ArrayList erstellt wurde
Ein Memo des Programms, mit dem Sie feststellen können, dass die Wahrscheinlichkeit eines Würfelwurfs etwa 1/6 beträgt