オブジェクト指向には、カプセル化、継承、抽象化、ポリモーフィズムの4つの基本的な特性があります。オブジェクト指向の考え方を使用してプログラムを作成するには、コードの冗長性を低下させることなく、プログラムアーキテクチャ全体を非常に柔軟にすることができます。
目次
クラスのカプセル化
カプセル化は、オブジェクト指向変換のコアアイデアです。カプセル化のキャリアはクラスであり、オブジェクトの属性と動作はこのクラスにカプセル化されます。
クラス継承
継承の基本的な考え方は、親クラスの拡張に基づいており、新しいサブクラスを作成します。サブクラスは、親クラスの元のプロパティとメソッドを継承することも、元の親クラスにないプロパティとメソッドを追加することもできます。または親クラスの一部のメソッドを直接オーバーライドします。Javaは単一の継承のみをサポートします。つまり、クラスは1つの親クラスのみを持つことができます。
キーワードを拡張します
Child extends Parents
子クラスの子クラスは親クラスのParentsクラスを継承しますが、親クラスのParentsクラスのプロパティとメソッドも継承します。
メソッドの書き換え
親クラスのメンバーは子クラスに継承されます。親クラスのメソッドが子クラスに適用できない場合は、子クラスの親クラスのこのメソッドをオーバーライドする必要があります。
親クラスのメンバーメソッドの名前をサブクラスに保持するか、メンバーメソッドの実装内容を書き換えるか、メンバーメソッドの保存許可を変更するか、メンバーメソッドの戻り値の型を変更します。
public class Computer {
String screen = "液晶显示屏";
void startup(int a) {
System.out.println("我有" + a + "台" + screen);
}
}
public class Pad extends Computer{
String battery = "500毫安电池";
@Override
void startup(int a) {
super.startup(a);
}
}
メソッドリファクタリング
継承には特別な書き換えメソッドもあります。サブクラスと親クラスの戻り値、メソッド名、パラメータの種類、メンバーメソッドの数はまったく同じです。唯一の違いはメソッドの内容です。この特別な書き換えメソッドリファクタリングと呼ばれます。
public class Computer {
String screen = "液晶显示屏";
void startup(int a) {
System.out.println("我有" + a + "台" + screen);
}
}
public class Pad extends Computer{
String battery = "500毫安电池";
// 重构:返回值、方法名称、参数类型及个数完全相同,唯一不同的方法实现内容
@Override
void startup(int a) {
System.out.println("我有" + a + "台" + screen + ",和" + a + "个" + battery);
}
}
注:親クラスのメソッドをオーバーライドする場合、変更されたメソッドの変更権限は、小さな範囲から大きな範囲にのみ変更できます。
スーパーキーワード
Javaはsuperキーワードを提供します。superキーワードは親オブジェクトを表します。superキーワードの使用法は次のとおりです。
super.property; // 调用父类的属性
super.method; // 调用父类的方法
オブジェクトクラス、すべてのクラスの親クラス
Javaでは、String、Integerなどのすべてのクラスが直接または間接的にjava.lang.Objectクラスを継承し、その他のクラスはObjectクラスから継承されます。これは、すべてのクラスがObjectサブクラスであるため、クラスを定義するときに、extendsObejctステートメントを省略します。
Objectクラスで最も一般的に使用される2つのメソッドは、equals()とtoString()およびgetClass()メソッドです。すべてのクラスはObjectクラスのサブクラスであるため、どのクラスでもObjectクラスのメソッドをオーバーライドできます。
1. getClass()メソッド
getClassメソッドは、オブジェクトが実行されたときにClassインスタンスを返します。その後、クラスの名前はgetNameを介して取得できます。
getClass().getName();
2. toString()メソッド
toStringメソッドは、オブジェクトの文字列表現を返します。オブジェクトを出力すると、オーバーライドされたtoStringメソッドが自動的に呼び出されます。
3. equals()メソッド
Objectクラスのequals()メソッドは、2つのオブジェクトの参照アドレスが等しいかどうかを比較します。
クラスポリモーフィズム
Javaでは、ポリモーフィズムの意味は「1つの定義、複数の実装」です。クラスのポリモーフィズムは、メソッドのオーバーロードとクラスの上下変換の2つの側面から具体化できます。
メソッドのオーバーロード
これらのメソッドのパラメーターの数またはタイプが異なる限り、同じ名前の複数のメソッドを同じクラスで使用できます。
public class Pad extends Computer{
void startup(int a,int b) {
System.out.println("我有大宝" );
}
void startup(int a) {
super.startup(a);
}
}
上向きの変化
Javaでは、サブクラスオブジェクトをスーパークラスオブジェクトに割り当てる手法は、アップキャストと呼ばれます。親クラスのオブジェクトは、サブクラスの一意のプロパティまたはメソッドを呼び出すことはできません。
public class Computer {
static void startup(Computer computer) {
System.out.println(computer);
}
}
public class Pad extends Computer{
public static void main(String[] args) {
Pad pc = new Pad();
startup(pc);
}
}
ダウンキャスト
親クラスオブジェクトをサブクラスオブジェクトに強制する方法は、表示型変換と呼ばれます。
public class Pad extends Computer{
public static void main(String[] args) {
Pad pc = new Pad();
startup(pc);
Computer computer = new Pad();
// 父类转子类需要(显示类型)强制转换才能实现
Pad pad = (Pad)computer;
}
}
instanceofキーワード
プログラムでダウンキャスト操作を実行するときに、親クラスオブジェクトがサブクラスのインスタンスでない場合、ClassCastExceptionが送信されます。したがって、親クラスがサブクラスのインスタンスであるかどうかを判断する必要があります。instanceofは、特定のクラスが特定のインターフェイスを実装しているかどうかを判断できます。
public class Computer {
}
public class Pad extends Computer{
public static void main(String[] args) {
Computer computer = new Computer();
// 判断computer是不是Pad的实例
if (computer instanceof Pad) {
Pad pad = (Pad)computer;
}
}
}
抽象クラスとインターフェース
抽象クラスと抽象メソッド
抽象クラスはオブジェクトインスタンスを生成できません。抽象クラスを定義するときは、abstractキーワードを使用する必要があります。
权限修饰符 abstract class 类名 {
类体
}
抽象を使用して定義されたメソッドは、抽象メソッドと呼ばれます。
权限修饰符 abstract 方法返回值类型 方法名(参数列表);
抽象メソッドはセミコロンで直接終了し、メソッド本体はなく、抽象メソッド自体はオーバーライドされない限り意味がなく、この抽象メソッドを運ぶ抽象クラスを継承する必要があります。抽象クラスを継承するサブクラスは、抽象クラスの抽象メソッドをオーバーライドする必要があります。
public abstract class Market {
public String name;
public String goods;
public abstract void shop(); //抽象方法
}
public class TaobaoMarket extends Market{
@Override
public void shop() {
System.out.println(name + "网购" + goods);
}
public static void main(String[] args) {
Market market = new TaobaoMarket(); // 派生类对象创建抽象类对象
market.name = "仙宝";
market.goods = "芭比娃娃";
market.shop();
}
}
実行結果:Xianbaoオンラインショッピングバービー人形
抽象クラスと抽象メソッドは、次の原則に従う必要があり
ます。1。抽象クラスには抽象メソッドが含まれる場合と含まれない場合がありますが、抽象メソッドを含むクラスは抽象である必要があります。
2.抽象メソッドが抽象クラスで宣言されていない場合でも、抽象クラスを直接インスタンス化することはできません。
3.抽象クラスが継承された後、サブクラスはクラス内のすべての抽象メソッドを再抽象化する必要があります。
4.抽象クラスを継承するサブクラスも抽象クラスである場合、親クラスのすべての抽象メソッドを書き直す必要はありません。抽象クラスの使用には冗長なコードが多すぎます。クラスは同時に複数の親クラスを継承することはできず、必要に応じてインターフェイスが出現します。
インターフェイスの宣言と実装
インターフェイスは抽象クラスの拡張であり、純粋な抽象クラスと見なすことができます。インターフェイス内のすべてのメソッドにはメソッド本体がありません。
权限修饰符 interface 接口名 {
}
インターフェイスを実装するクラスは、implementsキーワードを使用できます
public class Para implements draw {
}
インターフェイスで定義された変数は自動的に静的で最終的なものになるため、インターフェイスで定数を定義するときは、定数を初期化する必要があり、インターフェイスを実装するサブクラスはインターフェイスで変数を再割り当てできません。
多重継承
Javaでは、クラスは多重継承を許可しませんが、クラスは複数のインターフェースを実装できるため、インターフェースを使用して多重継承を実現できます。
类名 implements 接口1,接口2,接口3 {
}
多重積分では、変数またはメソッド名の間に競合が発生する可能性があります。変数が競合する場合は、変数のインターフェイスを明確に指定する必要があります。つまり、「インターフェイス名。変数」を使用します。メソッドが競合する場合は、次のことだけを行う必要があります。 1つのメソッドを実装します。
抽象クラスとインターフェースを区別する
継承:サブクラスは1つの抽象クラスのみを継承できますが、複数のインターフェイスを実装できます。
メソッド:抽象クラスは非抽象メソッドを持つことができ、インターフェイスはすべて抽象メソッドです。
属性:抽象クラスは任意の型にすることができ、インターフェースは静的定数のみにすることができます。
コード:抽象クラスには静的メソッドと静的コードブロックを含めることができますが、インターフェイスにはできません。
構築メソッド:抽象クラスには構築メソッドを含めることができますが、インターフェースにはありません。
アクセス制御
Javaは主に、アクセス制御シンボル、クラスパッケージ、およびfinalキーワードを介して、クラス、メソッド、または変数のアクセススコープを制御します。
アクセス制御文字
非表示を非表示にし、公開を公開するには、これらの両方の側面を「アクセス制御シンボル」を介して実装する必要があります。
このカテゴリ:1つのクラスファイル
同じパッケージ:1つのパッケージパッケージ
サブカテゴリ:他のパッケージの下のサブカテゴリ
その他:他のパッケージの下の非サブカテゴリ
クラスを宣言するときに、public修飾子を使用してクラスのアクセス許可を設定しない場合、デフォルトがデフォルトになります。
Java言語では、クラスの権限設定により、クラスメンバーの権限設定が制限されます。たとえば、デフォルトのクラスを定義するには、メソッドが追加されているかどうかに関係なく、そのアクセス修飾子がデフォルトです。
静的変数またはグローバル変数を除いて、ほとんどのクラスはpublicを使用し、すべてのプロパティはprivateを使用します。
Javaクラスパッケージ
Javaでクラスを定義するたびに、Javaコンパイラでコンパイルした後、拡張子が.classのファイルが生成されます。スケールの主キーを展開すると、クラス名の競合が発生しやすくなります。
Javaは、クラスファイル(クラスパッケージ)を管理するためのメカニズムを提供します。Javaでクラスパッケージメカニズムを採用することは非常に重要です。クラスパッケージは、クラス名の競合の問題を解決できます。
Javaパッケージの命名規則は、すべて小文字を使用することです。世話をするクラスを使用したい場合は、Javaのimportキーワードを使用して指定できます。
importキーワードを使用する場合、クラスの完全な説明を指定できますが、パッケージ内でより多くのクラスを使用するために、パッケージ名の後に「。*」を追加できます。これは、パッケージのすべてのクラスがで使用されることを意味します。プログラム。パッケージ内のクラスがインポートで指定されている場合、このパッケージのサブパッケージクラスは指定されていません。サブクラスを使用する場合は、再度引用符で囲む必要があります。
最終キーワード
finalの意味はfinalとfinalであり、finalによって変更されるクラス、メソッド、および変数は変更できません。
1.最終クラス
クラスが最終クラスに設定されると、クラスのメソッドは暗黙的に最終形式に設定されますが、最終クラスのメンバー変数は、最終形式または非最終形式のいずれかとして定義できます。
2. finalメソッド
finalで変更されたメソッドは書き換えられません。メソッドをfinalとして定義すると、サブクラスがメソッドの定義と実装を変更できなくなる可能性があります。同時に、finalメソッドの実行効率はnon-finalよりも高くなります。メソッド。サブクラスが親クラスを継承する場合、親クラスのメソッドがfinalで変更された後は、サブクラスをオーバーライドできません。
3.最終変数
finalキーワードを使用して変数を変更できます。変数が最終変更されると、変数の値は変更できなくなります。通常最終的に変更される変数は、定数と呼ばれます。最終的に変更された変数には、宣言時に値を割り当てる必要があります。定数であるか最終的に変更されたオブジェクト参照であるかに関係なく、再割り当てすることはできません。
インナークラス
クラスでクラスを定義してから、そのクラスで定義されたクラスを内部クラスと呼びます。
メンバー内部クラス
クラスのメンバーとして使用できるメンバー変数、メソッド、およびコンストラクターに加えて、メンバー内部クラスもクラスのメンバーとして使用できます。構文は次のとおりです。
public class OtherClass {
// 外部
public class InnerClass {
// 内部
}
}
外部クラスのメンバーメソッドとメンバー変数はprivateで装飾されていますが、内部クラスも使用できます。
外部クラスで内部クラスオブジェクトを初期化すると、内部クラスオブジェクトが外部クラスオブジェクトにバインドされます。
public class OtherClass {
// 外部
private String name;
public OtherClass(String name) {
this.name = name;
}
public void name() {
System.out.println(this.name);
}
public class InnerClass {
// 内部
private Integer age;
public InnerClass(Integer age) {
this.age = age;
}
public void age() {
System.out.println(this.age);
}
}
public static void main(String[] args) {
OtherClass otherClass = new OtherClass("张三");
otherClass.name();
InnerClass innerClass = otherClass.new InnerClass(22);
innerClass.age();
}
}
内側のクラスオブジェクトは、外側のクラスオブジェクトがすでに存在しない限り、外側のクラスオブジェクトotherClass.new InnerClass(22)に大きく依存しています。
匿名の内部クラス
匿名内部クラスの特徴は、一度だけ使用する必要があることです。つまり、再利用することはできません。匿名内部クラスを作成する最も一般的な方法は、インターフェイスタイプまたは抽象クラスのオブジェクトを作成することです。構文は次のとおりです。
new A(){
// 匿名内部类的类体
};
匿名内部クラスは、次の原則に従う必要があります
。1。匿名クラスには構築方法がありません。
2.匿名クラスは静的メンバーを定義できません。
3.匿名クラスは、private、public、protected、static、final、abstractなどで変更することはできません。
4.作成できる匿名クラスインスタンスは1つだけです。
public abstract class Market {
public abstract void shop(); //抽象方法
}
public class TaobaoMarket{
public static void main(String[] args) {
new Market() {
@Override
public void shop() {
System.out.println("去超市买东西");
}
}.shop();
}
}
運用結果:スーパーに行って物を買う
実際、匿名内部クラスは他のクラスと同じメモリ構造を持っていますが、匿名内部クラスによって作成されたオブジェクトは特定の変数によって参照されないため、匿名内部クラスは使い捨てです。作成されたクラスオブジェクトが1回だけ使用される場合、このシナリオでは匿名の内部クラスを検討できます。