[JAVA] Was ist eigentlich objektorientiert?

Im Folgenden Was ist Objektorientierung nach allem oder nur eine Sache, auf die bei der Programmierung geachtet werden muss Über den Teil, der aufgrund von Erläuterungen nicht im Detail beschrieben werden konnte Ergänzung.

Was genau ist objektorientiert?

Ich habe das Gefühl, dass die Reihenfolge umgekehrt ist, aber für diejenigen, die neu in "objektorientiert" sind, werde ich ein konkretes Beispiel geben und ein Bild bekommen. Die Sprache ist Java, aber ich schreibe sie, damit ich sie verstehen kann, ohne Java zu kennen. Objektorientiert ist die Programmierung von Daten und verwandten Methoden (real) in einer ** Klasse **. Betrachten Sie beispielsweise die folgende Klasse "Freunde", um die Informationen Ihrer Freunde zu verwalten.

Friend.java


public class Friend {
	private String name;//Name
	private String phoneNumber;//Telefonnummer
	private String mailAddress;//Mail Adresse

	public Friend(String name, String phoneNumber, String mailAddress) {
		//das bedeutet sich
		this.name = name;
		this.phoneNumber = phoneNumber;
		this.mailAddress = mailAddress;
	}
	
	/**Ausgangskontakte*/
	public void outputContact(){
		System.out.println(name);
		System.out.println("Telefonnummer:"+phoneNumber);
		System.out.println("Email:"+mailAddress);
	}
}

Diese Klasse hat drei ** Felder **, name, phoneNumber und mailAddress, und es gibt eine ** Methode ** outputContact (), die sie verwendet. Die Methode Friend (String name, String phoneNumber, String mailAddress) mit demselben Namen wie der Klassenname heißt ** Constructor ** und wird wie folgt verwendet.

Friend tanaka = new Friend("Ichiro Tanaka", "03-444-444", "[email protected]");

Wie Sie dem Friend-Konstruktor entnehmen können, setzt dieser Code "Ichiro Tanaka" in das Feld "name", "03-444-444" in das Feld "phoneNumber" und "[email protected]" in das Feld "mailAddress". Ich bin. Wenn Sie die folgende Methode aufrufen, wird der Kontakt angezeigt.

tanaka.outputContact();
/*
Ichiro Tanaka
Telefonnummer: 03-444-444
E-Mail: [email protected]
*/

Auf diese Weise definiert die Klasse "welche Informationen sie haben soll" (hier Name, Telefonnummer und E-Mail-Adresse) und "welche Funktion sie hat" (hier Kontaktausgabe) * * In der Konstruktionszeichnung ** wird der Konstruktor mit new aufgerufen und die Daten werden tatsächlich eingegeben und materialisiert, was als ** Instanz ** bezeichnet wird. Einer der Vorteile beim Erstellen einer solchen Klasse besteht darin, dass Sie eine Reihe von Daten und Funktionen zusammen erstellen können. Wenn Sie die Klasse nicht verwenden, erhalten Sie diesen Code, wenn Sie viele Freunde haben.

String tanakaName = "Ichiro Tanaka";
String tanakaPhoneNumber = "03-444-444";
String tanakaMailAddress = "[email protected]";
String yamadaName = "Yamada Taro";
String yamadaPhoneNumber = "03-555-555";
String yamadaMailAddress = "[email protected]";
String suzukiName = "Hanako Suzuki";
String suzukiPhoneNumber = "03-666-666";
String suzukiMailAddress = "[email protected]";
//Fortsetzung unten...

System.out.println(tanakaName);
System.out.println("Telefonnummer:"+tanakaPhoneNumber);      
System.out.println("Email:"+tanakaMailAddress);
System.out.println(yamadaName);
System.out.println("Telefonnummer:"+yamadaPhoneNumber);      
System.out.println("Email:"+yamadaMailAddress);
System.out.println(suzukiName);
System.out.println("Telefonnummer:"+suzukiPhoneNumber);     
System.out.println("Email:"+suzukiMailAddress);
//Fortsetzung unten...

Es ist verwirrend und mühsam.

Friend tanaka = new Friend("Ichiro Tanaka", "03-444-444", "[email protected]");
Friend yamada = new Friend("Yamada Taro", "03-555-555", "[email protected]");
Friend suzuki = new Friend("Hanako Suzuki", "03-666-666", "[email protected]");
//Fortsetzung unten...
tanaka.outputContact();
yamada.outputContact();
suzuki.outputContact();
//Fortsetzung unten...

Es wird erfrischend sein, wenn Sie schreiben. Übrigens, wenn Sie sich die obigen Felder und Methoden ansehen, sind die Felder wie name ** privat ** und die outputContact () Methode ist ** öffentlich **. Diese werden als ** Modifikatoren ** bezeichnet, was bedeutet, dass privat "privat" bedeutet und nur innerhalb der Klasse zugegriffen werden kann. Public bedeutet "öffentlich" und kann extern aufgerufen werden.

System.out.println(tanaka.name);//Fehler, weil es privat ist
tanaka.outputContact();//Da es öffentlich ist, kann es ausgeführt werden.

Unter Hauptteil erfahren Sie, warum ein solcher Modifikator existiert.

Schnittstelle

Oben schrieb die Klasse "eine Entwurfszeichnung, die definiert, welche Informationen sie haben sollte und welche Funktionen sie hat", aber ** Schnittstelle ** sagt "welche Funktionen sie haben sollte". Es ist eine Art abstrahierte Klasse, die nur "ka" definiert. Angenommen, Sie möchten die Daten Ihrer Kollegen sowie Ihrer Freunde verwalten. Wenn Sie jedoch der Meinung sind, dass es eine Kontaktausgabemethode geben sollte, erstellen Sie in beiden Fällen eine Schnittstelle wie die folgende:

Human.java


public interface Human {
	/**Ausgangskontakte*/
    public void outputContact();    
}

Dies bedeutet, dass "Mensch" eine Kontaktausgabemethode haben sollte. Die Implementierung erfolgt in ** geerbten ** Klassen mit dem Schlüsselwort ** implementiert **, da die Schnittstelle nur definiert, welche Methoden verwendet werden sollen.

public class Friend implements Human{
	...//(Weggelassen)
    @Override
    public void outputContact(){
		System.out.println(name);
        System.out.println("Telefonnummer:"+phoneNumber);
        System.out.println("Email:"+mailAddress);
    }
}
/**Kollege*/
public class Colleague implements Human{
	...//(Weggelassen)
    @Override
    public void outputContact(){
        //(Inhalte verarbeiten)
    }
}

Das Erben und Überschreiben einer Methode wird als ** Überschreiben ** bezeichnet.

letzter Modifikator

Java final ist ein Modifikator, der bedeutet "das ist es, es ist eine Regel". Variablen mit dieser können nach Eingabe des Wertes nicht mehr geändert werden.

final int CONST_VARIABLE = 100;
CONST_VARIABLE = 50;//Fehler, weil ich versucht habe, den Wert zu ändern, obwohl er endgültig war

Variablen, deren Werte auf diese Weise nicht geändert werden können, werden als "Konstanten" bezeichnet. Es ist üblich, mit Großbuchstaben und "_" (Unterstrich) zu benennen. Warum müssen wir also "Variablen" erstellen, deren Werte nicht geändert werden können? Das soll den Code leicht verständlich machen. Angenommen, Sie haben den folgenden Code.

double price = 100 * 1.08;

Ab November 2017 wissen Sie möglicherweise, dass Sie den Verbrauchsteuersatz multiplizieren, aber diejenigen, die diesen Code lesen, nachdem sich der Verbrauchsteuersatz in Zukunft geändert hat, verstehen möglicherweise nicht, warum er mit 1,08 multipliziert wird. Aber was ist mit Code wie diesem:

final double CONSUMPTION_TAX_RATE = 0.08;//Umsatzsteuersatz
double price = 100 * (1 + CONSUMPTION_TAX_RATE);

In diesem Fall können Sie sehen, dass der Teil ".08" den Verbrauchsteuersatz bedeutet. Es handelt sich also um einen Code, der von zukünftigen Personen verstanden und geändert werden kann, deren Verbrauchsteuersatz sich geändert hat.

statischer Modifikator

Java statisch bedeutet "statisch". Dies bedeutet, dass es nicht für jede Instanz unterschiedlich ist, die "dynamisch" (im Gegensatz zu "statisch") in neu wie das Feld "Name" der obigen Klasse "Freund" generiert wird, sondern allen Klassen gemeinsam ist. Ich werde. Wenn die Friend-Klasse beispielsweise den folgenden Code hat,

public class Friend {
    public static int hoge = 10;
    public static int fuga(){
        return 20;
    }
	//(Unten weggelassen)
}

Wie unten gezeigt, ist es allen Klassen gemeinsam und kann ohne neue (Instantisierung) verwendet werden.

Friend yamada = new Friend("Yamada Taro", "03-555-555", "[email protected]");
Friend suzuki = new Friend("Hanako Suzuki", "03-666-666", "[email protected]");

//Gemeinsam, auch wenn die Instanz anders ist
yamada.hoge = 30;
System.out.println(yamada.hoge);//30
System.out.println(suzuki.hoge);//30

//Kann verwendet werden, ohne überhaupt eine Instanz zu erstellen
System.out.println(Friend.hoge);//30
System.out.println(Friend.fuga());//20

Es ist jedoch besser, die Verwendung des statischen Feldes ohne das obige Finale zu vermeiden. Wie ich in Hauptteil geschrieben habe, hat die Objektorientierung den Vorteil, dass sie verwendet werden kann, ohne das Innere der Klasse zu kennen. Wenn beispielsweise "Friend tanaka = neuer Freund" ("Ichiro Tanaka", "03-444-444", "[email protected]"); ", werden die Daten explizit angegeben (" Ichiro Tanaka "," 03-444-444 "). "," [email protected] ") und der Code wird unter der Annahme geschrieben, dass er nur die verarbeiteten Daten enthält. Das Vorhandensein eines statischen Feldes kann jedoch an einer völlig anderen Stelle umgeschrieben werden und sich anders als erwartet verhalten, wodurch die objektorientierten Vorteile zunichte gemacht werden. Andererseits sollte die Methode nach Möglichkeit so statisch wie möglich sein. Beispiel: Eine Methode zum Überprüfen, ob die Telefonnummer im richtigen Format vorliegt ("xxx-xxxx-xxxx" (eine Reihe von Zahlen und Bindestrichen)) mit Regulärer Ausdruck Wenn dies der Fall ist, versteht es sich, dass die statische Darstellung "nicht von einer bestimmten Person (Instanz) abhängt", sodass keine unnötige Verwirrung entsteht.

public class Friend {
	...//(Weggelassen)
    public static boolean isValidPhoneNumber(String phoneNumber){
        Pattern p = Pattern.compile("^[0-9]+-[0-9]+-[0-9]+$");
        Matcher m = p.matcher(phoneNumber);
        return m.matches();
    }
}
System.out.println(Friend.isValidPhoneNumber("03-444-444"));//True für korrektes Format
System.out.println(Friend.isValidPhoneNumber("03-44a-444"));//Falsch wegen Eingabefehler

Obwohl ich oben geschrieben habe, dass nicht endgültige statische Felder nicht verwendet werden sollten, sollte empfohlen werden, allgemeine Klassenkonstanten in statischen endgültigen zu definieren, da dies leicht zu verstehen ist.

public class Friend {
	...//(Weggelassen)
    /**Telefonnummernformat*/
    private static final Pattern PHONE_NUMBER_PATTERN = Pattern.compile("^[0-9]+-[0-9]+-[0-9]+$");
    
    public static boolean isValidPhoneNumber(String phoneNumber){
        Matcher m = PHONE_NUMBER_PATTERN.matcher(phoneNumber);
        return m.matches();
    }
}

Recommended Posts

Was ist eigentlich objektorientiert?
Was ist eigentlich objektorientiert?
Was macht [Rails DB: Migrieren]?
Was ist Cubby?
Was ist null? ]]
Was ist java
Was ist Schlüsselumhang?
Was ist Maven?
Was ist Jackson?
Was ist Selbst
Was ist ArgumentMatcher?
Was ist IM-Jonglieren?
Was ist params
Was ist SLF4J?
Was ist Fassade? ??
Was ist schließlich Objektorientierung oder nur eine Sache, auf die Sie bei der Programmierung achten müssen?
Was ist Java <>?
Was ist Gradle?
Was ist POJO?
Was ist java
Was ist centOS?
Was ist RubyGem?
Was ist before_action?
Was ist Docker?
Was ist Byte?
Was ist Tomcat?
Was ist Maven Assembly?
Was ist Docker-Compose?
Was ist ein Konstruktor?
Was ist vue cli
Was ist eine Schnittstelle?
Was ist Rubys Selbst?
Was ist harte Codierung?
Was ist ein Stream?
Was ist Rubys attr_accessor?
Was ist Java-Kapselung?
Was ist Instanzsteuerung?
Was ist ein Initialisierer?
Was ist Spring Tools 4?
Was ist ein Operator?
Was ist Objektorientierung?
Was ist Guavas @VisibleForTesting?
Was ist ein MVC-Modell?
Was ist eine Anmerkung?
Was ist Java-Technologie?
Was ist Java API-Java?
Was ist @ (Instanzvariable)?
Was ist Gradles Artefakt?
Was ist JPA-Prüfung?
[Java] Was ist flatMap?
Was ist ein Servlet?
Was ist Webentwicklung?
[Java] Was ist ArrayList?