VScode で Java クラスとオブジェクト (Java 構築メソッド、JavaBean) を学習しています。シリーズ 2 回目 + VScode のプレビュー モードで別のファイルをクリックする方法を学習していますが、置き換えられません。

私の個人的なブログのホームページ: If '' が本当に脱出できる 1️⃣ Say 1️⃣ Java の基本文法学習に関するブログのホームページ
----> 私のブログを参照してください: 「VScode で Java を学ぶ」

[1] クラスは、同じ特性 (属性) と同じ動作 (メソッド) を持つオブジェクトのグループを記述するオブジェクトのコレクションです。
[2] オブジェクトやエンティティが持つ特性をクラスで表現した場合、クラスの属性と呼ばれます。オブジェクトによって実行される操作は、クラスのメソッドと呼ばれます。

Main myObj = new Main();其中两个Mainそれらは何を表しているのか:

在这行代码中,`Main`出现了两次。第一个`Main`是类的名称,代表着类名。
		  而第二个`Main`是构造函数的调用,表示要创建一个对象的实例。

类是描述了一组有相同特性(属性)和相同行为(方法)的一组对象的集合。

「VScodeでJavaを学ぶ(Javaのクラスとオブジェクト)」の続きです。

データ領域は次のように表現されます。
dataFieldName: dataFieldType _ データフィールド名 : データフィールドタイプ
構築メソッドは次のように表現できます。
ClassName(parameterName: parameterType) _ クラス名 (パラメータ名 : パラメータタイプ)
メソッドは次のように表現できます。
methodName(parameterName: parameterType): returnType _ メソッド名 (パラメータ名 : パラメータタイプ):戻り値の型

3._構築メソッド [クラス内では、そのクラスと同名のメソッドが構築メソッドとなります。] (コンストラクター、コンストラクター) –> オブジェクトの作成時に、メンバー変数を初期化するために仮想マシンによって自動的に呼び出されます。

使用new关键字创建对象时,会调用对应的构造方法

(1) コンストラクター (Constructor) は、新しいオブジェクトを作成し、そのデータ メンバーを初期化するために使用される Java の特別なメソッドです。その名前はクラス名と同じで、戻り値の型はなく(void を含む)、パラメーターを含めることも、パラメーターを持たないこともできます。

当使用关键字“new”创建一个新对象时,就会自动调用该类的构造方法。

(2) コンストラクターは、デフォルト値の設定、領域の割り当てなど、さまざまな初期化操作を実行できますJava では、すべてのクラスに少なくとも 1 つのコンストラクターが必要です。明示的に定義されていない場合、Java コンパイラはデフォルトで引数のないコンストラクターを生成します。

在Java中,构造器和构造函数是同一个概念,没有区别。
	构造器(Constructor)是一种特殊的方法,用于创建并初始化对象。
它具有与类相同的名称,并且没有返回类型(包括void),可以带有参数。

注: よくある間違いは、キーワード void をコンストラクターの前に置くことです。

  1. コンストラクターの名前はクラスと同じです。
  2. 各クラスは複数のコンストラクターを持つことができます
  3. コンストラクターには 0 個、1 個以上のパラメーターを含めることができます
  4. コンストラクターは値を返しません。
  5. コンストラクターは常に new 演算子を使用して呼び出されます

意味 ----> それ利点には以下が含まれます利便性、オブジェクト状態の初期化、タイプ セーフティ、柔軟性

オブジェクトの作成時にパラメータを直接渡すと便利です。パラメータを受け取り、オブジェクトの初期化中にそれらを使用してオブジェクトの状態を設定します。このようにして、オブジェクトの作成中にオブジェクトのプロパティを初期化し、作成後にオブジェクトが適切な状態になるようにすることができます。

<1>new演算子は、Java でオブジェクトを作成するためのキー演算子です。メモリ内にスペースを割り当て、オブジェクトを初期化し、そのオブジェクトへの参照を返します。

new演算子を使用してオブジェクトを作成すると、次の手順が実行されます。

  1. メモリ割り当て:newオペレータはオブジェクトの種類に応じて必要なメモリ領域を決定し、オブジェクトのメンバ変数とメソッドを格納するのに十分な領域をヒープ メモリに割り当てます。

  2. 初期化: メモリを割り当てた後、Java は適切なコンストラクターを呼び出してオブジェクトを初期化します。コンストラクターを呼び出すことで、オブジェクトの初期状態の設定、リソースの割り当てなどを行うことができます。

  3. バックリファレンス: 初期化が完了すると、new式は新しく作成されたオブジェクトへの参照を返します。この参照を通じて、オブジェクトのメンバー変数とメソッドにアクセスして操作できます

new演算子を使用してオブジェクトを作成するサンプル コードを次に示します。

ClassName object = new ClassName();

ここで、 はClassNameインスタンス化するクラスの名前です。object新しく作成されたオブジェクトへの参照であり、オブジェクトのメンバー変数およびメソッドにアクセスするために使用できます。

デフォルトの引数なしのコンストラクターを使用するだけでなく、パラメーターを指定してコンストラクターを使用してオブジェクトを作成することもできることに注意してください。例えば:

ClassName object = new ClassName(arg1, arg2);

これにより、パラメータを指定してコンストラクターが呼び出され、オブジェクトが初期化され、適切なパラメータが渡されます。

要約:
-new演算子は、ヒープ メモリに領域を割り当て、オブジェクトを初期化するために使用されます。
-new演算子は、メモリ割り当て、初期化、参照を返すという 3 つのステップを実行します。
-new演算子を通じて作成されたオブジェクトは、オブジェクトへの参照を使用してアクセスおよび操作できます。

< 2 > 工法とセットの対比:要約すると、コンストラクター メソッドはオブジェクトの作成時にオブジェクトを初期化するために使用され、set メソッドはオブジェクトの作成後にオブジェクトのプロパティ値を変更するために使用されます。

构造方法的主要目的是确保对象在创建后具有一致的状态。
	当你创建一个新对象时,构造方法会被自动调用,将提供的参数用于初始化对象的状态。

(1)コンストラクター(Constructor)は、オブジェクト作成時の初期化を行う特殊なメソッドです。通常、クラスをインスタンス化するときに呼び出され、新しく作成されたオブジェクトにメモリを割り当て、そのメンバー変数を初期化します

set 方法通常被定义为公共方法,接受参数并将其值分配给对象的成员变量。
	通过调用set 方法,你可以更改对象的属性值,而不是创建一个新的对象。

(2) setメソッド(setter)は、オブジェクトのプロパティの値を設定するメソッドです。通常、オブジェクトの状態を変更したり、新しい値を割り当てたりするために使用されます

总结起来,构造方法用于在创建对象时进行初始化,而set 方法用于在对象创建后修改对象的属性值。
	构造方法的作用是在对象创建时设置初始值,而不是给对象命名。

クラス コードがエラーを報告するのはなぜですか:

ここに画像の説明を挿入

メインメインメソッド
package asdasdasdasdasdasdasdasdasd;

public class asdasdasdasdadasdad {
    
    
    public static void main(String[] args) {
    
    
        // 使用构造方法创建一个新的 Person 对象
        Person111 person1 = new Person111("John", 25);
        System.out.println(person1.getName()); // 输出:John
        System.out.println(person1.getAge()); // 输出:25

        // 使用 set 方法修改对象的属性值
        person1.setName("Mike");
        person1.setAge(30);
        System.out.println(person1.getName()); // 输出:Mike
        System.out.println(person1.getAge()); // 输出:30
    }
}
上記のクラスコードが間違っている箇所と改善点は次のとおりです。

(1) setName メソッドと setAge メソッドは、静的メソッドではなくインスタンス メソッドである必要があります。これらはクラスのプロパティではなく、インスタンスのプロパティを設定するためのものであるためです。したがって、メソッド宣言内の static キーワードを削除する必要があります。

(2) getName メソッドの戻り値の型は、char[] ではなく String である必要があります。name 属性は文字の配列ではなく文字列であるためです。したがって、メソッド宣言の戻り値の型を char[] から String に変更する必要があります。

(3) getAge メソッドの戻り値の型は、char[] ではなく int である必要があります。age プロパティは文字の配列ではなく整数であるためです。したがって、メソッド宣言の戻り値の型を char[] から int に変更する必要があります。

package asdasdasdasdasdasdasdasdasd;

public class Person111 {
    
    
    private String name;
    private int age;

    // 构造方法
    public Person111(String name, int age) {
    
    
        this.name = name;
        this.age = age;
    }

    // set 方法用于设置 name 属性值
    public void setName(String name) {
    
    
        this.name = name;
    }

    // set 方法用于设置 age 属性值
    public void setAge(int age) {
    
    
        this.age = age;
    }

    public String getName() {
    
    
        return name;
    }

    public int getAge() {
    
    
        return age;
    }

    // 其他方法...
}

変更された結果
ここに画像の説明を挿入

< 3 > オブジェクトの作成時にメンバー変数に値を割り当てる: new キーワードを使用してオブジェクトを作成すると、対応するコンストラクターが呼び出されます。

コンストラクターは、オブジェクトの作成時に自動的に呼び出される特別なメソッドで、主にオブジェクトのメンバー変数を初期化するために使用されます。オブジェクトの作成と初期化のプロセスは、構築メソッドによって組み合わせることができます。、コードがより簡潔で読みやすくなります。

したがって、この構築メソッドは、オブジェクトのメンバー変数に初期値を割り当てるために使用される特別な初期化メソッドとみなすことができます。
これにより、オブジェクトの作成時に、各プロパティに手動で値を割り当てることなく、コンストラクターを直接呼び出してオブジェクトのプロパティを初期化できるため、コードの効率と保守性が向上します。

< 4 > コンストラクターでの直接代入にはパラメータを使用した構築が必要であり、パラメータのないものはパラメータのないものさえ必要ないのはなぜですか:

クラスにコンストラクターが定義されていない場合、Java はクラスのデフォルトのコンストラクターを自動的に生成します。
デフォルトのコンストラクターにはパラメーターが含まれておらず、メソッド本体は空です
パラメーターなしのコンストラクターは、パラメーターを受け取らないため、Nullary コンストラクターとも呼ばれます。
コンパイラーによって自動的に生成された引数のないコンストラクターのみが、デフォルト コンストラクターと呼ばれます。
パラメーターや特定のコンテンツを持たずにコンストラクターを作成した場合、それは単なる空のコンストラクターであり、デフォルトのコンストラクターとしてカウントされません。

[ 0 ] コンストラクターは、次の場合にコンパイラによって自動的に追加される引数のないコンストラクターを指します。

  1. クラス内でコンストラクターが明示的に宣言されていない場合、コンパイラーはデフォルトのコンストラクターを自動的に生成します。

  2. クラスに他のコンストラクター (パラメーターを持つコンストラクター) が含まれているが、パラメーターのないコンストラクターが提供されていない場合、場合によっては (オブジェクト インスタンスの作成時にパラメーターを渡さない場合など)、コンパイラーはデフォルトのコンストラクターを自動的に追加します。

     默认构造函数具有无参且没有特定实现的特点,它仅完成对象的初始化工作。
     如果用户显式声明了其他构造函数,则需要同时显式声明默认构造函数,	
     	否则无法通过无参方式创建对象实例。
    

【1】参考になる方:

(1) 1 つ以上のコンストラクターがクラスで明示的に定義されている場合、Java コンパイラーはデフォルトの引数なしのコンストラクターを提供しなくなります。
这意味着如果你在类中定义了至少一个构造方法,并且没有显式地定义无参构造方法,
	那么在创建该类的对象实例时,只能使用已定义的构造方法来传递必要的参数。

この構築メソッドを使用すると、オブジェクトの作成時にメンバー変数に値を割り当て、作成後にオブジェクトが有効で使用可能な初期化プロセスにあることを確認するために必要な準備を行うことができます

使用构造方法的方式可以灵活地根据需求来初始化对象,并允许在对象创建的过程中传递必要的参数。

ただし、場合によっては、パラメータを渡さずにオブジェクトを作成するなど、パラメータなしでオブジェクト インスタンスの作成をサポートする必要がある場合があります。この場合、引数なしのオブジェクトのインスタンス化をサポートするには、引数なしのコンストラクターを明示的に定義する必要があります。

有参构造函数与无参构造函数相比,它接受一个或多个参数,并用这些参数来初始化类的对象。
	不论有无显式定义的构造方法,编译器会自动提供一个默认的无参构造方法。
根据实际需求,选择合适的构造方法来创建对象,并通过显式定义构造方法来满足特定的需求。
(2) パラメータ化されたコンストラクタの定義は次のとおりです。
public class ClassName {
    
    
    // 有参构造函数
    public ClassName(参数类型 参数1, 参数类型 参数2, ...) {
    
    
        // 初始化代码
    }
}

その中で、パラメータのタイプとパラメータ名はニーズに応じて定義され、特定のニーズに応じて異なるタイプと数量のパラメータを渡すことができます。

パラメーター化されたコンストラクターを使用する場合、オブジェクトの作成に必要なさまざまなパラメーターに従ってさまざまな初期化操作を実行できます。これにより、オブジェクト作成プロセスをカスタマイズし、オブジェクトが適切に初期化されるようにすることができます。

パラメーター化されたコンストラクターが定義されているときに、パラメーターなしのコンストラクターも使用してオブジェクトを作成したい場合は、同時にクラス内でパラメーターなしのコンストラクターを明示的に定義する必要があります。それ以外の場合、オブジェクトはパラメーターを指定したコンストラクターを使用してのみ作成できます。

次の点に注意してください:
  • クラスは、引数なしのコンストラクターと引数コンストラクターを含む複数のコンストラクターを同時に定義できます。
  • コンストラクター内では、渡されたパラメーターを使用してオブジェクトのプロパティを初期化できます。
  • コンストラクターには void 型を含む戻り値の型がないため、記述する必要はありません。
  • 特定のコンストラクターを使用してオブジェクトを作成する場合、コンストラクターのパラメーターの型と数に従って、対応するパラメーターを指定する必要があります。
    ここに画像の説明を挿入

【2】パラメータなし:

Java の引数なしのコンストラクターは、パラメーターを持たない特別なコンストラクターです。これは、クラスのオブジェクトを作成し、いくつかの初期化操作を実行するために使用されます。クラス内にコンストラクターを明示的に定義しない場合、Java はデフォルトの引数なしのコンストラクターを自動的に提供します。

引数のないコンストラクターは次のように定義されます。
public class ClassName {
    
    
    // 无参构造函数
    public ClassName() {
    
    
        // 初始化代码
    }
}
予防:
  • 引数のないコンストラクターには、クラス名と同じ名前が付けられます。
  • 引数なしのコンストラクターには void 型を含む戻り値の型がないため、記述する必要はありません。
  • パラメーターを持つコンストラクター (パラメーター コンストラクター) がクラスで明示的に定義されているが、パラメーターなしのコンストラクターが定義されていない場合、コンパイラーはパラメーターなしのコンストラクターを自動的に提供しません。
  • 各クラスは、引数のないコンストラクターやパラメーター付きのコンストラクターなど、複数のコンストラクターを持つことができます。ここに画像の説明を挿入

(1) 説明:

构造方法是用来初始化对象的特殊方法。具体使用取决于需求。

コードでは、Student クラスのオブジェクトが作成され、デフォルトのコンストラクターを使用してオブジェクトが初期化されます。
新しい Student オブジェクトが作成され、パラメータ化されたコンストラクターを使用してオブジェクトが初期化されます。

在默认的构造方法中,对象的属性会被初始化为默认值。
  有参构造方法中,可以通过传入参数来指定对象的属性值。

コードでは、引数なしの構築メソッドを使用してオブジェクトを作成し、オブジェクトの setName メソッドと setAge メソッドを呼び出してオブジェクトのプロパティ値を設定します。

オブジェクトの作成時にオブジェクトのプロパティ値を指定したい場合は、パラメータ化された構築方法を使用できます。
パラメータ化された構築メソッドはパラメータを受け入れ、パラメータの値をオブジェクトのプロパティに割り当てることができます。
オブジェクトの作成中に、プロパティ値を必要な値に初期化します。

总结起来,无参构造方法适用于对象的属性值可以在创建对象后再进行设置的情况,
	而有参构造方法适用于在创建对象时就需要指定属性值的情况。

(2) Java の引数なしのコンストラクターは、デフォルト値を変更するために使用されるのではなく、オブジェクトの作成時に特定の操作を実行するか、インスタンス変数を初期化するために使用されます。

无参构造方法是指没有参数的构造方法,它不接受任何输入参数,因此无法通过参数传递值来修改默认值。
[ 0 ] 主に次のような状況で使用されます。
  1. オブジェクトの作成時には、特定の操作を実行する必要があります。引数なしのコンストラクターは、ファイルを開く、データベース接続の確立など、オブジェクトの作成時に必要な操作を実行できます。

  2. インスタンス変数の初期化: 引数のないコンストラクターはインスタンス変数の初期値を設定できますが、これはデフォルト値を変更するものではなく、インスタンス変数に初期値を割り当てるものです。

package work629;

public class BOOK {
    
    
    private  String author;
    private String title;
    private double price;
    private String publisher;
    private int publishedYear;

    public BOOK() {
    
    
        this("12", "123", 12,  "12", 1);
    }

    public BOOK(String author1, String title, double price, String publisher, int i) {
    
    
        author = author1;
        this.title = title;
        this.price = price;
        this.publisher = publisher;
        this.publishedYear = i;
    }

    public String getAuthor() {
    
    
        return author;
    }

    public void setAuthor(String author1) {
    
    
        author = author1;
    }

    public String getTitle() {
    
    
        return this.title;
    }

    public void setTitle(String title) {
    
    
        this.title = title;
    }

    public double getPrice() {
    
    
        return this.price;
    }

    public void setPrice(double price) {
    
    
        this.price = price;
    }

    public String getPublisher() {
    
    
        return this.publisher;
    }

    public void setPublisher(String publisher) {
    
    
        this.publisher = publisher;
    }

    public int getPublishedYear() {
    
    
        return this.publishedYear;
    }

    public void setPublishedYear(int publishedYear) {
    
    
        this.publishedYear = publishedYear;
    }

    public void showDisplayBook() {
    
    
        System.out.println("Author: " + author);
        System.out.println("Title: " + this.title);
        System.out.println("Price: " + this.price);
        System.out.println("Publisher: " + this.publisher);
        System.out.println("Published Year: " + this.publishedYear);
    }
}
[1] このキーワードは Java で現在のオブジェクトを参照するために使用されます。このコードでは、this キーワードが 2 つの異なる場所で使用されています。-------->this キーワードを使用してパラメーター化されたコンストラクターを呼び出し、デフォルトのパラメーター値を渡すことで、パラメーターなしのコンストラクターはこれらのパラメーター値を使用してオブジェクトのプロパティを初期化できます。

[ 1 ] 引数のないコンストラクターはpublic BOOK()、内部で引数-引数コンストラクターを呼び出しますpublic BOOK(String author1, String title, double price, String publisher, int i)パラメーターなしのコンストラクターは、this キーワードでパラメーター化されたコンストラクターを呼び出し、デフォルトのパラメーター値を渡すことで、これらのパラメーター値を使用してオブジェクトのプロパティを初期化できます。

[2] パラメータ化されたコンストラクターではpublic BOOK(String author1, String title, double price, String publisher, int i)、これは現在のオブジェクトのプロパティを参照するために使用されます。これは、コンストラクターのパラメーターとオブジェクトのプロパティを区別するためです。this キーワードを使用すると、コンストラクターに渡されたパラメーターの値をオブジェクトのプロパティに割り当てることができます。
ここに画像の説明を挿入

したがって、BOOK オブジェクトを作成するときに引数が指定されていない場合は、引数なしのコンストラクターが呼び出され、オブジェクトのプロパティがデフォルトの引数値で初期化されます。

[2] デフォルト値の後に変更:

ここに画像の説明を挿入

[1] 基本形式:クラス内では、そのクラスと同名のメソッドが構築メソッドとなります。

public class Student {
    
    
修饰符 类名(参数) {
    
    
方法体;}
}

特徴: 構築メソッドは、static、final、synchronized、abstract、native (abstract に類似) によって変更できません。コンストラクターの戻り値は暗黙的であるため、コンストラクターで return を使用して現在のクラスのオブジェクトを返さないでください。

構築メソッドは特別なタイプのメソッドであり、クラス名と同じで、同じ case を持ちます。戻り値の型はなく、void さえも持たず、特定の戻り値もありません (結果データはメソッドによって返されません)。 return ステートメント)。

构造方法的作用是在创建对象时自动执行,用于初始化对象的属性和成员变量,
	为对象设置默认值,以确保对象在创建时具有正确的状态和属性。

この工法には次のような特徴があります。

  1. メソッド名はクラス名と同じである必要があり、戻り値の型はありません。
  2. コンストラクターはオブジェクトの作成時に自動的に呼び出され、手動で呼び出すことはできません。
  3. 複数のオーバーロードされたバージョンが存在する可能性があり、渡されたパラメーターに従って異なる構築方法が選択されます。
  4. この構築メソッドは、オブジェクトのメンバー変数やその他のプロパティを初期化するために使用でき、オブジェクトの作成時にプロパティの初期状態が正しいことを保証するためにデフォルト値を設定することもできます。
  5. コンストラクターはクラスのプライベート プロパティとメソッドにアクセスできますが、非静的クラス変数と非静的メソッドにはアクセスできません。
  6. オブジェクトが作成された後、コンストラクターはオブジェクトへの参照を呼び出し元に返します。

要約すると、コンストラクターは、オブジェクトの作成と初期化に使用される特別なタイプのメソッドです。その主な機能は、オブジェクトの作成時に自動的に実行され、オブジェクトの初期化を完了し、オブジェクトが正しい状態とプロパティを持つようにすることです。

仕組み: (1) コンストラクターは仮想マシンによって呼び出されます。手動で呼び出すことはできません。(2) オブジェクトが作成されるたびに、コンストラクタが 1 回呼び出されます

コンストラクターは、オブジェクトの状態を初期化し、必要なセットアップを実行する特別なタイプのメソッドです。Java では、キーワードを使用してnewオブジェクトを作成すると、仮想マシンは自動的に適切なコンストラクターを呼び出してオブジェクトを作成します1これは、コンパイラーとランタイム環境によって自動的に処理されるプロセスです。

理解を深めます

コンストラクターは、オブジェクトがインスタンス化されるときに呼び出されます。つまり、キーワード「new」を使用してオブジェクトを作成すると、Java は自動的にオブジェクトのコンストラクターを呼び出します。構築メソッドでは、オブジェクトの初期状態の設定、メモリ空間の割り当てなど、いくつかの初期化操作を実行できます。したがって、構築メソッドの実行のタイミングは、オブジェクトの作成時とみなすことができます。

[ 2 ] 引数の構築と非引数の構築

このうち、クラス名は構築メソッド名と同じで、戻り値の型はなく、構築メソッド本体は空でもかまいません。仮パラメータ リストには、カンマで区切られた複数のパラメータを含めることができます。

(1) 構築メソッドに関して、明示的と暗黙的の違いは主に構築メソッドの定義と呼び出し方法にあります。

1. 明示的なコンストラクター:

明示的なコンストラクターは、開発者によってクラス内で明示的に定義されるコンストラクターです。必要に応じて、さまざまなパラメーターを使用してコンストラクターを定義し、そのコンストラクターに特定の初期化ロジックを記述することができます。

public class Person {
    
    
    private String name;
    private int age;

    // 显式定义的无参构造方法
    public Person() {
    
    
        // 可以在这里进行默认初始化操作
        this.name = "Unknown";
        this.age = 0;
    }
    
   // 显式定义的有参构造方法
    public Person(String name, int age) {
    
    
        this.name = name;
        this.age = age;
    }
    // 其他方法和属性的定义...
}

上記の例では、パラメーター化されたコンストラクターとパラメーターなしのコンストラクターという 2 つのコンストラクターを明示的に定義しました。パラメータ化されたコンストラクタは、初期化のために名前と年齢を渡すために使用されますが、パラメータなしのコンストラクタはデフォルトの初期化に使用できます。

2. 暗黙的なコンストラクター:

暗黙的コンストラクターは、システムによって自動的に生成されるデフォルトのコンストラクターです。コンストラクターを明示的に定義しない場合、システムはデフォルトの引数なしのコンストラクターを提供します。通常は、単純なデフォルトの初期化が実行されます。サンプルコードは次のとおりです。

public class Person {
    
    
    private String name;
    private int age;

    // 默认的隐式构造方法

    // 其他方法和属性的定义...
}

コンストラクターを明示的に定義していないため、システムはデフォルトの引数なしのコンストラクターを提供します。このデフォルトのコンストラクターは、名前と年齢をデフォルトで初期化します (名前を null に、年齢を 0 に初期化するなど)。

因此,以下是使用默认的无参构造方法创建对象的示例代码

デフォルトの引数なしのコンストラクターを呼び出す Person person = new Person();

3. これらのコンストラクターを使用してオブジェクトを作成する場合、違いは次のとおりです。

明示的と暗黙的な違いは、コンストラクターの定義が手動で記述されるかどうかであり、コンストラクターの呼び出し方法ではありません。

Person person1 = new Person("Alice", 25); // 调用显式的有参构造方法
Person person2 = new Person(); // 调用显式的无参构造方法
Person person3 = new Person(); // 调用隐式的无参构造方法

明示的構築メソッドを使用すると、独自のニーズに応じて初期化でき、暗黙的構築メソッドを使用すると、システムがデフォルトの初期化メソッドを提供します。

(2) 引数なしの構築は、パラメータを持たないクラス内のメソッドです。パラメーターをとらず、オブジェクトの作成時に呼び出されるコンストラクター。

这种构造方法可以被用来初始化对象的实例变量,当对象被创建时自动调用。
public student() {
    
    
	空参构造
}

1. 構築メソッドを自分で記述していないのに、仮想マシンはなぜ空のパラメータ構築メソッドを追加するのでしょうか?

Java では、クラスのコンストラクターを明示的に作成しない場合、Java 仮想マシンはデフォルトの空のパラメーター コンストラクターを提供します。これは、すべてのクラスにコンストラクターが必要であり、そのクラスのオブジェクトを作成するために使用されるためです。

コンストラクターはオブジェクトを初期化するために使用される特別なメソッドであり、クラスと同じ名前を持ち、戻り値の型を持ちません。クラスのインスタンスを作成すると、コンストラクターが自動的に呼び出され、オブジェクトの状態が初期化されます。

コンストラクターを定義しない場合、Java コンパイラーはデフォルトの空のパラメーター コンストラクターを自動的に生成します。このデフォルトのコンストラクターはパラメーターを受け取らず、単にオブジェクト インスタンスを作成するだけです。

デフォルトの null 引数コンストラクターを提供する目的は、オブジェクトの作成時にエラーが発生しないようにすることです。デフォルトのコンストラクターがない場合、パラメーターなしのコンストラクターを使用してオブジェクトを作成すると、コンパイラーは適切なコンストラクターを見つけることができず、コンパイル エラーが発生します。

要約すると、Java 仮想マシンは、構築メソッドを明示的に定義しなくても、クラスのインスタンス化プロセスが正常に進行することを保証する、デフォルトの空のパラメータ構築メソッドを提供します。

2.== 解決すべき問題: 空のパラメータの属性を知る方法、それを呼び出す方法==

(3) パラメータ化された構造は、少なくとも 1 つのパラメータを含むクラス内のメソッドです。オブジェクトの作成時にパラメータを渡し、異なるパラメータに基づいて異なるオブジェクトを作成できます。

この構築メソッドは、オブジェクトのインスタンス変数を初期化するために使用でき、外部から渡されたパラメーターを受け入れることができます。パラメータ化された構造のパラメータは通常、オブジェクトの状態を設定するために使用されます。

public student(string name,int age) {
    
    
	带参构造..
}

【3】注意事項

  1. コンストラクターはクラスと同じ名前を持つ必要があり、戻り値の型はありません。
  2. コンストラクターにはアクセス修飾子を含めることができますが、戻り値の型を含めることはできません。
  3. 構築メソッドが定義されていない場合、Java コンパイラはデフォルトの引数なしの構築メソッドを自動的に生成しますが、引数なしの構築メソッドを自分で定義する場合は、引数なしの構築メソッドを自分で記述する必要があります。
  4. パラメーター化された構築メソッドを自分で定義する場合は、引数なしの構築メソッドを明示的に定義する必要があります。そうしないと、このクラスの引数なしの構築メソッドを使用できません。
  5. コンストラクターはオーバーロードできます。つまり、同じクラスに、名前は同じでパラメーターが異なる複数のコンストラクターを含めることができます。
  6. 構築メソッドでは、キーワード this (最初の行のステートメントである必要があります) を使用して、他の構築メソッドを呼び出すことができます。
  7. 静的変数または静的メソッドはクラスに属し、コンストラクターはオブジェクトに属しているため、コンストラクターで静的変数または静的メソッドを定義することはできません。
  8. コンストラクターを使用して、インスタンス変数を初期化したり、ファイルを開くなどの他の操作を実行したりできます。
  9. コンストラクターは継承できませんが、サブクラスは親クラスのコンストラクターを使用できます。
  10. コンストラクターはオブジェクトの作成時に呼び出す必要があり、手動で呼び出すことはできません。

その他の側面:

(1) 構築メソッドの定義 構築
メソッドが定義されていない場合、システムはデフォルトのパラメータなしの構築メソッドを提供します。
構築メソッドが定義されている場合、システムはデフォルトの構築メソッドを提供しません。 パラメータ コンストラクタが定義されると、システムはデフォルトの構築メソッドを提供しません
。パラメータの構築 コンストラクタがなくなったので、独自のパラメータなしのコンストラクタを記述する必要があります
(2) パラメータ付きのオーバーロードされたコンストラクタと
パラメータなしのコンストラクタは、メソッド名は同じですがパラメータが異なります。これはコンストラクタと呼ばれます。 オーバーロード
(3) 使用方法:空パラメータと全パラメータありの構築メソッドを随時手動で記述する
使用有無に関わらず、パラメータなしの構築メソッドと全パラメータありの構築メソッドを手動で記述します。
クラスが定義されると、それが記述されているかどうかに関係なく、デフォルトでパラメーターなしのコンストラクターが付属します。

[4] メソッドのオーバーロード: Java クラスとオブジェクト

メソッドのオーバーロードとは、同じクラス内で、メソッド名は同じだがパラメーター リストが異なる複数のメソッドを定義できることを意味します。これらのメソッドは、パラメーターの種類、パラメーターの数、またはパラメーターの順序の違いによって区別されます。このメソッドを呼び出すと、コンパイラは渡されたパラメータの型に応じて実行する特定のメソッドを決定します。これにより、コードの再利用性と可読性が向上します。

メソッドのオーバーロードは次の条件を満たす必要があります。

  • メソッド名は同じである必要があります。
  • パラメータ リストは異なるものである必要があり、パラメータ タイプの異なる組み合わせ、パラメータの数、またはパラメータの順序が異なる場合があります。
  • 戻り値の型は同じでも異なっていても構いません。

次に、メソッドのオーバーロードの概念を示す例を示します。

public class Calculator {
    
    
    public int add(int a, int b) {
    
    
        return a + b;
    }

    public double add(double a, double b) {
    
    
        return a + b;
    }

    public int add(int a, int b, int c) {
    
    
        return a + b + c;
    }
}

上の例では、Calculatorクラスは、add異なるパラメーター リストで名前が付けられた 3 つのメソッドを定義しています。最初のメソッドは 2 つの整数パラメータを受け取り、その合計を返します。2 番目のメソッドは、2 つの倍精度浮動小数点パラメータを受け取り、その合計を返します。3 番目のメソッドは、3 つの整数パラメータを受け取り、その合計を返します。このように、Calculatorクラスを使用するときに、addさまざまなニーズに応じて適切な方法を選択できます。

全体として、メソッドのオーバーロードを使用すると、同じメソッド名を使用してさまざまなタイプや数のパラメータを処理できるため、より柔軟なコード設計とメソッドの呼び出しが可能になります。

要約する

Java では、コンストラクターが明示的に定義されていない場合、すべてのクラスにデフォルトの引数なしのコンストラクターがあります。もちろん、1 つ以上のパラメーター化されたコンストラクターを作成してオブジェクトを初期化することもできます。新しいオブジェクトを作成するときは、定義されたコンストラクターを使用して初期化します。コンストラクターを指定しない場合、Java はオブジェクトのインスタンス変数を初期化するための引数なしのコンストラクターを自動的に提供します。

4._. JavaBeanクラス

>什么是封装对象代表什么,就得封装对应的数据,并提供数据对应的行为[如何正确设计对象的属性和方法]

JavaBean クラスは Java 言語の特別なクラスで、通常はある種のエンティティ オブジェクトを表すために使用されます。JavaBean クラスは通常、一連のプロパティ (プロパティ) とこれらのプロパティへのアクセス メソッド (ゲッターとセッター) で構成され、コンストラクター、メソッド、イベント ハンドラーなどを含めることもできます。JavaBean クラスは通常、データのカプセル化、送信、保存に使用されます。このようなクラスは、パブリック コンストラクターの使用、パブリックの setter および getter メソッドの提供など、特定の規約に従う必要があります。JavaBean クラスは Java プログラムの一般的なコンポーネントであり、複雑な GUI アプリケーション、Web アプリケーション、およびその他の種類の Java アプリケーションを構築するために使用できます。

[1]仕様

これは JavaBean 仕様に準拠するクラスの例です。
1. クラス名: CamelCase
2. メンバー変数は private で変更されます
。 3. 少なくとも 2 つの構築メソッドが提供されます: パラメーターなしの構築メソッド + すべてのパラメーターを使用した構築メソッド
4、メンバーメソッド:各メンバー変数に対応するsetXxx()/getXxx()を提供

public class Student {
    
    
    // 成员变量使用private修饰
    private String name;
    private int age;
    private String school;

    // 无参构造方法
    public Student() {
    
    
    }

    // 带全部参数的构造方法
    public Student(String name, int age, String school) {
    
    
        this.name = name;
        this.age = age;
        this.school = school;
    }

    // set和get方法
    public String getName() {
    
    
        return name;
    }

    public void setName(String name) {
    
    
        this.name = name;
    }

    public int getAge() {
    
    
        return age;
    }

    public void setAge(int age) {
    
    
        this.age = age;
    }

    public String getSchool() {
    
    
        return school;
    }

    public void setSchool(String school) {
    
    
        this.school = school;
    }

    // 其他行为
    public void study() {
    
    
        System.out.println("I'm " + name + ", I'm studying.");
    }

    public void sleep() {
    
    
        System.out.println("I'm " + name + ", I'm sleeping.");
    }
}

このうち、メンバー変数は private で変更され、構築メソッドが提供されており一个无参构造方法和一个带全部参数、各メンバー変数は対応するsetXxx()/getXxx()メソッドを提供します。さらに、study() と sleep() という 2 つの動作が提供されます。

ショートカットキー、ショートカット

(1) 一般的な Java エディタ: alt + insert
(2) Vscode: 右クリック - 画像 2 に示す場所に移動ここに画像の説明を挿入

[2] JavaBean クラスには通常、次のメソッドが含まれます。

1. コンストラクター:

JavaBean クラスは、newキーワードを使用してクラスのインスタンスを作成できるように、パラメーターなしのコンストラクターを提供する必要があります。パラメーターなしのコンストラクターに加えて、さまざまな初期化メソッドをサポートするために他のオーバーロードされたコンストラクターを提供できます。

//构造函数用于创建对象时进行初始化操作。
public class Person {
    
    
    private String name;
    private int age;

    public Person() {
    
    
        // 无参数构造函数
    }

    public Person(String name, int age) {
    
    
        this.name = name;
        this.age = age;
    }
    
    // 其他方法和属性...
}

Person クラスは、パラメーターなしのコンストラクターとパラメーター化されたコンストラクターを提供します。パラメーターなしのコンストラクターはデフォルトの Person オブジェクトを作成するために使用できますが、パラメーター化されたコンストラクターはオブジェクトの作成時に名前と年齢の両方を設定できます。

2. プロパティ アクセス メソッド (Getter および Setter):

通常、JavaBean クラスは、各プライベート プロパティに対応するパブリック アクセス メソッド、つまりゲッター メソッドとセッター メソッドを提供します。getter メソッドはプロパティの値を取得するために使用され、setter メソッドはプロパティの値を設定するために使用されます。

Getter方法用于获取私有属性的值,Setter方法用于设置私有属性的值。
public class Person {
    
    
    private String name;
    private int age;

    public String getName() {
    
    
        return name;
    }

    public void setName(String name) {
    
    
        this.name = name;
    }

    public int getAge() {
    
    
        return age;
    }

    public void setAge(int age) {
    
    
        this.age = age;
    }
    
    // 其他方法和属性...
}

上記の例では、 Person クラスは、名前を取得および設定するための getName() および setName() メソッドと、年齢を取得および設定するための getAge() および setAge() メソッドを提供します。

3.equals()そしてhashCode()方法:

通常、JavaBean クラスはオブジェクトを比較するときにメソッドをオーバーライドしequals()hashCode()適切に動作します。これにより、参照アドレスではなくオブジェクトの内容に基づいて比較とハッシュを実行できるようになります。

equals()方法用于比较对象是否相等,hashCode()方法用于计算对象的哈希值。
public class Person {
    
    
    private String name;
    private int age;
    
    // 构造函数、Getter和Setter方法...

    @Override
    public boolean equals(Object obj) {
    
    
        if (this == obj) {
    
    
            return true;
        }
        if (obj == null || getClass() != obj.getClass()) {
    
    
            return false;
        }
        Person person = (Person) obj;
        return age == person.age && Objects.equals(name, person.name);
    }

    @Override
    public int hashCode() {
    
    
        return Objects.hash(name, age);
    }
    
    // 其他方法...
}

上記の例では、equals() メソッドは名前と年齢を比較してオブジェクトが等しいかどうかを判断し、Objects.equals() メソッドを使用して null の可能性があるプロパティを処理します。hashCode() メソッドは、Objects.hash() メソッドを使用して、名前や年齢などのオブジェクトのハッシュ値を計算します。

4.toString()方法:

通常、JavaBean クラスはtoString()メソッドをオーバーライドして、オブジェクトのコンテンツ表現を文字列として返します。これは、デバッグやログ作成の際に非常に役立ちます。

toString()方法用于返回对象的字符串表示。
public class Person {
    
    
    private String name;
    private int age;
    
    // 构造函数、Getter和Setter方法...
    @Override
    public String toString() {
    
    
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
    // 其他方法...
}

上記の例では、 toString() メソッドは名前と年齢を含む文字列表現を返します。これはデバッグやログ作成に便利です。

5.clone()方法:

JavaBean クラスはCloneableインターフェースを実装し、clone()オブジェクトのクローン作成操作をサポートするメソッドを書き直すことができます。これにより、既存のオブジェクトを複製して新しいオブジェクトを作成することが可能になります。

clone()方法用于创建对象的副本
public class Person implements Cloneable {
    
    
    private String name;
    private int age;
    
    // 构造函数、Getter和Setter方法...

    @Override
    public Object clone() throws CloneNotSupportedException {
    
    
        return super.clone();
    }
    
    // 其他方法...
}

上記の例では、Person クラスは Cloneable インターフェイスを実装し、 clone() メソッドをオーバーライドします。super.clone() を呼び出して、オブジェクトの浅いコピーを作成します。

[3] Javaオブジェクトの破棄

Java でのオブジェクトの破棄は、ガベージ コレクターによって自動的に処理されます。ガベージ コレクターは、参照されなくなったオブジェクトを検出してクリーンアップし、オブジェクトが占有しているメモリを解放する責任があります。

オブジェクトが参照されなくなったとき、つまりオブジェクトを指す変数参照がなくなったとき、そのオブジェクトはリサイクル可能としてマークされます。ガベージ コレクターが実行されると、ヒープ メモリ内のオブジェクトがスキャンされ、参照されていないオブジェクトが再利用されます。

ガベージ コレクターの動作プロセスは次のとおりです。

  1. マーキング フェーズ: ガベージ コレクターはルート オブジェクト (静的変数、アクティブなスレッドなど) から開始し、すべての参照チェーンを再帰的に走査し、まだ参照されているすべてのオブジェクトをアクティブ オブジェクトとしてマークします。
  2. クリーンアップ フェーズ: ガベージ コレクターは、ライブ オブジェクトとしてマークされていないオブジェクトをクリーンアップして再利用します。再利用されたオブジェクトによって占有されていたメモリは解放されます。
  3. 編成フェーズ: クリア フェーズの後、ガベージ コレクターはヒープ メモリを編成してメモリの断片化を排除し、連続メモリ領域をより効率的に割り当てることができます。

オブジェクトの破棄はガベージ コレクターによって自動的に管理されます。オブジェクトを手動で破棄することはできません。System.gc()ただし、メソッドを呼び出すことでガベージ コレクション操作を実行するようにガベージ コレクターに通知できますが、すぐに実行されることは保証できません。

オブジェクトの破棄にはメモリ領域の解放のみが含まれ、他のクリーンアップ操作 (ファイルやネットワーク接続を閉じるなど) は含まれないことに注意してください。これらのリソースを解放するには、ブロックで操作を閉じるなど、手動で処理する適切なコードを使用する必要がありますfinally

要約:

  • Java でのオブジェクトの破棄は、ガベージ コレクターによって自動的に処理されます。
  • オブジェクトの破棄は、オブジェクトが参照されなくなり、ガベージ コレクターによってリサイクル可能としてマークされたときに発生します。
  • ガベージ コレクターは、マーク、スイープ、および整頓のフェーズを通じてガベージ コレクション操作を実行します。
  • オブジェクトを手動で破棄することはできませんが、ガベージ コレクターにガベージ コレクションの実行を提案することで、オブジェクトの破棄のタイミングに間接的に影響を与えることができます。

Java では、オブジェクトがガベージ コレクションされる状況は次のカテゴリに分類できます。

  1. オブジェクトは参照されなくなります。オブジェクトにそれを指す変数参照がない場合、つまりオブジェクトへのルート参照がない場合、そのオブジェクトはガベージになります。これには、null に設定されているか、スコープ外になってアクセスできなくなっているオブジェクトへのすべての参照が含まれます。

  2. 壊れた参照チェーン: オブジェクトに循環参照があり、この循環参照に他のオブジェクトに接続されている参照チェーンがない場合、これらの循環参照によって形成されるオブジェクトの組み合わせはガベージになります。既存の参照からはアクセスできないためです。

  3. 明示的な null 化: オブジェクトの参照を null に設定することで、オブジェクトが不要になったことを明示的に示すことができます。これが発生すると、ガベージ コレクターはやがてオブジェクトを回収します。

  4. Enforce System.gc(): 呼び出しSystem.gc()メソッドは、ガベージ コレクション操作を実行するようにガベージ コレクターに通知できます。ただし、すべてのガベージ オブジェクトがすぐに収集されることが保証されるわけではないため、ガベージ コレクションを強制することはお勧めできません。

ガベージ コレクションはガベージ コレクターによって自動的に処理され、オブジェクトを手動で破棄することはできないことに注意してください。ガベージ コレクターは定期的にチェックし、参照されなくなったガベージ オブジェクトを破棄します。

実際のプログラミングでは、不要なオブジェクトの作成を避け、ガベージ コレクターがガベージ オブジェクトをより効率的にリサイクルできるように、リソースを適時に解放する必要があります。

他の

ここに画像の説明を挿入

@Override とは何ですか、またこれが生成される理由は何ですか

@Overrideアノテーション (Annotation) であり、メソッドが親クラスのメソッドをオーバーライド (書き換え) するか、インターフェイスを実装することを示すために使用されます。これは、コンパイラや開発ツールに追加情報を提供するために Java 言語によって提供されるメタデータ メカニズムです。

注釈を生成する理由は@Override、コードの可読性と保守性を向上させるためです。親クラスのメソッドをオーバーライドしたり、インターフェイスを実装したりする目的でサブクラスにメソッドを記述する場合、アノテーションを追加することで、@Override親クラスまたはインターフェイスのメソッドをオーバーライドするつもりであることをコンパイラーや他の開発者に明確に伝えることができます。 , 新しいメソッドを誤って作成する代わりに。

誤ってアノテーションを使用しても@Override、実際には親クラスまたはインターフェイスのメソッドをオーバーライドしていない場合、コンパイラはエラーを報告し、コード ロジックをチェックするよう促します。

要約すると、@Overrideアノテーションはメソッド カバレッジ (オーバーライド) を識別するために使用される一種のメタデータであり、コンパイル時にエラーを検出するのに役立ち、コードの可読性が向上します。

勉強

1.>グループ
アクセサ メソッド (ゲッター) (リーダー メソッド/ゲッター メソッド): オブジェクトからプロパティ値を取得するために使用されるメソッド。
アクション: オブジェクトが実行できる操作または機能。
属性: オブジェクトの特性またはデータ。
動作 (behavior): オブジェクトの機能と動作モード。
コンストラクター (構築メソッド): オブジェクトを作成および初期化するメソッド。オブジェクトがインスタンス化されるときに呼び出されます。
日付フィールド (データ フィールド): 日付または時刻情報を格納するために使用される属性。
データフィールドのカプセル化 (データフィールドのカプセル化): データフィールドと操作をオブジェクト内にカプセル化し、実装の詳細を隠します。
デフォルトコンストラクタ (デフォルト構築メソッド): パラメータを必要としない構築メソッドであり、構築メソッドが明示的に定義されていない場合は、デフォルトで提供されます。
ドット演算子 (ドット演算子): object.property など、オブジェクトのプロパティとメソッドにアクセスするために使用される演算子。
インスタンス (instance): クラスの具体的なオブジェクト。
インスタンス変数: クラスのインスタンスに存在する属性または変数。

2.> グループの
インスタンス化 (インスタンス化): クラスのインスタンスを作成するプロセス。
ミューテーター メソッド (セッター) (セッター メソッド/モディファイア メソッド): オブジェクトのプロパティの値を変更するために使用されるメソッド。
no-arg コンストラクター (パラメーターなしコンストラクター): パラメーターのないコンストラクター。
オブジェクト指向プログラミング (OOP): カプセル化、継承、ポリモーフィズムを可能にするオブジェクトのコレクションとしてプログラムを編成するプログラミング パラダイム。
統一モデリング言語 (UML): ソフトウェア設計を視覚化し、形式化し、作成するための標準グラフィック言語。
package-private (package-access) (パッケージプライベート/パッケージアクセス): 同じパッケージ内のクラスのみへのアクセスを制限します。
private (プライベート): アクセス修飾子。同じクラス内のみにアクセスを制限します。
プロパティ (特性): オブジェクトの特性。通常はゲッター メソッドとセッター メソッドを通じてアクセスされます。
参照変数: オブジェクトへの参照を格納する変数。
参照タイプ: 変数が参照できるオブジェクトのタイプを指定します。
state (状態): オブジェクトの属性値の集合。オブジェクトの動作と特性を決定します。
静的メソッド: インスタンスではなくクラスに属し、クラス名によって直接呼び出すことができるメソッド。
静的変数: インスタンスではなくクラスに属する変数。

要約する

· クラスはオブジェクトのテンプレートです。これはオブジェクトのプロパティを定義し、オブジェクトを作成するためのコンストラクターとオブジェクトを操作するためのメソッドを提供します。
クラスもデータ型です。オブジェクト参照変数を宣言するために使用できます。オブジェクト参照変数はオブジェクトを保持しているように見えますが、実際にはそのオブジェクトへの参照のみが含まれています。厳密に言えば、オブジェクト参照変数とオブジェクトは異なりますが、ほとんどの場合、その違いは無視できる程度です。
· オブジェクトはクラスのインスタンスです。new 演算子を使用してオブジェクトを作成し、ドット演算子 (.) を使用してオブジェクトの参照変数を通じてオブジェクトのメンバーにアクセスできます。
· インスタンス変数またはメソッドは、クラスのインスタンスに属します。その使用はそれぞれのインスタンスに関連付けられています。静的変数は、同じクラスのすべてのインスタンスによって共有されます。静的メソッドはインスタンスを使用せずに呼び出すことができます。
`クラスのすべてのインスタンスは、このクラスの静的変数と静的メソッドにアクセスできます。ただし、わかりやすくするために、静的変数と静的メソッドを呼び出すには、「classname.variable」と「classname.method」を使用することをお勧めします。

· 修飾子は、クラス、メソッド、データへのアクセス方法を指定します。パブリック (パブリック) クラス、メソッド、またはデータにはどのクライアントからもアクセスできますが、プライベート (プライベート) メソッドまたはデータにはクラス内でのみアクセスできます。クライアントがデータを表示または変更できるように、get メソッドまたは set メソッドを提供できます。わかりやすく言うと、get メソッドはリーダー (またはアクセサー) と呼ばれ、set メソッドはセッター (またはモディファイア) と呼ばれます。
get メソッドには、シグネチャ public returnType getPropertyName() があります。戻り値の型 (returnType) が boolean の場合、get メソッドは public boolean isPropertyName() として定義する必要があります。set メソッドには、public void setPropertyName(dataType propertyValue) というシグネチャがあります。
メソッドに渡されるすべてのパラメータは値によって渡されます。プリミティブ型のパラメーターの場合は、実際の値が渡されますが、パラメーターが参照データ型の場合は、オブジェクトへの参照が渡されます。
Java 配列は、プリミティブ型またはオブジェクト型の値を含むオブジェクトです。オブジェクトの配列が作成されると、その要素にはデフォルト値の null が与えられます。

コンストラクター名がクラス名と同じなのはなぜですか?

コンストラクターの名前はクラスの名前と同じです。これは Java 言語の規則および規則の 1 つです。この設計上の選択により、オブジェクトの作成時にコンストラクターを自動的に呼び出すことができます。

newキーワードを使用してクラスのインスタンスを作成すると、コンパイラはクラス名に一致するコンストラクターを探し、それを自動的に呼び出してオブジェクトを初期化します。したがって、コンストラクターの名前はクラス名と同じになり、コンストラクターを簡単に識別し、それが属するクラスに関連付けることができます。

さらに、コンストラクター名をクラス名と同じにすることも、コードの読みやすさと理解しやすさの向上に役立ちます。同じ名前を使用することで、プログラマはオブジェクトの作成に使用されたコンストラクタがどのメソッドであるかを直感的に知ることができます。

コンストラクターの名前はクラスと同じですが、そのシグネチャ (パラメーターの型と順序) は一意である必要があることに注意してください。したがって、複数のコンストラクターが同じクラスで定義されている場合は、渡されるパラメーターに基づいて区別できるように、異なるパラメーター リストを持つ必要があります。これは Java におけるメソッドのオーバーロードの概念であり、異なるパラメーター リストを通じて同じ名前のメソッドまたはコンストラクターを区別します。

public class MyClass {
    
    
    private int value;

    // 构造函数
    public MyClass(int value) {
    
    
        this.value = value;
    }

    public int getValue() {
    
    
        return value;
    }

    public static void main(String[] args) {
    
    
        // 创建 MyClass 对象的实例
        MyClass myObject = new MyClass(10);

        // 访问对象的方法
        int result = myObject.getValue();
        System.out.println("Value: " + result);
    }
}

コンストラクターはオブジェクトの作成時に自動的に呼び出され、一度だけ呼び出され、戻り値の型はありません。

package work629;

public class BOOK {
    
    
    private String author;
    private String title;
    private double price;
    private String publisher;
    private int publishedYear;

    public BOOK() {
    
    
    }

    public BOOK(String author, String title, double price, String publisher, int publishedYear) {
    
    
        this.author = author;
        this.title = title;
        this.price = price;
        this.publisher = publisher;
        this.publishedYear = publishedYear;
    }

    public String getAuthor() {
    
    
        return this.author;
    }

    public void setAuthor(String author) {
    
    
        this.author = author;
    }

    public String getTitle() {
    
    
        return this.title;
    }

    public void setTitle(String title) {
    
    
        this.title = title;
    }

    public double getPrice() {
    
    
        return this.price;
    }

    public void setPrice(double price) {
    
    
        this.price = price;
    }

    public String getPublisher() {
    
    
        return this.publisher;
    }

    public void setPublisher(String publisher) {
    
    
        this.publisher = publisher;
    }

    public int getPublishedYear() {
    
    
        return this.publishedYear;
    }

    public void setPublishedYear(int publishedYear) {
    
    
        this.publishedYear = publishedYear;
    }

    public void showDisplayBook() {
    
    
        System.out.println("Author: " + this.author);
        System.out.println("Title: " + this.title);
        System.out.println("Price: " + this.price);
        System.out.println("Publisher: " + this.publisher);
        System.out.println("Published Year: " + this.publishedYear);
    }
}

ここにBOOKという名前の Java クラスがあり、次のメンバー変数とメソッドがあります。

メンバー変数:

  • author:本の著者を示します。
  • title:本のタイトルを示します。
  • price:本の価格を示します。
  • publisher:本の出版社を示します。
  • publishedYear:本の発行年を示します。

コンストラクタ:

  • BOOK(): 引数のないコンストラクター。空のBOOKオブジェクトを作成するために使用されます。
  • BOOK(String author, String title, double price, String publisher, int publishedYear)BOOK:オブジェクトの作成時にメンバー変数を初期化するためのパラメーターを持つコンストラクター。

方法:

  • Getter メソッドと Setter メソッド: メンバー変数の値を取得および設定するために使用されます。
  • showDisplayBook(): 著者、タイトル、価格、出版社、出版年などの本の詳細を印刷するために使用されます。

このクラスは、書籍オブジェクトを表現および操作するための便利な方法を提供します。オブジェクトを作成しBOOK、コンストラクターを使用してプロパティ値を設定し、提供されたメソッドを使用してプロパティを取得および変更し、書籍の詳細を表示できます。

Java の命名規則に従って、クラス名は大文字 ( BooknotなどBOOK) で始まる必要があることに注意してください。これは、一般的なコーディング標準に準拠しています。

showDisplayBook() はコンストラクターではなく、通常のインスタンス メソッドです。コンストラクターはオブジェクトの状態を初期化するために使用され、showDisplayBook() メソッドは本の詳細を表示するために使用されます。

コンストラクターはオブジェクトの作成時に自動的に呼び出され、一度だけ呼び出され、戻り値の型はありません。提供したコードには 2 つの構築メソッドがあります。1 つは空の BOOK オブジェクトを作成するために使用される引数なしの構築メソッド BOOK() で、もう 1 つは構築メソッド BOOK(String author, String title, double BOOK オブジェクトの作成時にメンバー変数を初期化するために使用されます。

showDisplayBook() メソッドは、書籍の詳細情報を印刷するためのパブリック インスタンス メソッドです。パラメータも戻り値もありません。BOOK オブジェクトを作成した後にこのメソッドを呼び出して、書籍に関する情報を表示できます。

自動呼び出しのプロセスは次のようになります。

キーワードを使用してnewオブジェクトを作成する場合、Java は次の手順を実行してコンストラクターを自動的に呼び出します。

  1. オブジェクトのメンバー変数とメソッドを格納するために、メモリ内にオブジェクト用の領域を割り当てます。
  2. どのコンストラクターを使用するかを決定します (引数なしまたはパラメーター化されたコンストラクター)。
  3. 選択したコンストラクターを呼び出して、オブジェクトを初期状態に初期化します。
  4. 新しく作成されたオブジェクトへの参照を返します。

具体的なプロセスは次のとおりです。

  1. newオブジェクトは、などのキーワードを使用して作成されますBook book = new Book();
  2. Java はオブジェクト用にメモリ内のスペースを割り当てます。
  3. 構築メソッドの選択に応じて、呼び出す対応する構築メソッドを選択します。
    • 引数のないコンストラクターが使用される場合、BOOK()コンストラクターはオブジェクトを初期化するために直接呼び出されます。
    • パラメーターを含む構築メソッドを使用する場合、指定されたパラメーター ( など) のタイプと量に応じて、呼び出す適切な構築メソッドが一致しますnew Book("Author", "Title", 10.99, "Publisher", 2021);
  4. コンストラクター内では、メンバー変数の初期化、特定のロジックの実行など、必要な操作を実行できます。
  5. コンストラクターの実行が完了すると、新しく作成されたオブジェクトへの参照が返されます。
  6. オブジェクトの参照を variable に割り当てbook、変数を介してオブジェクトのメンバー変数とメソッドにアクセスして操作できるようにします。

要約すると、コンストラクターを自動的に呼び出すプロセスは、オブジェクトの作成時に選択されたコンストラクターに従って初期化され、新しく作成されたオブジェクトへの参照を返すことになります。このようにして、オブジェクトを通じてそのメンバー変数とメソッドにアクセスし、操作することができます。

プロパティの値を取得するための Getter メソッド
方法会操作对象并访问他们的实例字段。

優れたクラスには次のことが必要です。

データを非公開にする; データを初期化する; 名前を知る; クラスにあまり責任を負わせない、忘れやすいかもしれない

Javaのコンストラクターでデータを初期化するとはどういう意味ですか?

Java では、コンストラクターは、オブジェクトの作成時に自動的に呼び出される特別なメソッドです。コンストラクターでのデータの初期化とは、オブジェクトの作成時にコンストラクターを通じてオブジェクトのプロパティまたは変数に初期値を割り当てることを意味します。これにより、オブジェクトの作成時にその初期状態が正しいことが保証され、その後のオブジェクトの使用時に予期せぬエラーが発生することはありません。データを初期化する方法には、直接割り当て、他のメソッドを呼び出して初期化する、外部ファイルまたはデータベースからデータを読み取るなどがあります。

例:

属性 name と age を含む Person という名前のクラスがあり、これら 2 つの属性をコンストラクターで初期化する必要があるとします。

  1. 直接割り当て:
public class Person {
    
    
    private String name;
    private int age;

    public Person(String name, int age) {
    
    
        this.name = name;   // 直接赋值
        this.age = age;
    }
}

Person オブジェクトを作成するときは、コンストラクターを呼び出して名前と年齢を渡し、コンストラクター内の名前と年齢のプロパティに初期値を割り当てます。

  1. 他のメソッドを呼び出して初期化します。
public class Person {
    
    
    private String name;
    private int age;

    public Person(String name, int age) {
    
    
        setName(name);   // 调用其他方法来初始化
        setAge(age);
    }

    public void setName(String name) {
    
    
        this.name = name;
    }

    public void setAge(int age) {
    
    
        this.age = age;
    }
}

コンストラクターで setName メソッドと setAge メソッドを呼び出して、プロパティを初期化します。

  1. 外部ファイルまたはデータベースからデータを読み取ります。
public class Person {
    
    
    private String name;
    private int age;

    public Person() {
    
    
        try {
    
    
            Properties prop = new Properties();
            prop.load(new FileInputStream("person.properties"));
            this.name = prop.getProperty("name");   // 从外部文件中读取数据
            this.age = Integer.parseInt(prop.getProperty("age"));
        } catch (IOException e) {
    
    
            e.printStackTrace();
        }
    }
}

コンストラクターの person.properties ファイルから name プロパティと age プロパティの値を読み取ります。

メソッドとクラスの違いと関係

メソッドとクラスは、オブジェクト指向プログラミングにおける 2 つの重要な概念です。

クラスは、同様の属性と動作を持つオブジェクトのクラスを表す抽象概念です。クラスはオブジェクトの構造と動作を定義し、同じプロパティと動作を持つ複数のオブジェクトを作成するために使用できます。コードでは、クラスは通常、キーワード class を使用して定義されます。

メソッドは、クラスの動作を定義するクラスのメンバーです。メソッドは、特定のタスクを実行する再利用可能なコードです。メソッドはクラスのプロパティにアクセスし、値を返すことができます。コードでは、メソッドは通常、クラス内で定義され、クラスのインスタンスを通じて呼び出すことができます。

クラスとメソッドの間には次の関係があります。

クラスには、クラスの動作を定義する複数のメソッドを含めることができます。
メソッドは、特定のタスクを実行するためにクラスのプロパティにアクセスできます。
クラスのインスタンスは、メソッドを呼び出すことで特定の操作を実行できます。
以下は、クラスとメソッドの関係を示すサンプル コードです。

public class MyClass {
    
    
    private int myProperty;

    public void setMyProperty(int value) {
    
    
        myProperty = value;
    }

    public int getMyProperty() {
    
    
        return myProperty;
    }
}

public class Main {
    
    
    public static void main(String[] args) {
    
    
        MyClass myObject = new MyClass();
        myObject.setMyProperty(10);
        int value = myObject.getMyProperty();
        System.out.println(value); // 输出 10
    }
}

上記のコードでは、MyClass は、myProperty プロパティの値を設定および取得するための 2 つのメソッド setMyProperty および getMyProperty を含むクラスです。Main クラスの main メソッドで、MyClass のインスタンス myObject を作成し、メソッドを呼び出すことでプロパティの値を設定および取得します。

クラスとテスト クラスを 1 つのファイルに記述する場合は注意する必要があることに注意してください。

1.> クラスとテスト クラスの両方をパブリックにしない、またはエラーを報告しないThe public type Dog must be defined in its own file[提供されたコードと質問によると、問題はコード内の 2 つのパブリック クラスの定義にあり、Java では各ソース ファイルがパブリック クラスのみを持つことができ、その名前はファイル名と同じである必要があります。

package worrk705;

public class DogTest {
    
    
    public static void main(String[] args) {
    
    
        // 创建Dog对象
        Dog d = new Dog();
        // 调用Dog对象的runs()方法
        d.runs();
    }
}

class Dog {
    
    
    // 定义一个jump()方法
    public void jump() {
    
    
        System.out.println("正在执行jump方法");
    }

    // 定义一个runs()方法,runs()方法需要借助jump()方法
    public void runs() {
    
    
        Dog d = new Dog();
        d.jump();
        System.out.println("正在执行 runs 方法");
    }
/**public void runs() {
    // 使用this引用调用runs()方法的对象
    this.jump();
    System.out.println("正在执行runs方法");
}
*/

// public void run1() { jump(); System.out.println("正在执行run方法"); }
}
实际上下面的两者,只要和文件名一样的就好
  1. テスト クラス パッケージ クラスの場合:
    クラスを自分でテストする必要があります {MAIN call; CLASS class}

  2. クラスがテスト クラスをラップする場合:
    それはクラス {プロパティ メソッド; メインで呼び出される}

これら 2 つの Dog d = new Dog(); 相互に影響を与えないのはなぜですか:

  1. これら 2 行のコードは 2 つの異なる Dog オブジェクトを作成し、それらは 2 つの異なる変数 d に割り当てられます。これらは同じタイプと名前を持っていますが、2 つの別個のインスタンスです。
  2. DogTest クラスの main メソッドでは、最初に Dog オブジェクト d が作成され、次に d の run メソッドが呼び出されます。run メソッド内で、新しい Dog オブジェクト d が作成され、その Jump メソッドが呼び出されます。
  3. 2 つの Dog オブジェクトは別個のインスタンスであるため、それらの間には直接的な影響はありません。各オブジェクトには独自のメモリ空間と状態があります。したがって、最初の Dog オブジェクトの作成と run メソッドの呼び出しは、2 番目の Dog オブジェクトには影響しません。
    ここに画像の説明を挿入

これとオブジェクトの作成との比較:

このコードは、Jump()、runs()、および run1() の 3 つのメソッドを含む Dog という名前のクラスを定義します。run() メソッドでは、Dog オブジェクト d が作成され、その後、jump() メソッドが呼び出され、メッセージが出力されます。run() メソッドでは、this キーワードを使用して Jump() メソッドが呼び出され、メッセージが出力されます。run1() メソッドでは、jump() メソッドが直接呼び出され、メッセージが出力されます。

これら 3 つのメソッドの機能は似ており、すべて Jump() メソッドを呼び出してメッセージを出力します。違いは、新しい Dog オブジェクトが run() メソッドで作成されるのに対し、run() メソッドと run1() メソッドは現在のオブジェクトの Jump() メソッドを呼び出すことです。

[runs() メソッドで、新しい Dog オブジェクトを作成して Jump() メソッドを呼び出します。つまり、runs() メソッドが呼び出されるたびに、新しい Dog オブジェクトが作成され、その Jump() メソッドが呼び出されます。この方法では、毎回新しいオブジェクトを作成する必要があるため、メモリの無駄が発生する可能性があります。

run() メソッドでは、this キーワードを通じてメソッドを呼び出すオブジェクトを参照することで、jump() メソッドが呼び出されます。これは、 run() メソッドが呼び出されるときに、現在のオブジェクトを使用して Jump() メソッドが呼び出されるということを意味します。この方法は、新しいオブジェクトを作成する必要がなく、現在のオブジェクトを直接使用する必要がないため、より効率的です。

したがって、パフォーマンスの観点から見ると、新しいオブジェクトの作成に伴うオーバーヘッドが回避されるので、 run() メソッドの方が効率的です。

これら 3 つのメソッドの違いを比較すると、run() メソッドで新しい Dog オブジェクトが作成され、run() メソッドと run1() メソッドが現在のオブジェクト メソッドで Jump() を呼び出していることがわかります。さらに、runs() メソッドと run() メソッドはどちらも this キーワードを使用して現在のオブジェクトを参照します。

run1()、run2()、および run3() は、Dog クラスの 3 つの異なるメソッドです。以下は、それらの使用上の相違点と類似点についての説明です: 中国語で答えてほしい·

run1()、run2()和run3()是Dog类中的三个不同方法。它们在使用上有一些区别和相似之处。

まず、これら 3 つのメソッドの定義と実装を見てみましょう。

public void run1() {
    
    
    Dog d = new Dog();
    d.jump();
    System.out.println("正在执行run1方法" + '\n');
}

public void run2() {
    
    
    this.jump();
    System.out.println("正在执行run2方法" + '\n');
}

public void run3() {
    
    
    jump();
    System.out.println("正在执行run3方法");
}

run1() メソッドでは、新しい Dog オブジェクトを作成し、jump() メソッドを呼び出します。次に、メッセージを印刷しました。このメソッドでは this キーワードを使用しません。

run2 メソッドでは、this.jump() を使用してジャンプ メソッドを呼び出します。this キーワードは現在のオブジェクトを表すため、this.jump() は現在のオブジェクトのジャンプ メソッドを呼び出します。

run3 メソッドでは、jump() を直接使用して、jump メソッドを呼び出します。同じクラス内では、クラス内のメソッドを直接呼び出すことができます、 object または this キーワードを使用せずに。

次に、これら 3 つの方法の違いと類似点を見てみましょう。

類似点:

3 つのメソッドはすべて、jump() メソッドを呼び出します。
3 つのメソッドはすべてメッセージを出力しました。

違い:

run1() メソッドは、新しい Dog オブジェクトを作成し、jump() メソッドを呼び出します。これは、run1() メソッドが呼び出されるたびに、新しいオブジェクトが作成されることを意味します。

(1)run1()run2()
  1. run1()メソッド内:
  • メソッド内で新しいDogオブジェクトが作成されますd
  • dオブジェクトのメソッドが呼び出されましたjump()。ここで、はクラスのインスタンスdです。Dog
  • dこれは、新しく作成されたオブジェクトのメソッドが呼び出されたことを意味しますjump()
  • run1()最後に、メソッドが実行中であることを示すメッセージを出力します。

2.run2()メソッド内:

  • this.jump()現在のオブジェクト (クラスのインスタンス)Dogのメソッドを呼び出すために使用しますjump()
  • thisキーワードはクラスの現在のインスタンスを指します。この場合、これはrun2()呼び出し元のオブジェクトと同じです。
  • したがって、同じオブジェクト (クラスのインスタンス)Dogのメソッドが呼び出されますjump()
  • run2()この後、メソッドが実行中であることを示すメッセージが出力されます。

要約すると、run1()と のrun2()メソッドは両方とも同じ結果を達成します。つまり、Dog同じオブジェクト (クラスのインスタンス) のメソッドを呼び出しますjump()主な違いは、メソッド呼び出しの記述方法です。 の新しいインスタンスは をrun1()呼び出す前に作成されますが、キーワードを使用すると、現在のオブジェクトで直接呼び出しますjump()Dogrun2()thisjump()

(2)run1()run3()
  1. run1()メソッド内:
  • 新しいDogオブジェクトが作成されますd
  • dオブジェクトのメソッドが呼び出されましたjump()
  • run1()メソッドが実行中であることを示すメッセージを出力します。
  1. run3()メソッド内:
  • メソッドは直接呼び出されますjump()
  • jump()メソッドは同じクラスDog内で定義されているため、オブジェクトやthisキーワードを使用せずに直接呼び出すことができます。
  • run3()メソッドが実行中であることを示すメッセージを出力します。

いずれにしても、主な違いは、run1()メソッド内で新しいDogオブジェクトが作成され、そのオブジェクトのjump()メソッドが呼び出されることです。このクラスのメソッドは同じクラス内で直接呼び出すことができるため、現在のオブジェクトのメソッドを直接呼び出します (クラスのインスタンスで呼び出されると仮定run3()ます)。Dogjump()

(3)Run2Run3
  1. run2()メソッド内:
  • run2 メソッドでは、this.jump() を使用してジャンプ メソッドを呼び出します。this キーワードは現在のオブジェクトを表すため、this.jump() は現在のオブジェクトのジャンプ メソッドを呼び出します。
    – this.jump() を使用して、現在のオブジェクト (Dog クラスのインスタンス) に対して Jump() メソッドを呼び出します。
    – this キーワードは、クラスの現在のインスタンス、この場合は run2() を呼び出したのと同じオブジェクトを参照します。
    – 同じオブジェクト (Dog クラスのインスタンス) の Jump() メソッドが呼び出されます。
    – run2()メソッドが実行中であることを示すメッセージを出力します。
  1. run3()メソッド内:
  • run3 メソッドでは、jump() を直接使用して、jump メソッドを呼び出します。同じクラス内では、object や this キーワードを使用せずに、クラス内のメソッドを直接呼び出すことができます。
    - Jump() メソッドが直接呼び出されます。
    – Jump() メソッドは同じ Dog クラスで定義されているため、object や this キーワードを使用せずに直接呼び出すことができます。
    – run3()メソッドが実行中であることを示すメッセージを出力します。

この例では、run2 メソッドと run3 メソッドの両方が同じクラスに定義されているため、クラス内のメソッドに直接アクセスできます。したがって、ここでは this キーワードには実際の効果や違いはありません。

ただし、クラスのメソッド内にクラス メンバー変数と同じ名前のローカル変数がある場合、this キーワードを使用すると、ローカル変数ではなくクラス メンバー変数にアクセスすることを明確に示すことができます。これは this キーワードの一般的な使用法です。

最終的な比較:

  • run1() メソッド: 新しい Dog オブジェクト d を作成し、jump() メソッドを呼び出します。これは明示的な呼び出しです。

  • run2() メソッド: this.jump() を使用して、現在のオブジェクトの Jump() メソッドを呼び出します。これも明示的な呼び出しですが、 this キーワードを使用して、現在のオブジェクトのメソッドを呼び出していることを明確にします。

  • run3() メソッド: 同じクラス内ではクラス内のメソッドを直接呼び出すことができるため、jump() メソッドを直接呼び出します。これも明示的な呼び出しです。

要約:
  • run1() は、jump() メソッドを呼び出すための新しいオブジェクトを作成します。
  • run2() と run3() は両方とも、現在のオブジェクトに対して Jump() メソッドを呼び出します。ここで、run2() は明示的に this キーワードを使用します。
    この例では、同じクラス内ではクラスのメソッドを直接呼び出すことができるため、これら 3 つのメソッド呼び出しの結果は同じになります。違いは、コードの明確さと意味論的な表現にあります。
次のように:

ここに画像の説明を挿入

vscode がプレビュー モードで別のファイルをクリックすると、置き換えられないのはなぜですか?

推奨されるショートカット キーは Ctrl+Shift+P です。検索ボックスに設定を入力して検索します。[ユーザー設定] オプションを参照して、クリックして開き、「enablePreview」と入力して検索します。
ここに画像の説明を挿入


  1. [para1]: Java を含む多くのオブジェクト指向プログラミング言語では、オブジェクトの作成には通常、コンストラクターの使用が含まれます。コンストラクターは、オブジェクトの状態を初期化し、必要なセットアップを実行する特別なタイプのメソッドです。Java では、キーワード「new」を使用してオブジェクトを作成すると、仮想マシンは自動的に適切なコンストラクターを呼び出してオブジェクトを作成します。これは、コンパイラーとランタイム環境によって自動的に処理されるプロセスです。
    [para2]: コンストラクターを手動で呼び出すことができない理由は、コンストラクターの目的がオブジェクトの作成時に必要な初期化操作を実行することであるためです。コンストラクターを手動で呼び出すと、既存のオブジェクトに対して初期化操作を実行することと同じになり、混乱やオブジェクトの状態の不一致が生じる可能性があります。さらに、コンストラクター メソッドには、メモリの割り当て、デフォルト値の設定など、オブジェクト作成プロセスに固有のロジックが含まれる場合があります。これらの手順は仮想マシンによって処理され、オブジェクトが正しく作成されるようになります。
    [para3]: クラスでコンストラクターを定義すると、仮想マシンはオブジェクトの作成時に呼び出す適切なコンストラクターを自動的に選択します。パラメーターに応じて、コンストラクターの複数のオーバーロード形式が存在する可能性があります。仮想マシンは、提供されたパラメーターのタイプと数に基づいて、呼び出すコンストラクターを選択します。
    [para4]: 要約すると、オブジェクトの作成は、初期化操作を実行するための適切なコンストラクターの呼び出しを含め、仮想マシンによって自動的に処理されます。これはコンパイラとランタイム環境によって自動的に行われるため、コンストラクターを手動で呼び出す必要はありません。↩︎

おすすめ

転載: blog.csdn.net/m0_74154295/article/details/131384354