概観
- Java言語はオブジェクト指向プログラミング言語であり、オブジェクト指向思考は一種のプログラミング思考であり、オブジェクト指向思考のもと、Java言語を使用してコンピュータプログラムを設計および開発しています。ここでのオブジェクトとは、現実のすべてのものを指し、それぞれには独自の属性と動作があります。オブジェクト指向の考え方は、コンピュータプログラミングの過程で実際に物事を参照し、物事の属性と動作を抽象化し、それらをコンピュータイベントとして記述することです。 これは、段階的な操作ではなく、オブジェクトの動作を呼び出すことによって機能の実現を強調するプロセス指向の考え方とは異なります。
例えば
- 洗濯:プロセス指向:服を脱ぐ->洗面器を見つける->洗濯粉を入れる->水を加える-> 10分間浸す->混練->洗濯->乾かす->乾かす
- オブジェクト指向:服を脱ぐ->全自動洗濯機をオンにする->服を投げる->ボタン->切る
- 違い:
- プロセス指向:ステップを強調します。
- オブジェクト指向:オブジェクトを強調します。ここでのオブジェクトは洗濯機です。
特徴
- オブジェクト指向の思考は、私たちの思考の習慣に沿った一種の思考であり、複雑なことを簡素化し、執行者から指揮官に私たちを変えることができます。オブジェクト指向言語には、カプセル化、継承、ポリモーフィズムという3つの基本的な特性があります。
クラスとオブジェクト
- 周りを見回すと、テーブル、椅子、クラスメート、教師など、多くのオブジェクトが見つかります。テーブルと椅子は事務用品に属し、教師と生徒はすべて人間です。クラスとは何ですか?オブジェクトとは何ですか?
- 実際には、次のようなクラスについて説明します。
- 属性:モノの状態情報です。
- 行動:物事にできること。
- 例:猫。
属性:名前、体重、年齢、色。
行動:歩く、走る、電話する
オブジェクトとは
- オブジェクト:クラスの具体的な具現化です。オブジェクトはクラスのインスタンスであり(オブジェクトはガールフレンドを見つけることではありません)、そのタイプのものの属性と動作を持っている必要があります。
- 実際には、子猫というクラスのインスタンスです。
- 例:子猫。
属性:トム、5kg、2年、黄色。
行動:壁を歩く、ジャンプして走る、ニャーと鳴る。
クラスとオブジェクトの関係
- クラスは、クラスの説明であり、抽象的です。
- オブジェクトはクラスのインスタンスであり、具体的です。
- クラスはオブジェクトのテンプレートであり、オブジェクトはクラスのエンティティです。
ものとクラスの比較
- 現実世界でのクラス:
- 属性:物事のステータス情報。
- 行動:何ができるか。
- Javaでクラスを使って物事を記述する場合も同様です。
- メンバー変数:物事のプロパティに対応
- メンバーメソッド:対応するものの動作
クラス定義フォーマット
public class ClassName/*类名*/ {
//成员变量
//成员方法
}
- 定義クラス:メンバー変数やメンバーメソッドなど、クラスのメンバーを定義します。
- メンバー変数:以前に定義された変数とほとんど同じです。場所のみが変更されました。**クラス内、メソッド外。
- メンバー方式:以前に定義した方式とほぼ同じです。staticを削除するだけで、staticの役割はオブジェクト指向の後で詳しく説明されます。
- クラス定義フォーマットの例:Student.javaを作成する
public class Student {
//成员变量
String name;//姓名
int age;//年龄
//成员方法
//学习的方法
public void study() {
System.out.println("好好学习,天天向上");
}
//吃饭的方法
public void eat() {
System.out.println("学饿了要吃饭");
}
}
オブジェクト形式
- オブジェクトを作成します。
- クラス名オブジェクト名=新しいクラス名();
- オブジェクトを使用してクラスのメンバーにアクセスします。
- オブジェクト名。メンバー変数。
- オブジェクト名、メンバーメソッド();
- オブジェクトの使用形式の例:別のTest01_Student.javaを作成する
public class Test01_Student {
public static void main(String[] args) {
//创建对象格式:类名 对象名 = new 类名();
Student s = new Student();//使用上面创建的Student.java
System.out.println("s:"+s); //地址值
//直接输出成员变量值,是它们的默认值
System.out.println("姓名:"+s.name); //null
System.out.println("年龄:"+s.age); //0
System.out.println("‐‐‐‐‐‐‐‐‐‐");
//给成员变量赋值
s.name = "迪丽热巴";
s.age = 18;
//再次输出成员变量的值
System.out.println("姓名:"+s.name); //迪丽热巴
System.out.println("年龄:"+s.age); //18
System.out.println("‐‐‐‐‐‐‐‐‐‐");
//调用成员方法
s.study(); // 好好学习,天天向上
s.eat(); // 学饿了要吃饭
}
}
メンバー変数のデフォルト値
| |データ型|デフォルト値|
|基本データ型(4つの型と8つの型)|整数(バイト、short、int、long)| 0 |
|浮動小数点数(fl oat、double)| 0.0 |
|文字(char)| ' \ u0000 '|
|ブール値| false |
|参照データ型|配列、クラス、インターフェース| null |
クラスとオブジェクトの演習
- 電話クラスを定義します:Phone.java
public class Phone {
// 成员变量
String brand; //品牌
int price; //价格
String color; //颜色
// 成员方法
//打电话
public void call(String name) {
System.out.println("给"+name+"打电话");
}
//发短信
public void sendMessage() {
System.out.println("群发短信");
}
}
- テストクラスを定義します:Test02Phone.java
public class Test02Phone {
public static void main(String[] args) {
//创建对象
Phone p = new Phone();
//直接输出成员变量值,是它们的默认值
System.out.println("品牌:"+p.brand);//null
System.out.println("价格:"+p.price);//0
System.out.println("颜色:"+p.color);//null
System.out.println("‐‐‐‐‐‐‐‐‐‐‐‐");
//给成员变量赋值
p.brand = "锤子";
p.price = 2999;
p.color = "棕色";
//再次输出成员变量值
System.out.println("品牌:"+p.brand);//锤子
System.out.println("价格:"+p.price);//2999
System.out.println("颜色:"+p.color);//棕色
System.out.println("‐‐‐‐‐‐‐‐‐‐‐‐");
//调用成员方法
p.call("紫霞");//给紫霞打电话
p.sendMessage();//群发短信
}
}
オブジェクト、メソッドメモリグラフを呼び出す
上の図から、スタックメモリでの実行方法は、「先入れ先出し、後入れ先出し」の原則に従っていることがわかります。変数pは、メソッド情報を検索してメソッドを実行するヒープメモリ内のスペースを指します。
しかし、まだ問題があります。複数のオブジェクトを作成する場合、各オブジェクトがメソッド情報のコピーを保存すると、すべてのオブジェクトのメソッド情報が同じになるため、メモリの浪費になります。この問題を解決するにはどうすればよいですか?下の図をご覧ください。
2つのオブジェクト、同じメソッドメモリグラフを呼び出す
オブジェクトがメソッドを呼び出すと、オブジェクトのメソッドタグ(アドレス値)に従ってクラスのメソッド情報が検索されます。このようにして、複数のオブジェクトの場合でも、メソッド情報のコピーが1つだけ保存され、メモリ領域が節約されます。
つまり、Phone.classは複数回使用できますが、保存されるのは1回だけです。
メソッドのメモリグラフにパラメータとして渡される参照
参照タイプはパラメーターとして使用され、アドレス値が渡されます。
pはPhoneオブジェクトです。値を割り当てた後、pを渡すと実際にそのアドレス値が渡されるため、その値を自然に取得できます。
メンバー変数とローカル変数の違い
- 変数が定義されている場所に応じて、それらに異なる名前を付けました。以下に示すように:
- クラスでの位置が異なります:(強調)
- メンバー変数:クラス内、メソッド外
- ローカル変数:メソッド内またはメソッド宣言(仮パラメーター)
- アクションの範囲が異なります:(強調)
- メンバー変数:クラス内
- ローカル変数:メソッド
- 初期化値の違い:(強調)
- メンバー変数:デフォルト値があります
- ローカル変数:デフォルト値はありません。定義、割り当て、最終的に使用する必要がある
- メモリ内の場所が異なります:(理解)
- メンバー変数:ヒープメモリ
- ローカル変数:スタックメモリ
- さまざまなライフサイクル:(理解)
- メンバー変数:オブジェクトが作成されると存在し、オブジェクトが消えると消えます
- ローカル変数:メソッドが呼び出されると存在し、メソッドが呼び出されると消えます
パッケージの概要
オブジェクト指向プログラミング言語は、客観的な世界のシミュレーションであり、客観的な世界では、メンバー変数はオブジェクトの内部に隠されており、外部の世界から直接操作または変更することはできません。カプセル化は、このクラスのコードとデータが他のクラスによってランダムにアクセスされるのを防ぐための保護バリアと考えることができます。このタイプのデータにアクセスするには、指定されたメソッドを渡す必要があります。適切なカプセル化により、コードの理解と保守が容易になり、コードのセキュリティも強化されます。
原則として
- プロパティを非表示にします。プロパティにアクセスする必要がある場合は、プロパティにアクセスするためのパブリックメソッドを提供します。
カプセル化手順
- メンバー変数を変更するには、privateキーワードを使用します。
- アクセスする必要のあるメンバー変数にgetXxxメソッドとsetXxxメソッドのペアを提供します。
プライベートの意味
- Privateは、最小の権限を表す権限修飾子です。
- メンバー変数とメンバーメソッドを変更できます。
- プライベートによって変更されたメンバー変数とメンバーメソッドは、このクラスでのみアクセスできます。
私用形式
- プライベートデータタイプの変数名。
- メンバー変数を変更するには、privateを使用します。コードは次のとおりです。
public class Student {
private String name;
private int age;
}
- メンバー変数にアクセスするためのgetXxxメソッド/ setXxxメソッドを提供します。コードは次のとおりです。
public class Student {
private String name;
private int age;
public void setName(String n) {
name = n;
}
public String getName() {
return name;
}
public void setAge(int a) {
age = a;
}
public int getAge() {
return age;
}
}
パッケージ最適化1-thisキーワード
- setXxxメソッドの仮パラメーター名が名前知識の要件を満たしていないことがわかったので、変更がメンバー変数名と一致している場合、同じですか?コードは以下のように表示されます:
public class Student {
private String name;
private int age;
public void setName(String name) {
name = name;
}
public void setAge(int age) {
age = age;
}
}
- 変更とテストの後、新しい問題が見つかりました。メンバー変数の割り当てが失敗しました。つまり、setXxx()の仮パラメーター変数名を変更した後、メソッドはメンバー変数に値を割り当てませんでした。これは、仮パラメーター変数の名前とメンバー変数の名前が同じであるため、メンバー変数名が非表示になるためです。メソッドの変数名はメンバー変数にアクセスできず、割り当ては失敗します。したがって、この重複の問題を解決するには、このキーワードしか使用できません。
これの意味
- これは、クラスの現在のオブジェクトの参照(アドレス値)、つまりオブジェクト自体の参照を表します。
メソッドが呼び出されるオブジェクトを覚えておいてください。メソッドのこれはそのオブジェクトを表します。つまり、誰が呼び出しているか、これは誰を表すかということです。
このフォーマット
- this。メンバー変数名。
- これを使用してメソッドの変数を変更し、メンバー変数が非表示になる問題を解決します。コードは次のとおりです。
public class Student {
private String name;
private int age;
public void setName(String name) {
//name = name;
this.name = name;
}
public String getName() {
return name;
}
public void setAge(int age) {
//age = age;
this.age = age;
}
public int getAge() {
return age;
}
}
メソッドに変数名が1つしかない場合は、デフォルトで変更されるため、省略できます。
パッケージ最適化2構築方法
- オブジェクトが作成されると、コンストラクターを使用してオブジェクトを初期化し、オブジェクトのメンバー変数に初期値を割り当てます。
コンストラクタをカスタマイズするかどうかに関係なく、Javaは自動的にパラメータなしのコンストラクタを提供するため、すべてのクラスにコンストラクタがあります。コンストラクタを定義すると、Javaによって自動的に提供されるデフォルトのパラメータなしのコンストラクタは無効になります。
工法の定義フォーマット
修饰符 构造方法名(参数列表){
// 方法体
}
- 構築メソッドの記述方法では、メソッド名はそれが含まれているクラスの名前と同じです。戻り値がないため、戻り値の型やvoidも必要ありません。コンストラクタを使用すると、コードは次のようになります。
public class Student {
private String name;
private int age;
// 无参数构造方法
public Student() {}
// 有参数构造方法
public Student(String name,int age) {
this.name = name;
this.age = age;
}
}
予防
- 構築方法を指定しない場合、システムはパラメーターなしの構築方法を提供します。
- 構築方法を指定すると、システムはパラメーターなしの構築方法を提供しなくなります。
- 構築メソッドは、パラメーターの有無にかかわらず、オーバーロードできます。
標準コード-JavaBean
- JavaBeanは、Java言語で記述されたクラスの標準仕様です。JavaBeanに準拠するクラスでは、クラスが具象かつパブリックであり、パラメーターなしの構築メソッドを持ち、メンバー変数を操作するためのセットおよび取得メソッドを提供する必要があります。
public class ClassName{
//成员变量
//构造方法
//无参构造方法【必须】
//有参构造方法【建议】
//成员方法
//getXxx()
//setXxx()
}
- JavaBean仕様に準拠するクラスを記述します。例として、studentクラスを取り上げます。標準コードは次のとおりです。
public class Student {
//成员变量
private String name;
private int age;
//构造方法
public Student() {}
public Student(String name,int age) {
this.name = name;
this.age = age;
}
//成员方法
publicvoid setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
publicvoid setAge(int age) {
this.age = age;
}
publicint getAge() {
return age;
}
}
- テストクラスのコードは次のとおりです。
public class TestStudent {
public static void main(String[] args) {
//无参构造使用
Student s= new Student();
s.setName("柳岩");
s.setAge(18);
System.out.println(s.getName()+"‐‐‐"+s.getAge());
//带参构造使用
Student s2= new Student("赵丽颖",18);
System.out.println(s2.getName()+"‐‐‐"+s2.getAge());
}
}
やっと
わからないことを読んだ後、下にコメントを残して議論したり、プライベートメッセージをフォローして私に尋ねたりできます。見たときに答えます。また、私の公式アカウントにも注目してください。未来は明るいです。ゴールデン9日とシルバー10のインタビューシーズンにすぐに切り替えます。500ページ近くのPDFドキュメントを含む1,000以上のJavaインタビューの質問をまとめて、夢のBATの実現に役立てました。記事はその中で更新され、照合された情報もその中に配置されます。ご覧いただきありがとうございます。この記事がお役に立ったと思われる場合は、必ずフォローして、いいねやサポートをお願いします。