目次
1. オブジェクト指向の予備的な理解
1. オブジェクト指向とは
Java は純粋なオブジェクト指向言語 (オブジェクト指向プログラム、略して OOP) であり、オブジェクト指向の世界ではすべてがオブジェクトです。オブジェクト指向は問題を解決するための考え方であり、主にオブジェクト間の相互作用に依存して 1 つのことを完了します。オブジェクト指向の考え方を使用してプログラムを扱うことは、人々の物事の理解により一致しており、大規模なプログラムの設計、拡張、保守に非常に適しています。
2. オブジェクト指向とプロセス指向
(1) 伝統的な洗い加工
従来の洗濯は衣類を洗うという工程に重点が置かれており、一つのリンクが欠けると機能しなくなるだけでなく、衣類ごとに洗い方や時間、絞り方が異なるため、対応が面倒でした。将来靴を洗うつもりなら、それも別の方法です。この方法でコードを記述すると、将来の拡張や保守がより困難になります。
(2) 現代の洗濯プロセス
オブジェクトは人、衣服、洗濯物、洗濯機の合計 4 つです。
衣類を洗濯する全プロセスは、衣類を洗濯機に放り込み、洗濯物を追加して洗濯機を起動し、洗濯機が洗濯プロセスを完了して衣類を乾燥させます。
すべてのプロセスは主に、人、衣類、洗剤、洗濯機の 4 つのオブジェクトの相互作用によって完了するため、人は洗濯機がどのように衣類を洗い、どのように乾燥させるかを気にする必要はありません。
オブジェクト指向の処理では、衣類を洗うというプロセスに焦点を当てず、ユーザーは洗濯機がどのように洗濯し、どのように乾燥させるかを気にする必要がなく、洗濯機に衣類を入れて注ぐだけで済みます。洗剤を入れてスイッチを入れる、つまり物体同士の相互作用によって行われます。
知らせ:
プロセス指向とオブジェクト指向は言語ではなく、問題を解決する方法であり、どちらが良いとか悪いというわけではなく、それぞれに特有の適用シナリオがあります。
2. クラスの定義と使用
1. クラス定義形式
クラス クラス名{
クラス属性 (メンバー変数)。
クラスの動作 (メンバーメソッド)。
}
クラスに含まれるコンテンツは、クラスのメンバーと呼ばれます。属性は主にクラスを記述するために使用され、クラスのメンバー属性またはクラス メンバー変数と呼ばれます。メソッドとは主にクラスがどのような機能を持っているかを記述したもので、クラスのメンバメソッドと呼ばれます。
例:
class WashMachine { //属性 public String brand;//品牌 public String type;//型号 public double weight;//重量 //行为 public void washClothes() { //洗衣服 System.out.println("洗衣功能"); } }
クラス名はキャメルケースで定義されていることに注意してください。
注:
1. 通常、ファイル内で定義されるクラスは 1 つだけです
2. main メソッドが配置されているクラスは、通常、public で装飾されている必要があります (注: Eclipse は、デフォルトで public に変更されたクラスで main メソッドを見つけます)。
3. public-modified クラスは、ファイル名と同じであること
4. public-modified クラスの名前は安易に変更せず、変更する場合は開発ツールで変更してください。
3. クラスのインスタンス化
1. インスタンス化とは何ですか?
クラスの定義は、int や double と同様に、コンピューターで新しい型を定義することと同じですが、int と double は Java 言語に付属の組み込み型であるのに対し、クラスはユーザーによって定義された新しい型である点が異なります。上記のような: PetDog クラスと Student クラス。これらはすべてクラス (新しく定義されたタイプ) であり、これらのカスタム タイプでは、これらのクラスを使用してインスタンス (またはオブジェクト) を定義できます。
クラス型を使用してオブジェクトを作成するプロセスはクラスのインスタンス化と呼ばれます。Java では、new キーワードを使用してクラス名でオブジェクトをインスタンス化します。例:
class PetDog { public String name;//姓名 public String color;//颜色 public void wag() { System.out.println("摇尾巴"); } public void braks() { System.out.println("汪汪汪"); } public void print() { System.out.println(this.name); System.out.println(this.color); } }
public class TestDemo { public static void main(String[] args) { PetDog petdog1 = new PetDog(); PetDog petdog2 = new PetDog(); petdog1.name = "阿黄"; petdog1.color = "黄色"; petdog1.wag(); petdog1.braks(); petdog1.print(); petdog2.name = "阿黑"; petdog2.color = "黑色"; petdog2.wag(); petdog2.braks(); petdog2.print(); } }
出力結果:
注:
new キーワードは、オブジェクトのインスタンスを作成するために使用されます。
オブジェクト内のプロパティとメソッドにアクセスするには、. を使用します。
同じクラスで 2 つのインスタンスを作成できます。
2. クラスとオブジェクトの説明
1. クラスは、エンティティを記述し、クラスのメンバーを制限するために使用される単なるモデルのようなものです
2. クラスは、変数を定義するために使用できるカスタム型です
3. クラスは複数のインスタンスを作成できますオブジェクトの場合、インスタンス化されたオブジェクトは実際の物理空間を占有し、クラス メンバー変数を格納します
。クラスからオブジェクトをインスタンス化することは、実際に家を建てるために建築設計図を使用することに似ています。クラスは設計図のようなものです。必要なものだけを設計しますが、物理的な建物はありません。同様に、クラスは単なる設計です。オブジェクトは実際にデータを保存し、物理スペースを占有することができます。
4.本製品の利用について
1. これを使用する理由
まず次の例を見てみましょう。
日付クラスを書く
出力結果
setDateの仮パラメータ名をtimeメンバ変数と同じに変更した場合、出力結果はどうなるでしょうか?
全て0になります
理由:
仮パラメータ名をメンバー変数 name と同じになるように変更すると、ここでの仮パラメータ名の値は予期した値と異なります。
1 つは渡される実パラメータ、もう 1 つはメンバー変数です。ただし、クラスではローカル変数が優先されるという原則に従います。ここでのパラメータはメンバー変数を表します。以下の値を代入する場合、仮パラメータはint 型には値が割り当てられておらず、デフォルト値は 0 であるため、すべての 0 が出力されます。
解決:
図に示すように:
出力結果:
2. このリファレンスは何ですか?
この参照は、現在のオブジェクト (メンバー メソッドの実行時にメンバー メソッドを呼び出すオブジェクト) を指します。メンバー メソッド内のすべてのメンバー変数操作は、この参照を通じてアクセスされます。すべての操作がユーザーに対して透過的であるというだけです。つまり、ユーザーが操作を渡す必要はなく、コンパイラーが自動的に操作を完了します。
注:これは、メンバー メソッドが呼び出されるオブジェクトを指します。
3. この文献の特徴
1. this の型: クラス型参照に対応します。つまり、呼び出されるオブジェクトがそのオブジェクトの参照型です。 2.
this は「メンバー メソッド」でのみ使用できます。
3. 「メンバー メソッド」では、これは、現在のオブジェクトのみを参照できます。現在のオブジェクトではありません。その後、他のオブジェクトを参照します。
4. これは、「メンバー メソッド」の最初の隠しパラメータであり、コンパイラは自動的にそれを渡します。メンバー メソッドが実行されると、コンパイラは、呼び出し元のメンバー メソッド オブジェクトの参照をメンバー メソッドに渡す責任を負い、コンパイラーはそれを受け取る責任があります。
コードレベルでの簡単なデモ --->注: 下の図の右側にある Date クラスもコンパイルできます。
5. オブジェクトの構築と初期化
1. オブジェクトの初期化方法
これまでの知識ポイントから、Java メソッド内でローカル変数を定義する場合は初期化する必要があり、初期化しないとコンパイルが失敗することがわかりました。
上記のコードをコンパイルする方法は非常に簡単で、正式に使用する前に a の初期値を設定するだけです。
オブジェクトの場合:
特定の日付をオブジェクトに設定するには、前に記述した SetDate メソッドを呼び出す必要があります。
上記の例から、1. オブジェクトを作成するたびに SetDate メソッドを呼び出して特定の日付を設定するのが面倒、オブジェクトをどのように初期化すればよいか、という 2 つの問題点が見つかりました。
2. ローカル変数は使用する前に初期化する必要がありますが、フィールドが宣言された後も値を指定せずに使用できるのはなぜですか?
2. 施工方法
(1) コンセプト
コンストラクター メソッド (コンストラクターとも呼ばれます) は、名前がクラス名と同じである必要がある特別なメンバー メソッドです。オブジェクトの作成時にコンパイラによって自動的に呼び出され、オブジェクトのライフ サイクル全体で 1 回だけ呼び出されます。
(2) 特徴
1. 名前はクラス名と同じである必要があります。
2. 戻り値の型がないため、void に設定しても機能しません。
3. オブジェクトの作成時にコンパイラによって自動的に呼び出され、オブジェクト作成中に 1 回だけ呼び出されます。オブジェクトのライフサイクル (人の誕生に相当、各人は一度しか生まれません)
4. コンストラクターはオーバーロード可能です (ユーザーは自分のニーズに応じて異なるパラメーターをコンストラクターに提供します)5. ユーザーが明示的に定義しない場合、コンパイラはデフォルト コンストラクタを生成します。生成されたデフォルト コンストラクタにはパラメータを含めることはできません。
上記の Date クラスではコンストラクターが定義されていないため、コンパイラーはデフォルトでパラメーターなしのコンストラクターを生成します。
注:ユーザーによって定義されると、コンパイラによって生成されることはありません。(貧しい人ではなく、緊急事態を救ってください)
6. コンストラクターでは、これを通じて他のコンストラクターを呼び出してコードを簡素化できます。
注:
①.this(...) はコンストラクターの最初のステートメントでなければなりません
②.循環を形成することはできません7. ほとんどの場合、変更には public が使用されますが、特殊な状況では、private によって変更されます。
3. デフォルトの初期化
上で挙げた 2 番目の疑問: ローカル変数は使用時に初期化する必要があるのに、メンバー変数は初期化する必要がないのはなぜですか?
このプロセスを理解するには、新しいキーワードの背後で何が起こっているのかをいくつか知る必要があります。
これはプログラム レベルでは単純なステートメントですが、JVM レベルでは多くのことを行う必要があります。簡単に説明します: 1. オブジェクトに対応するクラスがロードされているかどうかを確認し、ロードされていない場合はロードし
ます
。オブジェクトにメモリ空間を割り当てる3. 同時実行の安全性を処理する 問題: たとえば: 複数のスレッドがオブジェクトに同時に適用される JVM は、オブジェクトに割り当てられた空間が競合しないことを確認する必要がある 4. 割り当てられた空間を
初期化するつまり、オブジェクト空間が適用された後、オブジェクトに含まれるメンバーは、次のような初期値をすでに設定しています。5. オブジェクトのヘッダー情報を設定します。
6. コンストラクターメソッドを呼び出し、オブジェクトの各メンバーに値を割り当てます
4. インプレース初期化
メンバ変数を宣言する場合は、初期値を直接与えます。
注: コードがコンパイルされた後、コンパイラーはメンバー初期化のためのこれらすべてのステートメントを各コンストラクターに追加します。
6. 包装
1. パッケージングの考え方
オブジェクト指向プログラムには、カプセル化、継承、ポリモーフィズムという3つの主要な特徴があります。クラスとオブジェクトの段階では、主にカプセル化の特性が研究されます。カプセル化とは何ですか? 簡単に言うと砲弾のシールドの詳細です。例: コンピューターのような複雑なデバイスの場合、ユーザーに提供されるのはオン/オフ、キーボード、ディスプレイ、USB ジャックなどを介した入力だけであり、ユーザーはコンピューターを操作して日常のタスクを完了できます。 。しかし実際には、コンピュータが実際に動作しているのは、CPU、グラフィックス カード、メモリ、その他のハードウェア コンポーネントです。
コンピュータ ユーザーは、マザーボード上の回路がどのようにレイアウトされているか、CPU がどのように設計されているかなど、内部コア コンポーネントについて心配する必要はありません。ユーザーは、コンピュータの電源を入れる方法と、その方法を知るだけで済みます。キーボードとマウスを介してコンピュータと対話します。そのため、コンピューター製造業者は工場から出荷されるとき、内部実装の詳細を隠すために外側にシェルを置き、ユーザーがコンピューターを操作できるように電源スイッチ、マウス、キーボード ジャックのみを外側に提供します。
カプセル化: データとデータを操作するメソッドを有機的に組み合わせ、オブジェクトのプロパティと実装の詳細を非表示にし、オブジェクトと対話するインターフェイスのみを公開します。
2. アクセス修飾子
カプセル化は主にクラスとアクセス権を通じて Java で実現されます。クラスはデータとデータをカプセル化するメソッドを組み合わせることができ、これは人間の理解により一致しますが、アクセス権はメソッドやフィールドを外部で直接使用できるかどうかを制御するために使用されます。クラスです。Java では次の 4 つのアクセス修飾子が提供されます。
例:
public: 誰もが見ることができるその人の外見の特徴として理解できます。default
: (同じパッケージ内の) 自分の家族には秘密ではありませんが、他の人には秘密です。private
: 1 人だけです。知っている、他の人も知っている、全く知らない
[説明]
protected は主に継承で使用されます。
デフォルトのアクセス許可は、何も書き込まれていないときのデフォルトのアクセス許可を指します。
アクセス許可は、クラス内のメンバーの可視性を制限するだけでなく、クラスの可視性を制御することもできます。
3. パッケージ拡張パッケージ
(1) パッケージのコンセプト
オブジェクト指向システムでは、ソフトウェア パッケージの概念が提案されています。つまり、クラスをより適切に管理するために、複数のクラスがソフトウェア パッケージと呼ばれる 1 つのグループにまとめられます。ディレクトリに似ています。例: コンピューター上の曲をより適切に管理するには、同じ属性を持つ曲を同じファイルに配置するか、特定のフォルダー内の音楽をより詳細に分類することもできます。
パッケージは Java にも導入されています。パッケージは、クラス、インターフェイスなどのカプセル化メカニズムを具体化したもので、クラスやインターフェイスを編成するための良い方法です。たとえば、1 つのパッケージ内のクラスはクラスによって使用される必要はありません。他のパッケージでも使用します。パッケージも重要な役割を果たします。同じ名前のクラスは、異なるパッケージ内にある限り、同じプロジェクト内に存在することが許可されます。
(2) パッケージ内のクラスをインポートする
Java には、使用できる既製のクラスが多数用意されています。たとえば、Date クラス: java.util.Date を使用して、java.util パッケージに Date クラスをインポートできます。
ただし、この書き方は面倒なので、import 文を使ってパッケージをインポートすることもできます。
java.util で他のクラスを使用する必要がある場合は、 import java.util.* を使用できます。
ただし、インポートするクラス名を明示的に指定することをお勧めします。そうしないと、依然として競合が発生する可能性があります。
この場合、完全なクラス名を使用する必要があります。
import static を使用して、パッケージ内の静的メソッドとフィールドをインポートできます。
予防:
import と C++ の #include には大きな違いがあり、C++ では他のファイルの内容を導入するために #include が必要ですが、Java ではその必要がありません。
import はコードを書くときに便利にするためのものです。import は C++ の名前空間に似ており、
(3) カスタマイズされたパッケージ
基本ルール
① コードがどのパッケージに含まれるかを指定するために、ファイルの先頭に package ステートメントを追加します。
② パッケージ名は、通常、会社のドメイン名の逆形式を使用して、できるだけ一意に指定する必要があります (例: com) .bit.demo1). ③パッケージ名はコード パスと一致する必要があります。
たとえば、com.bit.demo1 のパッケージを作成した場合、コードを保存するための対応するパス com/bit/demo1 が存在します。
package ステートメントがない場合、クラスはデフォルトのパッケージに配置されます。
操作手順
① まずIDEAで新しいパッケージを作成します。srcを右クリック→新規→パッケージ②ポップアップダイアログボックスにパッケージ名を入力します(例:com.bit.demo1)。
③パッケージ内にクラスを作成し、パッケージ名を右クリック→新規→クラスを選択し、クラス名を入力します。
④この時点で、ディスク上のディレクトリ構造がIDEAによって自動的に作成されたことがわかります。
⑤同時に、新しく作成された Test.java ファイルの先頭に package ステートメントが表示されていることも確認できました。
(4) パッケージのアクセス権制御の例
Computer クラスは com.bit.demo1 パッケージにあり、TestComputer は com.bit.demo2 パッケージにあります。
(5) 共通パッケージ
1. java.lang: システム内でよく使われる基本クラス(String、Object) JDK1.1以降から自動インポートされるパッケージです。
2. java.lang.reflect:Java リフレクション プログラミング パッケージ;
3. java.net: ネットワーク プログラミング開発パッケージ。
4. java.sql: データベース開発用のサポート パッケージ。
5. java.util: java が提供するツール パッケージです。(コレクションクラスなど) 非常に重要
6. java.io: I/O プログラミング開発キット。
7. 静的メンバー
1. もう一度生徒について話しましょう
前の記事で紹介した学生クラスを使用して、3 つのオブジェクト s1、s2、および s3 をインスタンス化します。各オブジェクトには、独自の一意の名前、性別、年齢、成績点およびその他のメンバー情報があります。この情報は、さまざまな学生を説明するために使用されます。次のようになります。 :
3 人の生徒が同じクラスにいるとすると、彼らは同じ教室にいる必要があります。彼らは同じ教室にいるので、メンバー変数をクラスに追加して、生徒が授業を受けている教室を保存できますか? 答えはいいえだ。
各オブジェクトには、Student クラスで以前に定義されたメンバー変数 (インスタンス変数と呼ばれる) のコピーが含まれます。これは、この情報を使用して特定の生徒を記述する必要があるためです。ここで、学生が授業に出席する教室を表したいと思います。この教室の属性は各学生オブジェクトに保存する必要はありませんが、すべての学生で共有する必要があります。Javaでは、staticによって変更されたメンバを静的メンバまたはクラスメンバと呼び、特定のオブジェクトに属さず、すべてのオブジェクトで共有されます。
2. メンバ変数の静的変更
static によって変更されたメンバ変数を静的メンバ変数といいますが、静的メンバ変数の最大の特徴は、特定のオブジェクトに属さず、すべてのオブジェクトで共有されることです。
【静的メンバ変数の特徴】
① 特定のオブジェクトに属するのではなく、クラスの属性であり、特定のオブジェクトの空間に格納されるのではなく、すべてのオブジェクトで共有されます ② からアクセスできます
。オブジェクトまたはクラス名を使用しますが、一般的にはクラス名を使用してアクセスすることをお勧めします。
③ クラス変数はメソッド領域に格納されます。
④ ライフサイクルはクラスの存続期間に従います (つまり、クラスがロードされたときに作成され、クラスがロードされたときに破棄されます)クラスはアンロードされます)上記のコードをデバッグ モードで実行すると、静的メンバー変数が特定のオブジェクトに格納されていないことが監視ウィンドウで確認できます。
3. 静的変更メンバーメソッド
通常、クラス内のデータ メンバーはプライベートに設定され、メンバー メソッドはパブリックに設定されます。設定後、クラスの外から Student クラスの classRoom 属性にアクセスするにはどうすればよいでしょうか?
静的属性にはどのようにアクセスすればよいでしょうか?
Java では、static によって変更されたメンバー メソッドを静的メンバー メソッドと呼びますが、これらはクラスのメソッドであり、オブジェクトに固有のものではありません。静的メンバーには通常、静的メソッドを通じてアクセスします。【静的メソッドの特徴】
① 特定のオブジェクトに属さず、クラスメソッドである
② オブジェクトを通じて呼び出すことも、クラス名.静的メソッド名 (...) を通じて呼び出すこともできる 後者を使用することをお勧めします
。静的メソッド内の非静的メソッドにはアクセスできません。④ 静的メソッドではない非静的メソッドを静的メソッド内で呼び出すことはできません。これは、非静的メソッドにはこのパラメータがあり、静的メソッドを呼び出すときにこの参照を渡すことができないためです。
⑤静的メソッドはオーバーライドできず、ポリモーフィズムの実装に使用できません。
4. 静的メンバ変数の初期化
注: 静的メンバー変数は、通常、コンストラクターでは初期化されません。コンストラクターで初期化されるのは、オブジェクトに関連するインスタンス属性です。
静的メンバー変数の初期化には、インプレース初期化と静的コード ブロック初期化の 2 種類があります。
①インプレース初期化: インプレース初期化とは、定義時に初期値を直接与えることを指します。
②静的コードブロックの初期化(後述)
8. コードブロック
1. コードブロックの概念と分類
{} を使用して定義されたコードはコード ブロックと呼ばれます。コードブロック内で定義される位置とキーワードに応じて、次の 4 つのタイプに分類できます。
① 通常のコードブロック
② コンストラクションブロック
③ スタティックブロック
④ 同期コードブロック (ここでは説明しません)
2. 通常のコードブロック
この使用法はあまり一般的ではありません
3. コードブロックを構築する
ビルディング ブロック: クラス内で定義されたコードのブロック (修飾子なし)。インスタンス コード ブロックとも呼ばれます。構築コード ブロックは通常、インスタンス メンバー変数を初期化するために使用されます。
4. 静的コードブロック
static を使用して定義されたコード ブロックは、静的コード ブロックと呼ばれます。通常、静的メンバー変数を初期化するために使用されます。
注意事項
① 静的コードブロックによってオブジェクトがいくつ生成されても、実行されるのは 1 回だけです。
② 静的メンバー変数はクラスの属性なので、JVM がクラスをロードするときに開かれ、初期化されます。
③ クラスに複数のオブジェクトが含まれている場合静的コードブロック、コードをコンパイルする際、コンパイラは定義された順序で次々に実行(マージ)します
④インスタンスコードブロックはオブジェクト作成時のみ実行されます。