
Javaを使用したオブジェクト指向のプログラミングストレージへようこそ! Java言語を介してオブジェクト指向のプログラミングを探求および学習するための包括的なリソースを提供します。
オブジェクト指向プログラミング(OOP -OOP -OOP指向プログラミング)は、ソフトウェア開発で広く使用されている一般的なプログラミングモデルです。これは、データ(属性)とメソッド(動作)の両方を組み合わせたエンティティである「オブジェクト」の概念に基づいています。 OOPは、手続き上のプログラミングプログラミングのように、プロセスとロジックではなく、インタラクティブオブジェクトに基づいたソフトウェア設計に焦点を当てています。
オブジェクト指向のプログラミングは、4つの基本原則、つまりパッケージング、継承、多型、および要約に基づいています。これらの各原則は、ソフトウェア開発の問題を解決し、ソースコードをより効果的に管理するのに役立つアプローチを提供します。
1。カプセル化:これは、オブジェクトの内部展開の詳細を隠すという概念であり、ユーザーが内部のデータに直接アクセスするのを防ぎます。パッケージングは、オブジェクトのデータと動作を不要な介入から保護し、オブジェクトと対話するための統一されたインターフェイスを提供します。
// Lớp Employee (Nhân viên) chứa các thuộc tính: tên, tuổi, lương
public class Employee {
// Các biến dữ liệu riêng tư để ngăn chặn truy cập trực tiếp từ bên ngoài lớp
private String name ;
private int age ;
private double salary ;
// Constructor (hàm tạo) để khởi tạo các giá trị của đối tượng
public Employee ( String name , int age , double salary ) {
this . name = name ;
this . age = age ;
this . salary = salary ;
}
// Các phương thức getter để truy cập các biến dữ liệu
public String getName () {
return name ;
}
public int getAge () {
return age ;
}
public double getSalary () {
return salary ;
}
// Các phương thức setter để cập nhật giá trị của các biến dữ liệu
public void setName ( String name ) {
this . name = name ;
}
public void setAge ( int age ) {
this . age = age ;
}
public void setSalary ( double salary ) {
this . salary = salary ;
}
}
// Lớp Main để thực thi mã
public class Main {
public static void main ( String [] args ) {
// Tạo đối tượng của lớp Employee
Employee emp = new Employee ( "John Doe" , 30 , 50000 );
// Truy cập và cập nhật thông qua các phương thức getter và setter
System . out . println ( "Employee name: " + emp . getName ());
emp . setSalary ( 55000 );
System . out . println ( "Updated salary: " + emp . getSalary ());
}
}この例では、変数name 、 age 、 salary privateとしてマークされています。つまり、 Employeeの外側から直接アクセスできません。代わりに、 getName() 、 getAge() 、 getSalary() 、 setName() 、 setAge() 、およびsetSalary()が提供され、これらの変数の値にアクセスして更新され、パッケージが確保されます。
2。継承(継承):継承により、新しいレイヤーが既存のレイヤーからプロパティと方法を継承することができます。この新しいレイヤーは、継承コンポーネントを追加または変更して独自のニーズを満たし、ソースコードを効果的に再利用および拡張するのに役立ちます。
// Lớp cơ sở (hay lớp cha): Employee
public class Employee {
private String name ;
private int age ;
// Constructor của lớp Employee
public Employee ( String name , int age ) {
this . name = name ;
this . age = age ;
}
// Getter và Setter
public String getName () {
return name ;
}
public void setName ( String name ) {
this . name = name ;
}
public int getAge () {
return age ;
}
public void setAge ( int age ) {
this . age = age ;
}
// Phương thức để hiển thị thông tin
public void displayInfo () {
System . out . println ( "Name: " + name + ", Age: " + age );
}
}
// Lớp dẫn xuất (hay lớp con): Manager kế thừa từ Employee
public class Manager extends Employee {
private double salary ;
// Constructor của lớp Manager
public Manager ( String name , int age , double salary ) {
super ( name , age ); // Gọi constructor của lớp cơ sở (lớp cha)
this . salary = salary ;
}
// Phương thức mới của lớp Manager
@ Override
public void displayInfo () {
// Gọi phương thức displayInfo của lớp cơ sở (lớp cha)
super . displayInfo ();
System . out . println ( "Salary: " + salary );
}
}
public class Main {
public static void main ( String [] args ) {
// Tạo đối tượng Manager
Manager manager = new Manager ( "Alice Johnson" , 42 , 75000 );
manager . displayInfo (); // Hiển thị thông tin của Manager
}
}Employeeクラスは、名前や年齢などの基本情報を含む基本クラスです。Managerレイヤーは、 Employeeの派生クラスであり、 salary属性を追加します。Managerレイヤーは、キーワードextendsを使用してEmployeeクラスから継承します。 super(name, age)と呼ばれるManagerのコンストラクター; Employeeクラスから継承されたプロパティを初期化します。displayInfo()メソッドは、 Managerクラスに上書きされて給与に関する情報を追加し、基本情報を表示するためにベースクラスのdisplayInfo()メソッドを呼び出します。3。多型:多型は、同じインターフェイスを介して異なるクラスを使用できる能力です。この方法はベースレイヤーで定義でき、デリバティブクラスの同じ名前のメソッドに置き換えられ、特定のデータ型を知らずにオブジェクトを共通インターフェイスを介して処理できます。
Javaでは、多型は、メソッド(メソッドオーバーロード)のオーバーホッドのオーバーホッドの方法によって表されます。
class Animal {
void speak () {
System . out . println ( "Animal speaks" );
}
}
// Lớp Dog (chó) kế thừa lớp Animal (động vật)
class Dog extends Animal {
// Lớp Dog ghi đè phương thức speak() của lớp cha
@ Override
void speak () {
System . out . println ( "Dog barks" );
}
}
// Lớp Cat (mèo) kế thừa lớp Animal (động vật)
class Cat extends Animal {
// Lớp Dog ghi đè phương thức speak() của lớp cha
@ Override
void speak () {
System . out . println ( "Cat meows" );
}
}
public class Main {
public static void main ( String [] args ) {
Animal myAnimal = new Animal ();
Animal myDog = new Dog ();
Animal myCat = new Cat ();
myAnimal . speak (); // Prints "Animal speaks"
myDog . speak (); // Prints "Dog barks"
myCat . speak (); // Prints "Cat meows"
}
}この例では、 speak()メソッドはDogとCat層に上書きされます。子のオブジェクトでspeak()メソッドを呼び出すと、Javaは、参照変数が来るオブジェクトのタイプに応じて、実行時にどのメソッドが呼び出されるかを決定します。
class Printer {
// In chuỗi
void print ( String data ) {
System . out . println ( "String: " + data );
}
// In số nguyên
void print ( int data ) {
System . out . println ( "Integer: " + data );
}
// In số thực
void print ( double data ) {
System . out . println ( "Double: " + data );
}
}
public class Main {
public static void main ( String [] args ) {
Printer printer = new Printer ();
// Gọi phương thức print nạp chồng
printer . print ( "Hello, World!" );
printer . print ( 123 );
printer . print ( 98.76 );
}
}Printerクラスには、 print方法の3つのバージョンがあり、それぞれが特定のデータ型、 String 、 int 、およびdouble処理します。printメソッドを呼び出すたびに、Javaは送信引数のデータ型に基づいて適切なバージョンを決定します。多型は、インターフェイスを使用するメカニズムを通じて明確に表現されています。 Javaのインターフェイスは、より高い多型を実現する方法であり、レイヤーがさまざまなレイヤーで展開できる多くのインターフェイスとインターフェイスを展開できるようにします。
インターフェイスのCanFlyと2層BirdとAirplaneが両方ともこのインターフェイスを実装しているとします。
interface CanFly {
void fly ();
}
class Bird implements CanFly {
public void fly () {
System . out . println ( "The bird flaps its wings to fly." );
}
}
class Airplane implements CanFly {
public void fly () {
System . out . println ( "The airplane turns on its engines to fly." );
}
}
public class TestPolymorphism {
public static void main ( String [] args ) {
CanFly myBird = new Bird ();
CanFly myAirplane = new Airplane ();
myBird . fly (); // Output: The bird flaps its wings to fly.
myAirplane . fly (); // Output: The airplane turns on its engines to fly.
}
}CanFly 、身体を提供せずにfly()メソッドを定義します。BirdとAirplane両方が、独自の方法でfly()メソッドを展開します。myBirdとmyAirplaneオブジェクトの両方がインターフェイスCanFlyを介して参照され、 fly()メソッドを呼び出すと、多型により、オブジェクトのオブジェクトを気にしないようになります。私たちは彼らが飛ぶことができることだけを知っています。4。抽象化:要約により、プログラマーはオブジェクトがそれを行う方法を気にせずに行うことに集中することができます。デリバティブクラスが実装する一般的なインターフェイスを記述する基本クラスを作成し、システムの複雑さの管理を簡素化します。
Javaでは、2つの方法で要約を行うことができます。
抽象クラスは、作成できないオブジェクトであり、ボディなしで抽象的な方法を含めることができます。
abstract class Animal {
// Phương thức trừu tượng
abstract void makeSound ();
// Phương thức bình thường
void breathe () {
System . out . println ( "Breathing..." );
}
}
class Dog extends Animal {
// Triển khai phương thức trừu tượng trong lớp con
void makeSound () {
System . out . println ( "Bark" );
}
}
public class Main {
public static void main ( String [] args ) {
Animal myDog = new Dog ();
myDog . makeSound (); // In ra "Bark"
myDog . breathe (); // In ra "Breathing..."
}
}Animal 、抽象的なメソッドのmakeSound()を備えた抽象的な層です。Dog Animalの継承クラスであり、 makeSound()抽象的な方法に特定の展開を提供する必要があります。インターフェイス(インターフェイス)は、展開なしで抽象的なメソッドのみを含めることができます。
interface Vehicle {
void start ();
void stop ();
}
class Car implements Vehicle {
public void start () {
System . out . println ( "Car starting" );
}
public void stop () {
System . out . println ( "Car stopping" );
}
}
class Bike implements Vehicle {
public void start () {
System . out . println ( "Bike starting" );
}
public void stop () {
System . out . println ( "Bike stopping" );
}
}
public class Main {
public static void main ( String [] args ) {
Vehicle myCar = new Car ();
Vehicle myBike = new Bike ();
myCar . start (); // In ra "Car starting"
myCar . stop (); // In ra "Car stopping"
myBike . start (); // In ra "Bike starting"
myBike . stop (); // In ra "Bike stopping"
}
}ここでは、 Vehicleは2つの抽象的なメソッドを定義するインターフェイスです: start()とstop() 。 CarとBikeレイヤーはこのインターフェイスを展開し、各メソッドに特定の展開を提供します。
類似性:
違い:
| 抽象クラス | インタフェース | |
|---|---|---|
| 目的 | - サブクラスには多くの共通の機能があり、再利用できるコードを配置するための共通の場所が必要な場合によく使用されます。 - サブレイヤーの基本パターンを定義するのを手伝い、すべてのサブクラスがそれを継承して共通のデザインに従うようにしてください。 | - ケアなしで関数の契約を定義するためによく使用されます。 - 非常に異なる実装できる機能に最適です。 - クラスが実行できる収集方法の定義に適しています。 |
| 展開 | - 抽象的なメソッド(ボディなし)と非アブストラクトメソッド(ボディ付き)の両方を含めることができます。 - 要約クラスには、データフィールドとコンストラクターも含まれます。 | - 最初は、ボディのない抽象的なメソッドの定義のみを許可します。 -Java 8以降、インターフェイスは、デフォルトの方法と静的メソッドを介してボディメソッドの定義も許可します。 |
| マルチヒル | - クラスは、単一の抽象レイヤーからのみ継承できます。 - これにより、インターフェイスのように、多目的の柔軟性が制限されます。 | -Javaを使用すると、レイヤーが複数のインターフェイスを同時に実行し、マルチインヒャー型フォームを提供できます。 |
| 顎 | - 制約があり、クラスの初期条件を設定するのに役立ちます。 | - コンストラクターはありません。 |
| データフィールド | - インターフェイスとは異なり、抽象クラスにはstatics and finalではないデータフィールドがあります。 - サブレイヤーには、抽象レイヤーから継承された個別の属性がある場合があります。 | - インターフェイスがデータフィールドが静的で最終的ではないことをサポートしていません。 - インターフェイスで宣言されたすべての変数は、パブリックスタティックファイナルと自動的に見なされます。 |
オブジェクト指向のプログラミングは、ソフトウェア開発に多くの優れた利点をもたらし、情報技術業界の主要な設計およびプログラミングモデルの1つになります。これがそれの利点です:
コードの再利用:OOPを使用すると、プログラマーは継承メカニズムを介してソースコードを再利用できます。子供の層は、そのコードを書き換えることなく、父親のクラスから機能を継承できます。これにより、プログラミングの作業を削減し、潜在的なエラーを最小限に抑え、ソフトウェア開発をスピードアップできます。
エラーの維持と修正が簡単:OOPのパッケージ構造は、展開の詳細を隠すのに役立ち、ユーザーに必要なインターフェイス(インターフェイス)のみを提供します。これにより、オブジェクト内の変更が他のオブジェクトに影響を与えないため、システムのメンテナンスと更新が容易になります。
実用的なモデリング:OOPを使用すると、プログラミングはソフトウェアオブジェクトの形で実際のエンティティをモデル化し、ソースコードの理解と管理を容易にします。現実の世界でデータや動作を実行するなどのオブジェクトを使用することで、ソフトウェアを開発して、プログラマーにより直感的かつ近くなるようになります。
拡張:継承して梱包する能力のおかげで、OOPは簡単に拡張できます。これらの層に影響を与えることなく存在する1つ以上のレイヤーからの継承を使用して、新しい層を作成できます。これにより、システムが柔軟に成長し、新しいニーズに迅速に適応するのに役立ちます。
セキュリティ:パッケージングは、実装の詳細を隠すのに役立つだけでなく、セキュリティレイヤーも提供します。オブジェクト内のデータは、外部の直接アクセスから保護されており、データの整合性と安全性を確保します。
Javaは、もっともらしい理由でオブジェクト指向のプログラミングを教えるために使用される最も人気のあるプログラミング言語の1つです。
Javaは純粋なオブジェクト指向の言語です。つまり、Javaのすべてがオブジェクトまたはクラスです。継承、包装、多型、抽象などの概念は、言語に完全に組み込まれています。これにより、学習者はプログラミング中に自然にOOPの原則に簡単にアクセスして実践できます。
Javaには、明確で簡単な構文を理解しています。 Javaの構文はC/C ++に基づいていますが、Direct Cursorなどの複雑な機能を削除しているため、初心者に教えるのに理想的な言語です。これらの複雑な機能を排除することで、学習者は、混乱する詳細に迷い込まれることなく、OOPのコア概念を理解することに集中するのに役立ちます。
Javaは独立した言語財団であり、Java(JVM)仮想マシンを使用して任意のオペレーティングシステムで実行できます。これは、Javaプログラムがコードを変更せずに異なるプラットフォームで一貫して開発および実装できることを意味します。この柔軟性は、学生や教師がさまざまなハードウェアやソフトウェアを使用できる学習環境に最適です。
このアーカイブを学習に使用している間、以下に説明するアレンジメントの原則に従う必要があります。上から下へのルールに従ってアイテムを読むと、最初の部分が次のコンテンツの基礎となります。特に付録については、いつでも参照できますが、このアーカイブの設計に使用する本がいくつか含まれています。
同期して制御しやすくするために、メインレイヤーには、レッスンコンテンツと同じようにコードを実行する主な方法が含まれています。説明するレッスンの他のクラス。たとえば、インターフェイスに関するレッスンには
Interface.javaがあります。Javaにはクラスがあります:Movable、Trackable、Drone、Interface、Movable、Trackable、Droneクラスは、レッスン知識の解釈の効果があり、Interfaceクラスは以前のクラスからコードを実行する効果があります。
このアイテムは、私のストレージとほぼ同じ順序です:Java言語で書かれていることを除いて、 C/C ++を使用したデータ構造とアルゴリズム。 2つの言語にはいくつかの違いがあります。読者は自分で比較できます。
Javaはプログラミング言語と翻訳の両方です(および解釈されます。Javaでは、ソースコードはBytecodeに変換されます。これは、コンピューターのコンピューターコードのように機能する単純なバイナリインジケーターです。ただし、CまたはC ++とは異なり、Javaのバイトコードは特定のプロセッサのネイティブマシンコードではなく、JVA(JVM)の仮想マシンのためのネイティブマシンコードです。
このバイトコードは、Java仮想マシンによって翻訳および実行され、まるでネイティブマシンコードであるかのように実行されました。 JVMは、メモリコマンドと処理コマンドの管理においてアクティブなオペレーティングシステムのように機能し、コードの安全性とモバイルを確保します。 Java言語のすべての特性は、基本システムの特定のシステムに関係なく明確に定義されているため、Javaはコード編集なしで多くの異なるプラットフォームで均一に実行できるようになります。
JVMは、オペレーティングシステムと同様の機能を実行する安全な執行環境を提供します。メモリを管理し、スタックに基づいてコマンドを実行し、水の種類を処理します。これにより、セキュリティのリスクが最小限に抑えられ、アプリケーションの安定性が向上します。
構文の観点からCとC ++に似ているかどうかにかかわらず、JavaはCの直接的な子孫でも、C ++の次のバージョンではありません。 Javaは、CではなくSmallTalkやLispなどの動的言語と共通点があります。多くのブレースやセミコロンを使用するなど、外部の構文でのみ類似性が止まります。 Javaは、コンパクトで覚えやすいが、Javaクラスパッケージを介して語彙を拡張する必要がある優れた言語のCの哲学を継承しています。
Perl、Python、Rubyなどのスクリプト言語は、安全でネットワーク化されたアプリケーションに適しているため、非常に人気があります。ただし、ほとんどのスクリプト言語は、深刻な大規模なプログラミング用に設計されていません。多くの場合、プログラムの構造と単純なデータシステムが緩んでいるため、大規模または複雑なプロジェクトには適していません。
Javaは、より高いレベルのフレームワークや他の言語を開発するための安全なプラットフォームを提供し、アプリケーションの迅速かつ簡単な開発を可能にするJavaのシンプルさと機能を組み合わせています。 Javaはまた、SmallTalkの機能から学び、特にバイトコードテストセットを使用してキャンペーンコードの正確性を確保し、SmallTalkよりもパフォーマンスを改善し、安全を確保するのに役立ちます。
Javaは、ソフトウェアエラーだけでなく、設計とプログラミングの一般的な問題に対しても、安全な言語になるように設計されています。 Javaは、クラスローダーのロード方法、Java解釈のバイトコード負荷メカニズムまで実行する前に、コードの安全性テストから多くの保護層を提供し、信頼できないクラスの周りに「壁」を作成します。これらの機能は、高レベルのセキュリティポリシーの基盤であり、各アプリケーションでさまざまなタイプのアクティビティを許可するか、許可しません。
Javaは「白いボード」から始まるため、他の言語の複雑または物議を醸す機能を回避できます。たとえば、Javaでは、プログラマーがオペレーター( + Hayなど)を再生することを許可していません。マクロや#defineステートメントのようなお金を処理することはできません。
Javaはまた、クラスファイルを整理するための明確なパッケージ構造を提供し、コンピレーションプロセスが従来のMake -Madeツールのいくつかの機能を効果的に処理するのに役立ちます。すべてのデータ型情報は、C/C ++のように過剰なソースタイトルファイルを必要とせずに、コンパイルされたJavaクラスに保存されています。これにより、Javaコードが読みやすくなり、コンテキストが少なくなります。
Javaは継承のみをサポートしています(各クラスには「父」クラスが1つしかありません)が、多くのインターフェイスの継承を許可します。 Javaのインターフェイスは、C ++の抽象レイヤーと同様に、実行を防御せずにオブジェクトの動作を識別します。これは、開発者が特定のオブジェクトの実行に個別に参照できるオブジェクトの動作の「契約」を定義できる強力なメカニズムです。
Javaは、あらゆるメモリ領域を参照し、自動的にゴミ収集と高レベルセグメントを追加できるカーソルの使用を排除します。これらの機能は、他の言語がしばしば遭遇する安全性、変換、最適化に関連する多くの問題を排除するのに役立ちます。 Javaでは、使用されていない被験者が自動的にメモリを回復し、マニュアルメモリ管理エラーを最小限に抑えます。
Javaは従来のカーソルを使用していませんが、代わりによりタイトで安全な参照です。原始タイプを除くJavaの被験者は、参照からアクセスされます。これにより、C/C ++のカーソルに関連するリスクなしに、データ型に複雑なデータ構造を安全に構築できます。
Javaは、強力な例外管理メカニズムのおかげで、スマートで効果的な方法でエラーを処理するように設計されています。 Javaでは、エラーは「キャッチ」コードブロックを介してプログラムの特定の場所でキャプチャおよび処理されるだけでなく、例外にも詰め込まれています。これらの各オブジェクトは、エラーの原因に関する情報をもたらし、プログラマーがエラーを正しく理解して処理しやすくすることができます。 Javaの翻訳では、それが発生する可能性のある例外を宣言する方法、またはそれらをすぐに処理する方法が必要です。これにより、リターンデータ型やメソッドの方法など、他の情報と同じレベルにエラー情報をもたらすことができます。それにより、プログラミングの場合、可能な状況を予測および準備し、アプリケーションがより安定して安全に動作するようにします。
ソフトウェアのプログラミングと開発では、命名規則は、ソースコードで変数、ジョー、クラス、その他のオブジェクトの名前を選択するためのルールのコレクションです。識別条約により、ソースコードの読み取りが簡単で、理解しやすく、メンテナンスが容易になります。私のストレージは、以下に言及したこの条約に厳密に準拠しています。
クラス:クラス名は常に文字が印刷されてから始まります(Pascalcase)。クラス名が多くの単語で構成されている場合、各単語も花柄から始める必要があります。例: Student 、 Car 、 ColorChooser 。
インターフェイス:クラスと同様に、インターフェイスの名前はPascalcaseも使用します。多くの場合、インターフェイス名はIような大文字で始まるか、 RunnableでAccessibleなどの機能を説明するためにableやibleのようなダム/サフィックスを使用します。
メソッドのメソッドは常に通常の文字で始まり、CamelCaseに従います。メソッド名は通常、メソッドが実行するアクションを説明する動詞または動詞フレーズです。例: getName() 、 calculateTotalWidth() 。
変数名も通常の文字から始まり、その後にcamelcaseが続く必要があります。変数名は明確であり、それらが表す値を説明する必要があります。例: height 、 numberOfStudents 。
Dogクラスの例:
package com . example . animals ;
/**
* A generic Dog class that can be used as a base class for specific breeds.
*/
public class Dog {
private String name ;
private int age ;
/**
* Constructor for Dog class.
*
* @param name The name of the dog.
* @param age The age of the dog.
*/
public Dog ( String name , int age ) {
this . name = name ;
this . age = age ;
}
/**
* Returns the name of the dog.
*
* @return The name of the dog.
*/
public String getName () {
return name ;
}
/**
* Sets the name of the dog.
*
* @param name New name for the dog.
*/
public void setName ( String name ) {
this . name = name ;
}
/**
* Returns the age of the dog.
*
* @return The age of the dog.
*/
public int getAge () {
return age ;
}
/**
* Sets the age of the dog.
*
* @param age New age for the dog.
*/
public void setAge ( int age ) {
this . age = age ;
}
/**
* Provides a string representation of the dog.
*
* @return A string describing the dog's details.
*/
@ Override
public String toString () {
return "Dog[name=" + name + ", age=" + age + "]" ;
}
}| アクセス適応 | 公共 | 保護されています | デフォルト | プライベート | |
|---|---|---|---|---|---|
| パッケージとともに | クラス内 | 持っている | 持っている | 持っている | 持っている |
| サブクラス | 持っている | 持っている | 持っている | そうではありません | |
| その他のクラス | 持っている | 持っている | 持っている | そうではありません | |
| 別のパッケージ | サブクラス | 持っている | 持っている | そうではありません | そうではありません |
| その他のクラス | 持っている | そうではありません | そうではありません | そうではありません | |
Unified Modeling Language(UML)は、アプリケーションソフトウェアのさまざまな側面についてスケッチ、説明、文書を作成するように設計された標準的なグラフィックモデリングツールです。オブジェクト指向のプログラミングの分野で特に役立ちます。これは、クラス、オブジェクト、およびそれらの間の関係を表示する直感的な方法を提供するためです。 UMLにはさまざまなタイプの図が含まれていますが、オブジェクト指向プログラミングのコンテキストでは、クラス図(クラス図)とインタラクティブ図(相互作用図)が最も一般的に使用される2つのタイプです。
UMLを使用すると、プログラマーはクラス図を使用してシステムの構造を説明できます。この図は、システム、属性、その方法、そして最も重要なことには、継承、リンケージ、合成、組み合わせなどのクラス間の関係を示しています。これにより、プログラマーはシステムをより体系的に理解および設計するのに役立ちます。
UML図が完成したら、ソースコードを作成するための基礎として使用できます。 OOPでは、レイヤー図からソースコード(通常はJava、C#、またはC ++)への転送は、これらのプログラミング言語のUMLで説明されている概念とレイヤー構造の類似性のため、非常に直接的です。
UMLは、オブジェクト間の関係を明確に定義し、シーケンス図(シーケンス図)とコラボレーション図(コラボレーション図)を介した通信と相互作用の方法を強調します。これにより、プログラマーはアプリケーションのデータフローと制御を理解するのに役立ちます。
コードの作成を開始する前に、UMLは開発グループが設計上の問題を検出および修正できるように支援します。 UMLの使用における団結は、グループのメンバーがお互いのアイデアを簡単に理解し、それによって作業調整の効率を高めるのにも役立ちます。
UMLは、ソフトウェアの完全なドキュメントを提供します。これは、メンテナンスおよびソフトウェアのアップグレード段階で非常に役立ちます。優れたUML図は、プロジェクトに参加している新しい人々がシステムの構造と機能をすばやくキャプチャするのに役立ちます。
クラス図(クラス図)は、UMLで使用される図のタイプの1つであり、ソフトウェアシステムのモデル化に重要な役割を果たしています。クラス図は、システムレイヤー、属性と方法、およびそれらのレイヤー間の関係を表示することにより、アプリケーションの構造の概要を提供します。これらの関係には、リンク(協会)、相続(継承)、執行(実現)、依存関係、アググリス、構成が含まれる場合があります。
クラスは、ステータス(属性)と動作(方法)を含む概念を表します。各属性には1つのタイプがあります。各メソッドには署名があります。クラス名は唯一の強制情報です。
次の例を考えてみましょう。

このUML図は、次のようにコード内のクラスAnimalに対応しています。
public class Animal {
// Các thuộc tính của lớp
public String name ; // Biến thành viên công khai cho tên
private int age ; // Biến thành viên riêng tư cho tuổi
private String species ; // Biến thành viên riêng tư cho loài
// Phương thức getter cho thuộc tính name
public String getName () {
return name ;
}
// Phương thức setter cho thuộc tính name
public void setName ( String name ) {
this . name = name ;
}
}レイヤー内のシンボル+ 、および- 、 # 、および#、およびメソッド名は、属性とメソッドのアクセス容量のレベルを示します。具体的には:
+ 、パブリックの属性または方法を示します(公開)。-プロパティまたはプライバシー方法を示す(プライベート)。#は、プロパティまたは保護方法(保護)を示します。
fly()メソッドを使用してインターフェイスFlyableがある場合、 Birdクラスはfly()メソッドを展開してこのインターフェイスを実行できます。SchoolクラスにはTeacherクラスの多くのオブジェクトがあるかもしれませんが、教師はまだ学校とは独立して存在しています。House層には、 Roomの多くのオブジェクトが含まれている場合があります。 Houseがキャンセルされると、 Roomもキャンセルされます。| 継承 | 集める | |
|---|---|---|
| 定義する | - 継承は、1つの層(サブ層と呼ばれる)が別の層(親クラスと呼ばれる)の性質と方法を継承できるメカニズムです。 - サブディビジョンが書き換えずに父親のコードを再利用できるようにします。 - 「IS-A」の関係に対応します。 | - 要素は、2つのレイヤー間の「そこ」の関係の形式です。 - オブジェクトが他のオブジェクトを含むか参照できる関係を示しますが、2つの被験者は独立して存在する場合があります。 - 「has-a」関係に対応します。 |
| 目的 | - コードを再利用して、アプリケーションのモジュールを改善します。 - また、多型をサポートし、子供の方法を親クラスの方法を上書きまたは拡張できるようにします。 - たとえば、動物のクラスには動き()の方法があり、鳥と魚のクラスは動物の使用またはオーバーライドMOVE()メソッドを継承して、動く性質に合わせます。 | - オブジェクト間の関係を表し、オブジェクトが互いに部分的な関係を持っているが、互いに完全に依存していない場合があります。 - データ構造の柔軟性を高め、複雑なオブジェクトを管理します。 - たとえば、正方形の層には点層のオブジェクトがある場合があります。各正方形は、ポイントレイヤーの4つのオブジェクト(頂点を示す)で構成されていますが、ポイントは正方形のピークなしで独立して存在する場合があります。 |
| 依存 | - サブクラスは、父親の特性と方法を直接使用するため、父親のクラスに強く依存します。 | - 関連する被験者は独立して存在する場合があります。それらは強く依存していません。 |
| 能力 | - 父親の層を展開またはカスタマイズします。 - 分散型の関係のモデリング。 | - 関連するオブジェクトを管理します。 - 物理的な関係のモデリング。 |
次の例を考えてみましょう。

JavaにこのUML図を展開するのは次のとおりです。
public class Person {
private String name ;
private int age ;
private Address address ; // Liên kết sử dụng lớp Address
public Person ( String name , int age , Address address ) {
this . name = name ;
this . age = age ;
this . address = address ;
}
// Getter và Setter cho các thuộc tính
public String getName () {
return name ;
}
public void setName ( String name ) {
this . name = name ;
}
public int getAge () {
return age ;
}
public void setAge ( int age ) {
this . age = age ;
}
public Address getAddress () {
return address ;
}
public void setAddress ( Address address ) {
this . address = address ;
}
}
// Định nghĩa lớp Student kế thừa từ Person
public class Student extends Person {
public Student ( String name , int age , Address address ) {
super ( name , age , address );
}
}
// Định nghĩa lớp Teacher kế thừa từ Person
public class Teacher extends Person {
public Teacher ( String name , int age , Address address ) {
super ( name , age , address );
}
}
// Định nghĩa lớp Staff kế thừa từ Person
public class Staff extends Person {
public Staff ( String name , int age , Address address ) {
super ( name , age , address );
}
}
// Định nghĩa lớp Address
public class Address {
private String street ;
private String city ;
private String country ;
public Address ( String street , String city , String country ) {
this . street = street ;
this . city = city ;
this . country = country ;
}
// Getter và Setter cho các thuộc tính
public String getStreet () {
return street ;
}
public void setStreet ( String street ) {
this . street = street ;
}
public String getCity () {
return city ;
}
public void setCity ( String city ) {
this . city = city ;
}
public String getCountry () {
return country ;
}
public void setCountry ( String country ) {
this . country = country ;
}
}
// Định nghĩa lớp Department chứa Teacher và Course
public class Department {
private String name ;
private List < Teacher > teachers ; // Aggregation
private List < Course > courses ; // Composition
public Department ( String name ) {
this . name = name ;
this . teachers = new ArrayList <>();
this . courses = new ArrayList <>();
}
// Phương thức thêm giáo viên và khóa học
public void addTeacher ( Teacher teacher ) {
teachers . add ( teacher );
}
public void addCourse ( Course course ) {
courses . add ( course );
}
}
// Định nghĩa lớp Course
public class Course {
private String courseName ;
private List < Teacher > teachers ; // Association
public Course ( String courseName ) {
this . courseName = courseName ;
this . teachers = new ArrayList <>();
}
public void addTeacher ( Teacher teacher ) {
teachers . add ( teacher );
}
}
// Định nghĩa interface Maintainable
public interface Maintainable {
void maintain ();
}
// Định nghĩa lớp School
public class School implements Maintainable {
private String name ;
private List < Department > departments ; // Composition
public School ( String name ) {
this . name = name ;
this . departments = new ArrayList <>();
}
public void addDepartment ( Department department ) {
departments . add ( department );
}
// Triển khai phương thức từ interface Maintainable
@ Override
public void maintain () {
System . out . println ( "Maintaining the school facilities..." );
// Logic bảo trì cơ sở vật chất có thể được thực hiện ở đây
}
}