クラスとオブジェクト
プロセス指向およびオブジェクト指向
- C言語はプロセス指向であり、プロセスに焦点を合わせ、問題を解決するためのステップを分析し、関数呼び出しを通じて問題を徐々に解決します。
- JAVAは、オブジェクト指向に基づいており、オブジェクトに焦点を合わせ、モノを異なるオブジェクトに分割し、オブジェクト間の相互作用によって完成させます。
- プロセス指向はプロセスに焦点を合わせており、プロセス全体に関係する動作は機能です。
- オブジェクト指向は、オブジェクト、つまり参加のプロセスに関与するサブジェクトに焦点を当てます。機能を1つずつ接続するのはロジックを介して
【オブジェクト指向のコンセプト】
- オブジェクト指向は問題についての考え方であり、一種の考え方です。例:概念と例。理論と実践。名前と現実など。
- クラスは、オブジェクトのクラスの総称です。オブジェクトはこの種の具体化のインスタンスです
- オブジェクト指向の利点:複雑なものを単純にするために、オブジェクトに直面するだけです。
【オブジェクト指向設計】
オブジェクト指向設計は重要な経験を把握します:誰がデータを所有し、誰がデータを操作するための外部メソッドを提供するか(プライベート)!(パッシブパーティはデータの所有者であり、アクティブパーティはエグゼキュータです)
開発中:オブジェクトの検索、オブジェクトの構築、オブジェクトの使用、およびオブジェクト間の関係の維持。
概要:オブジェクト指向は、コード(クラス)を使用して客観的な世界の物事を記述する方法です。クラスには、主に物事の属性と動作が含まれます。
クラスとクラスのインスタンス化
クラスは、オブジェクトのクラスの総称です。オブジェクトは、このタイプの
具体化のインスタンスです。クラスは、無数のオブジェクトをインスタンス化できます。
以下では、例を使用してクラスとクラスのインスタンス化を理解します
class Person {
public int age;//成员属性 实例变量 字段 属性
public String name;
public static String sex; //静态成员变量 方法区
public void eat() {
//成员方法
System.out.println("吃饭!");
}
public void sleep() {
System.out.println("睡觉!");
}
public static void func(){
System.out.println("静态成员方法");
}
}
public class Main{
public static void main(String[] args) {
Person person = new Person();//通过new实例化对象
person.eat();//成员方法调用需要通过对象的引用调用
person.sleep();
//产生对象 实例化对象
Person person2 = new Person();
Person person3 = new Person();
//静态成员变量和方法的调用
System.out.println(Person.sex);
Person.func();
}
}
メンバー変数:
クラス内で定義され、メソッド外で
オブジェクト参照を介してアクセスされます。
初期化されていない場合、その値はデフォルトのデフォルト値(デフォルトのゼロ値)です。
- 参照型の場合、値はnullです(配列、文字列文字列などを含む)
- 単純型の場合、値はその型に対応するデフォルト値です。
バイト | ショート | int | 長いです | 浮く | ダブル | char | ブール値 |
---|---|---|---|---|---|---|---|
0 | 0 | 0 | 0L | 0.0f | 0.0 | '\ u0000' 16進数(0として扱うこともできます) | false |
動作/メソッド:
[eat()sleep()]はインスタンスメンバーメソッドです
func()は静的メンバーメソッドです
静的メンバー変数とメンバーメソッドにアクセスするにはどうすればよいですか?
ここでわかるように、静的オブジェクトのオブジェクトをインスタンス化する必要はありません!!!
直通電話
クラス名。静的メンバー変数/静的メンバーメソッド
静的を要約すると:
- 静的メンバープロパティまたは静的メンバーメソッドの場合、オブジェクトに依存しません。
- メソッド領域に格納される静的メンバー変数は1つだけです。
- 非静的データは、静的メソッド内ではアクセスできません。
インスタンス化されたクラスのストレージ構造
メンバー変数を初期化する方法
1.インプレース初期化(クラス内の攻撃的な初期化)
2.デフォルトの初期化
3.クラス外の初期化(もっと使用)
public class Main{
public static void main(String[] args) {
Person person1 = new Person();
person1.name = "星星";
person1.age = 20;
Person person2 = new Person();
person2.name = "狒狒";
person2.age = 40;
}
}
カプセル化
コードを作成する場合、多くの場合、クラスの実装者とクラスの呼び出し元の2つの役割が関係します。カプセル化の本質は、クラスの実装者がクラスを実装する方法を知っている限り、クラスの呼び出し元がクラスを実装する方法を理解する必要がないようにすることです。クラスを使用するだけです。
これにより、クラスユーザーの学習と使用のコストが削減され、複雑さが軽減されます。
private / publicの2つのキーワードは、「アクセス制御」を意味します。
- publicによって変更されたメンバー変数またはメンバーメソッドは、クラスの呼び出し元が直接使用できます。
- privateによって変更されたメンバー変数またはメンバーメソッドは、クラスの呼び出し元が使用できません
例えば
class Person {
private String name = "张三";
private int age = 18;
public void show() {
System.out.println("我叫" + name + ", 今年" + age + "岁");
}
}
class Test {
public static void main(String[] args) {
Person person = new Person();
person.show();
}
}
- この時点で、フィールドはプライベートで装飾されています。クラスの呼び出し元(mainメソッド内)は直接使用できません。代わりに、showメソッドが必要です。この時点で、クラスのユーザーは理解する必要はありません。 Personクラスの実装の詳細。
- 同時に、クラスの実装者がフィールドの名前を変更した場合、クラスの呼び出し元は変更を加える必要がありません(クラスの呼び出し元は、名前や年齢などのフィールドにまったくアクセスできません)。
getterおよびsetterメソッド
ゲッター:プロパティ値を取得するメソッド
セッター:プロパティ値
を変更するメソッドこれらの2つのメソッドを使用して、プロパティにアクセスする目的を達成するために、クラスのプロパティをカプセル化します。
class Person {
private String name;//实例成员变量
private int age;
public void setName(String name){
//name = name;//不能这样写
this.name = name;//this引用,表示调用该方法的对象
}
public String getName(){
return name;
}
public void show(){
System.out.println("name: "+name+" age: "+age);
}
}
class Main {
public static void main(String[] args) {
Person person = new Person();
person.setName("caocao");
String name = person.getName();
System.out.println(name);
person.show();
}
}
このキーワード
ちょうど今コードでsetterメソッドを見ることができます
private String name;
public void setName(String name){
//name = name;//不能这样写
this.name = name;//this引用,表示调用该方法的对象
}
これは現在のオブジェクト参照を表し、これを使用してオブジェクトのフィールドとメソッドにアクセスできます
。3つの使用法:
- this.attribute; //現在のオブジェクトの属性にアクセスします
- this.method; //現在のオブジェクトのメソッドを呼び出す
- this(); //現在のオブジェクトの構築メソッドを呼び出します(ps:は最初の行に配置する必要があり、内部に構築メソッドは1つしか存在できません)
工法
構築メソッドは、キーワードnewを使用して新しいオブジェクトがインスタンス化されたときに自動的に呼び出され、初期化操作を完了する特別なメソッドです。
オブジェクトをインスタンス化/作成するためのステップはいくつありますか?
Student stu = new Student(); //
2つのステップでオブジェクトをインスタンス化します
- オブジェクトにメモリを割り当てます
- 適切な工法を呼び出して、複数の工法、場合によっては複数の工法があることを示します
文法規則
- メソッド名はクラス名と同じである必要があります
- コンストラクターには戻り値型の宣言がありません
- 各クラスには少なくとも1つの構築メソッドが必要です(明確に定義されていない場合、システムはパラメーターなしの構築を自動的に生成します)
class Person {
private String name;//实例成员变量
private int age;
private String sex;
//默认构造函数 构造对象
public Person() {
this.name = "caocao";
this.age = 10;
this.sex = "男";
}
//带有3个参数的构造函数
public Person(String name,int age,String sex) {
this.name = name;
this.age = age;
this.sex = sex;
}
public void show(){
System.out.println("name: "+name+" age: "+age+" sex: "+sex);
}
}
public class Main{
public static void main(String[] args) {
Person p1 = new Person();//调用不带参数的构造函数 如果程序没有提供会调用不带参数的构造函数
p1.show();
Person p2 = new Person("zhangfei",80,"男");//调用带有3个参数的构造函数
p2.show();
}
}
toStringメソッド
Person person = new Person("caocao",19);
System.out.println(person);
参照を出力すると、彼はデフォルトでtoStringメソッドを呼び出し、そのような結果を実行します
。toStringメソッドを書き直して、必要な結果を出力できます。
次に例を示します。
class Person {
private String name;
private int age;
public Person(String name,int age) {
this.age = age;
this.name = name;
}
public void show() {
System.out.println("name:"+name+" " + "age:"+age);
}
//重写Object的toString方法
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
public class Main {
public static void main(String[] args) {
Person person = new Person("caocao",19);
person.show();
System.out.println(person);
}
}
このようにして、参照の印刷が目的の内容に従って出力されます。
匿名オブジェクト
匿名性とは、単に名前のないオブジェクトを意味します。
- 参照されていないオブジェクトは、匿名オブジェクトと呼ばれます。
- 匿名オブジェクトは、オブジェクトを作成するときにのみ使用できます。
- オブジェクトが1回だけ使用される場合は、後で使用する必要はありません。匿名オブジェクトの使用を検討できます。
new Person("caocao",19).show();//通过匿名对象调用方法
機能:オブジェクトに依存せず、クラス名を介してそのプロパティまたはメソッドを呼び出すだけで済みます
コードブロック
- ネイティブコードブロック
- 静的コードブロック
- コードブロック/構築コードブロックの例
- 同期コードブロック(マルチスレッド)
ネイティブコードブロック:メソッドのコードブロック
public class Main{
public static void main(String[] args) {
{
//直接使用{}定义,普通方法块
int x = 10 ;
System.out.println("x1 = " +x);
}
int x = 100 ;
System.out.println("x2 = " +x);
}
}
静的コードブロック:通常、静的メンバーのプロパティを初期化するために使用されます
//静态代码块
static {
count = 10;//只能访问静态数据成员
System.out.println("I am static init()!");
}
インスタンスコードブロック:クラスで定義されたコードブロック。構築コードブロックは通常、インスタンスメンバー変数を初期化するために使用されます。
//实例代码块
{
this.name = "bit";
this.age = 12;
this.sex = "man";
System.out.println("I am instance init()!");
}
実行順序
- 静的コードブロック
- コードブロックの例
- 工法