オブジェクト指向:
データとデータに対する操作方法を相互に依存する全体オブジェクトとしてまとめることです。類似オブジェクトの共通性を抽象化して、クラスを形成します。クラス内のほとんどのデータは、このクラスのメソッドによってのみ処理できます。クラスは単純な外部インターフェースを通じて外界と関係を持ち、オブジェクトはメッセージを通じて相互に通信します。プログラムの流れは、使用中のユーザーによって決定されます。モノとは、人がさまざまな具体的なモノから抽象化した概念であり、携帯電話がモノであるなど、人は日常的にさまざまなモノと接しています。
オブジェクト指向プログラミング(OOP:オブジェクト指向プログラミング)
オブジェクト指向とプロセス指向の違い
プロジェクト名 | オブジェクト指向プログラミング | プロセス指向プログラミング (構造化プログラミングとも呼ばれます) |
意味 | オブジェクト指向とは、その名のとおり、現実の事柄をプログラミングの「オブジェクト」に抽象化することです. その基本的な考え方は、すべてがオブジェクトであり、「ボトムアップ」の設計言語です. 最初の設計コンポーネント, そしてその後、組み立てを完了します。 | オブジェクト指向とは、その名のとおり、現実の事柄をプログラミングの「オブジェクト」に抽象化することです. その基本的な考え方は、すべてがオブジェクトであり、「ボトムアップ」の設計言語です. 最初の設計コンポーネント, そしてその後、組み立てを完了します。 |
特徴 | カプセル化、継承、ポリモーフィズム | アルゴリズム + データ構造 |
アドバンテージ | 大規模で複雑なシステムに適しており、再利用が容易です。 | シンプルなシステムに適しており、理解しやすい |
不利益 | プロセス指向よりも抽象的でパフォーマンスが低い | 複雑なシステムに対応しにくい、再利用しにくい、保守しにくい、拡張しにくい |
比較した | 維持しやすく、再利用しやすく、拡張しやすい. オブジェクト指向のカプセル化、継承、およびポリモーフィズムの特性により、低結合システムを設計して、システムをより柔軟で維持しやすくすることができます。 | 呼び出し時にクラスをインスタンス化する必要があり、オーバーヘッドが比較的大きく、より多くのリソースを消費するため、オブジェクト指向よりもパフォーマンスが高くなります; シングルチップ マイクロコンピュータ、組み込み開発、Linux/Unix などは一般的です。プロセス指向の開発を採用し、パフォーマンスが最も重要な要素です。 |
デザイン言語 | Java、Smalltalk、EIFFEL、C++、Objective-、C#、Pythonなど | C、フォートラン |
1.オブジェクト指向の3つの特徴
カプセル化、継承、ポリモーフィズム
①パッケージ
2 つの意味:
1 層の意味は、オブジェクトの属性と動作を不可分な全体として見なし、2 つを分離不可能な独立した単位 (つまり、オブジェクト) に「カプセル化」することであり、もう 1 層の意味は「情報の隠蔽」を指し、異なる 外部に知られる必要がある情報が隠されている オブジェクトの属性や動作の中には、外部のユーザーがそれらを知ったり使用したりできるものがありますが、それらを変更することは許可されていません 他の属性や動作は、知ることが許可されていません外の世界へ、またはオブジェクトの機能のみを使用することを許可します。場合によっては、オブジェクトの機能実装の詳細を非表示にします。
カプセル化の利点
優れたカプセル化は結合を減らすことができます。これは、プログラム設計における「高結合と低結合」の追求に沿っています。
クラス内の構造は自由に変更できます。
メンバー変数をより細かく制御できます。
メッセージ実装の詳細を非表示にします。
②相続
継承は、クラスの階層階層を作成できるため、Java オブジェクト指向プログラミング手法の基礎となっています。
継承とは、サブクラス オブジェクト (インスタンス) が親クラスのインスタンス フィールドとメソッドを持つように、サブクラスが親クラスの特性と動作を継承すること、またはサブクラスが親クラスからメソッドを継承することを意味します。親クラスと同じ振る舞い。
継承の利点:
(1) クラスコードの再利用性向上
(2) コードの保守性の向上
(3) ポリモーフィズムの前提であるクラスとクラスの関係を作る(継承のデメリットでもあり、クラス同士の結合が良くなる)
継承されたプロパティ:
サブクラスには、親クラスの非プライベート プロパティとメソッドがあります。
サブクラスは独自のプロパティとメソッドを持つことができます。つまり、サブクラスは親クラスを拡張できます。
サブクラスは、親クラスのメソッドを独自の方法で実装できます。つまり、親クラスのメソッドをオーバーライドできます。
Javaの継承は単一継承ですが、多重継承が可能です. 単一継承とは、サブクラスが1つの親クラスしか継承できないことを意味します. 多重継承とは、たとえば、クラスAがクラスBを継承し、クラスBがクラスCを継承することを意味します. 、クラス C は B クラスの親クラス、クラス B はクラス A の親クラスであり、Java 継承と C++ 継承を区別する機能です。
継承はキーワード extends と implements を使用することで実現でき、すべてのクラスは java.lang.Object から継承します. クラスに継承の 2 つのキーワードがない場合、デフォルトで object を継承します (このクラスは java . lang パッケージに あり 、 )祖先クラスをインポートする必要はありません 。
クラス間の結合を改善します (継承の欠点、結合が高いほど、コード間の接続が緊密になり、コードの独立性が低下します)。
function Animal(nick, age) {
this.nick = nick;
this.age = age;
}
Animal.prototype.skill = function() {
console.log('觅食')
}
function Dog(nick, age, type) {
// this.nick = nick;
// this.age = age;
Animal.call(this, nick, age);
Animal.apply(this, [nick, age]);
this.type = type;
}
// 我们使用call和apply方式实现构造函数的继承
// call与apply作用:改变this指向
// 浅拷贝,不能这么写,容易对父级的原型进行修改
// Dog.prototype = Animal.prototype;
// 推荐使用就for in
for (var x in Animal.prototype) {
Dog.prototype[x] = Animal.prototype[x]
}
Dog.prototype.jump = function() {
console.log("jump");
}
var d = new Dog('dd', 6, '柯基');
d.skill();
③多型
ポリモーフィズムとは、同じ動作の複数の異なる症状または形態を持つ能力です。
ポリモーフィズムの利点
- 1. 型間の結合関係をなくす
- 2.代用
- 3. スケーラビリティ
- 4. インターフェース
- 5.柔軟性
- 6. シンプルさ
ポリモーフィズムが存在するための 3 つの必要条件
- 継承する
- リライト
- 親クラス参照はサブクラス オブジェクトを指します
例: Parent p = new Child();
2.コンストラクタ・デストラクタ・プロトタイプ
コンストラクター: メモリ空間を開く
デストラクタ: メモリ空間を解放する
this: インスタンス オブジェクト自体を指します
プロトタイプ: メモリを節約するために使用される、このクラスのパブリック ストレージ スペース
function Book(name, author, price, type) {
// this指向实例对象本身
this.name = name;
this.author = author;
this.price = price;
this.type = type;
// 为了避免内存浪费,不建议方法写在构造函数
// this.sale = function() {
// console.log('全场8折');
// }
}
// 建议:方法及公用属性写在原型中
// 原型需要用构造函数名调用
// 原型的本质是个对象
Book.prototype.sale = function() {
console.log('全场8折');
}
var shz = new Book('水浒传', '施耐庵', '56.6', '小说');
var xyj = new Book('西游记', '吴承恩', '66.6', '小说');
3.試作チェーン
オブジェクトの特定のメソッドまたはプロパティにアクセスするときは、独自のコンストラクターで検索し、そうでない場合は独自のプロトタイプで検索し、そうでない場合はプロトタイプのプロトタイプを検索し、常にオブジェクトのプロトタイプを見つけます。このようにしてできた連鎖を原型連鎖と呼ぶ
function Dog(type, name, age) {
this.type = type;
this.name = name;
this.age = age;
}
Dog.prototype.skill = function() {
console.log('拆家');
}
function Cat(kindle, nick) {
this.tykindlepe = kindle;
this.nick = nick;
}
Cat.prototype = new Dog('金毛', '疙瘩', 2);
var cat = new Cat('橘猫', '啊桔');
cat.skill();
逆文字列
正常写法
function reverseString(string) {
return string.split('').reverse().join('');
}
面向对象写法
String.prototype.reverseString = function() {
return this.split('').reverse().join('');
}