VScode で Java クラスとオブジェクトを学ぶ (Java の明示的パラメータと暗黙的パラメータ、静的メソッド + メイン メソッド、Java アクセス修飾子、静的キーワード、Java パッケージ、オブジェクト配列) 第 3 回シリーズ

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

「VScode で Java を学ぶ (Java クラスとオブジェクト)」の続き このメソッドはオブジェクトを操作し、そのインスタンス フィールドにアクセスします。


メソッドはオブジェクトを操作し、そのインスタンス フィールドにアクセスします。

Wu._. 明示的パラメータと暗黙的パラメータ:

Java では、明示的パラメータと暗黙的パラメータは、メソッド呼び出しにおける 2 つの異なるタイプのパラメータです。

1. 明示的なパラメータ:

它们是在方法调用时明确传递给方法的参数。
这些参数在方法调用表达式中以逗号分隔,并且要与方法定义中的形式参数匹配。显式参数提供了方法执行所需的具体值。

サンプルコードは次のとおりです。

public class ExplicitParametersExample {
    
    

    // 方法定义中的形式参数为 x 和 y
    public static int sum(int x, int y) {
    
    
        return x + y;
    }

    public static void main(String[] args) {
    
    
        int a = 5;
        int b = 10;

        // 显式参数 5 和 10 被传递给 sum 方法
        int result = sum(a, b);

        System.out.println("Sum: " + result);
    }
}

注釈サイクル:

  • 7 行目:sumメソッド パラメータxと はy明示的なパラメータです。
  • 行 13:sum(a, b)in は、合計演算のメソッドに渡される明示的なパラメーターです。absum

説明: 上記の例では、sumメソッドは 2 つの明示的なパラメーターを受け取り、それらを追加して結果を返します。このメソッドではmain、変数を定義しabそれらに特定の値を割り当てます。次に、メソッドを呼び出しsum、変数をa明示b的なパラメーターとしてメソッドに渡します。メソッド内では、これらの明示的なパラメーターを使用して合計演算を実行し、結果をresult変数に格納します。最後に、結果を出力します。

2. 暗黙的なパラメータ:

它们是非显式传递给方法的参数,通常是指对象或类上下文中的成员变量或方法。
隐式参数不需要在方法调用表达式中显式提供,而是通过对象或类来访问。

サンプルコードは次のとおりです。

public class ImplicitParametersExample {
    
    

    private int value; // 隐式参数

    public void setValue(int newValue) {
    
    
        this.value = newValue;
    }

    public int getValue() {
    
    
        return value;
    }

    public static void main(String[] args) {
    
    
        ImplicitParametersExample example = new ImplicitParametersExample();

        example.setValue(42); // 隐式参数使用

        int result = example.getValue();
        System.out.println("Value: " + result);
    }
}

注釈サイクル:

  • 行 3:valueは暗黙的なパラメーターであり、ImplicitParametersExampleクラスのメンバー変数です。
  • 5 行目:setValueメソッドは暗黙的なパラメーターを受け取りnewValue、それを暗黙的なパラメーターに割り当てますvalue
  • 行 8:getValueこのメソッドは、暗黙的なパラメーターの値を返しますvalue

説明: 上記の例では、オブジェクトの特定の値を表すImplicitParametersExample暗黙的なパラメーターを含むクラスを作成しました。valueメソッドではmain、クラスのインスタンスを作成しexamplesetValueメソッドを呼び出してパラメータを暗黙的に暗黙的にパラメータに渡しますvalue次に、getValueメソッドを呼び出して暗黙的なパラメータの値を取得しvalue、それを出力します。

キーワード this は暗黙的なパラメータを示します

Java では、キーワード this は、暗黙的なパラメータそのものではなく、暗黙的なパラメータを示すために使用されます。暗黙的なパラメーターは通常、オブジェクトまたはクラスのコンテキスト内のメンバー変数またはメソッドを参照します。

提供したサンプル コードでは、 value は暗黙的なパラメーターであり、クラス ImplicitParametersExample のメンバー変数です。this キーワードを使用すると、暗黙的なパラメーター値にアクセスし、それを newValue に割り当てることができます。したがって、 this.value = newValue; は、暗黙的なパラメーター値を使用してその値を更新する操作です。

概要: 明示的パラメータはメソッドの呼び出し時に明示的に渡されるパラメータですが、暗黙的パラメータは明示的に指定する必要がなく、オブジェクトまたはクラス (通常はメンバ変数またはメソッド) を通じてアクセスされるパラメータです。

Lu._.静的メソッド:

Java の静的メソッドは、クラスで定義された特別なタイプのメソッドです。これらのメソッドは、クラスのインスタンスではなく、クラス自体に関連しています。静的メソッドは、クラスのインスタンスを作成せずに、クラス名によって直接呼び出すことができます。

静的メソッドを定義する形式は次のとおりです。

access_modifier static return_type method_name(parameter_list) {
    
    
    // 方法体
}

の:

  • access_modifierアクセス修飾子を示します。publicprivateprotectedまたはデフォルトのアクセス修飾子を指定できます。
  • staticメソッドが静的メソッドであることを示すキーワード。
  • return_typeメソッドによって返されるデータ型を示します。これは基本型または参照型であり、メソッドが value を返さない場合に使用されますvoid
  • method_name命名規則に従って命名されたメソッドの名前です。
  • parameter_listメソッドのパラメータ リストであり、パラメータのタイプと名前が含まれます。

静的メソッドの使用:

  1. 静的メソッドは、クラス名によって直接呼び出すことができます (例: ) ClassName.methodName(arguments)
  2. 静的メソッド内では、クラス内に定義されている他の静的メンバー (静的変数や他の静的メソッドを含む) のみを呼び出すことができ、非静的メンバー (インスタンス変数やインスタンス メソッド) にはアクセスできません。

適用範囲:

  • 静的メソッドは、ツール クラスのパブリック メソッドとしてよく使用されます。これらのメソッドは、クラスのインスタンスの状態とは関係がなく、主に一般的な機能を提供するために使用されます。

予防:

  • 静的メソッドはオブジェクトの状態に依存しないため、インスタンス変数やインスタンス メソッドに直接アクセスできません。これらのインスタンス メンバーにアクセスする必要がある場合は、クラスのインスタンスを作成することでアクセスできます。
  • 静的メソッドをオーバーライド (オーバーライド) することはできず、サブクラスは親クラスの静的メソッドを非表示にすることしかできません。
  • 静的メソッドは現在のオブジェクトを指しており、静的メソッドはオブジェクトとは何の関係もないthisため、このキーワードは使用できません。this
  • 静的メソッドはオブジェクトを作成せずに呼び出すことができますが、場合によってはアプリケーションの設計や構造に影響を与える可能性があるため、静的メソッドの使用には注意が必要です。

まとめ:静的メソッドはクラス名で直接呼び出せるクラスレベルのメソッドであり、汎用的な関数の実装に適していますが、インスタンスのメンバに直接アクセスできないため、使用する際には上記の点に注意が必要です。彼ら。

静的メソッドを呼び出すには、クラスのインスタンスを作成せずに、クラス名を使用して直接呼び出すことができます。たとえば、別のクラスで staticMethod() を呼び出すには、次のコードを使用できます。

Studentsss.staticMethod();
char 配列を返すメソッド printstu() を呼び出すには、まず Studentss クラスのインスタンスを作成し、次にそのインスタンスを使用してメソッドを呼び出す必要があります。例えば:

Studentsss Student = new Studentsss();
char[] result =student.printstu();
printstu() メソッドは null を返すため、result 変数には null 値が含まれることに注意してください。必要に応じて printstu() メソッドの実装を変更して、目的の結果を返すことができます。
ここに画像の説明を挿入

Main メソッドは特別な静的メソッドです。—> どのオブジェクトにも作用しません。実際には、プログラムはオブジェクトなしで開始されます。

クラスにmainを書く

package work629;

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 i) {
    
    
        this.author = author;
        this.title = title;
        this.price = price;
        this.publisher = publisher;
        this.publishedYear = i;
    }

    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);
    }

    public static void main(String[] args) {
    
    
        BOOK book123 = new BOOK("21", "32", 12, "32", 123);
        book123.showDisplayBook();
    }
}

別に書いてある

ここに画像の説明を挿入

Seven._. Java アクセス修飾子 (4 種類):

Java には、次の 4 つのアクセス修飾子があります。

  1. public : public アクセス修飾子。任意のクラスからアクセスできます。クラス、メソッド、または変数が public 修飾子を使用している場合、他のクラスからアクセスできます。

  2. protected : 保護されたアクセス修飾子。同じパッケージ内の他のクラスおよびこのクラスのサブクラス (同じパッケージ内にあるかどうかに関係なく) からアクセスできます。protected 修飾子は、継承を実装し、関連クラスにある程度のアクセス制御を提供するために使用されます。

  3. デフォルト(デフォルト): アクセス修飾子が指定されていない場合、つまり public、protected、または private 修飾子が使用されていない場合、メンバー (クラス、メソッド、または変数) はデフォルトのアクセス修飾子に設定されます。デフォルトの修飾子により、同じパッケージ内の他のクラスによるアクセスが許可されます。

  4. private : プライベート アクセス修飾子。同じクラス内でのみアクセスでき、他のクラスはプライベート メンバーにアクセスできません。private 修飾子は主に、カプセル化を実装し、クラスへの外部アクセスを制限し、クラス内の実装の詳細を非表示にするために使用されます。

これらのアクセス修飾子をクラス、そのメンバー変数、およびメソッドに適用すると、クラスとそのメンバーへのアクセス レベルを制御し、適切なカプセル化とアクセシビリティを確保できます。適切なアクセス修飾子を使用すると、コードの保守性とセキュリティが向上します。

【1】コード:

1. コード例: public アクセス修飾子の使用

public class Circle {
    
    
    public double radius;

    public double calculateArea() {
    
    
        return Math.PI * radius * radius;
    }
}

public class Main {
    
    
    public static void main(String[] args) {
    
    
        Circle circle = new Circle();
        circle.radius = 5.0;
        double area = circle.calculateArea();
        System.out.println("Area of the circle: " + area);
    }
}

利点:

  • 他のクラスは、中間層やゲッター/セッター メソッドを経由せずに、Circle クラスの radius プロパティと CalculateArea メソッドに直接アクセスできます。
  • 他のクラスが Circle オブジェクトをインスタンス化し、そのパブリック メソッドを呼び出して、対応する計算操作を実行できるようにします。

2. コード例: private アクセス修飾子の使用

public class BankAccount {
    
    
    private String accountNumber;
    private double balance;

    public BankAccount(String accountNumber, double initialBalance) {
    
    
        this.accountNumber = accountNumber;
        this.balance = initialBalance;
    }

    public void deposit(double amount) {
    
    
        balance += amount;
    }

    public void withdraw(double amount) {
    
    
        if (amount <= balance) {
    
    
            balance -= amount;
        } else {
    
    
            System.out.println("Insufficient balance");
        }
    }

    public double getBalance() {
    
    
        return balance;
    }
}

public class Main {
    
    
    public static void main(String[] args) {
    
    
        BankAccount account = new BankAccount("123456789", 1000.0);
        account.deposit(500.0);
        account.withdraw(200.0);
        double balance = account.getBalance();
        System.out.println("Current balance: " + balance);
    }
}

利点:

  • 口座番号と残高をプライベート属性として設定することで、他のクラスがこれらの機密情報を直接変更することを防ぎ、データのセキュリティを確保できます。
  • 入金、出金、残高照会などの操作はパブリックな方法でのみ許可され、カプセル化と制御性が向上します。
  • 出金に十分な残高があるかどうかのチェックなど、公開された方法で論理検証を行うことができるため、コードの正確性と信頼性が保証されます。

3. コード例: protected アクセス修飾子の使用

package com.example;

public class Shape {
    
    
    protected double area;

    protected void calculateArea() {
    
    
        // 计算面积的具体实现
    }
}

public class Circle extends Shape {
    
    
    private double radius;

    public Circle(double radius) {
    
    
        this.radius = radius;
    }

    public double getArea() {
    
    
        calculateArea();
        return area;
    }
}

public class Main {
    
    
    public static void main(String[] args) {
    
    
        Circle circle = new Circle(5.0);
        double area = circle.getArea();
        System.out.println("Area of the circle: " + area);
    }
}

利点:

  • Shape クラスで、area プロパティと CalculateArea メソッドを protected に設定します。これは、(同じパッケージ内の) Circle クラスによって継承され、アクセスできることを意味します。
  • Circleクラスは具体的な計算過程を知らなくてもgetAreaメソッドを呼び出すことで円の面積を取得できます。これにより、計算の詳細が隠蔽され、コードの抽象化と再利用性が向上します。

4. コード例: デフォルトのアクセス修飾子の使用

package com.example;

class Person {
    
    
    String name;
    int age;
    
    void displayInfo() {
    
    
        System.out.println("Name: " + name);
        System.out.println("Age: " + age);
    }
}

public class Main {
    
    
    public static void main(String[] args) {
    
    
        Person person = new Person();
        person.name = "John";
        person.age = 25;
        person.displayInfo();
    }
}

利点:

  • Person クラスでは、アクセス修飾子が指定されていません (デフォルトの修飾子が使用されます)。これは、クラスが同じパッケージ内でのみアクセスおよびインスタンス化できることを意味します。
  • メイン クラス Main は同じパッケージ内にあり、Person オブジェクトを作成し、そのプロパティとメソッドにアクセスできます。ただし、他のパッケージから Person クラスにアクセスすることはできないため、ある程度のカプセル化と隠蔽が行われます。

これらの例は、さまざまなアクセス修飾子の具体的な使用法と、それらがもたらす利点を示しています。適切なアクセス修飾子を合理的に選択することで、コードの可視性、カプセル化、保守性を制御し、適切なコードの編成と管理を実現できます。

【2】アクセス修飾子の存在は、コードの適切な編成と管理を提供するだけでなく、カプセル化とアクセス制御を実現するためにも存在します。さまざまなアクセス修飾子を使用する理由は次のとおりです。

  1. カプセル化: メンバー変数とメソッドをプライベートとして設定することで、クラスの内部実装の詳細を非表示にすることができ、他のクラスがこれらのメンバーに直接アクセスして変更することを防ぎ、それによってデータのセキュリティと一貫性を確保します。

  2. アクセス制御: アクセス修飾子を使用すると、異なるクラス間のアクセスを制御できます。public 修飾子は他のクラスからクラスのメンバーにアクセスできるようにすることができ、protected 修飾子は継承関係で制限されたアクセスを提供でき、default 修飾子は同じパッケージ内の他のクラスにアクセスを許可し、private 修飾子は同じクラスのみを許可します。アクセス。

  3. モジュール設計: アクセス修飾子はコードをモジュールに分割するのに役立ち、各モジュールは異なるアクセス レベルを持つことができます。このモジュール設計により、コードの理解、保守、再利用が容易になります。

  4. 安全性と信頼性: 特定のクラス メンバーへのアクセスを制限することで、エラーや偶発的な変更が発生する可能性が減ります。アクセスを制限することで、重要なデータとメソッドを保護し、コードの正確さと信頼性を確保することができます。

つまり、アクセス修飾子の規定により、コードのアクセス レベルと使用範囲をより適切に制御できるようになり、それによってコードのカプセル化、セキュリティ、保守性が強化されます。適切なアクセス修飾子を慎重に選択することで、コードを整理および管理し、適切なプログラミングの実践を提供できます。

【3】注意事項:

アクセス修飾子はコードに多くの利点をもたらしますが、潜在的な害をもたらす可能性もあります。考えられる問題は次のとおりです。

  1. 露出オーバー: public 修飾子を使用すると、クラス、メソッド、または変数が露出オーバーになる可能性があります。すべてのメンバーが制限なく公開されると、他のクラスがこれらのメンバーに直接アクセスして変更する可能性があり、カプセル化とデータの一貫性が損なわれる可能性があります。

  2. 過度に制限的な: 場合によっては、private または protected 修飾子を過度に使用すると、他のクラスによる関連メンバーへのアクセスが過度に制限される可能性があります。これにより、他のクラスがクラスを適切に使用または拡張できなくなり、コードの再利用性と柔軟性が低下する可能性があります。

  3. 結合の増加: クラスが使用する保護されたメンバーが多すぎると、クラスを継承する他のサブクラスと密結合関係が生じる可能性があります。この密結合関係により、基本クラスの変更がサブクラスの実装に影響を与える可能性があり、保守と拡張の困難さが増大します。

  4. 可視性の混乱: さまざまなアクセス修飾子が多すぎると、コードの可視性が乱雑になる可能性があります。特に大規模なプロジェクトでは、public、protected、default、private 修飾子が多すぎると、クラス間の関係が複雑になり、コードの理解と保守が困難になる可能性があります。

  5. セキュリティ リスク: アクセス修飾子は、選択を誤るとセキュリティ リスクを引き起こす可能性があります。たとえば、特定の機密情報をパブリックまたはデフォルトのアクセス修飾子として設定すると、他のクラスや悪意のあるユーザーがこれらの情報に直接アクセスして変更する可能性があります。

コードの適切なカプセル化、保守性、およびセキュリティを確保するには、適切なアクセス修飾子をトレードオフし、賢明に選択する必要があります。適切な設計原則とベスト プラクティスに従うことで、潜在的な問題を回避し、コードの品質を向上させることができます。

8._. static キーワード L: Java でキーワードを使用する場合static、メソッド、変数、内部クラスに使用できます。static以下では、キーワードのさまざまな用途を段階的に説明します。

1. 静的変数 (静的変数) —> Java では、静的変数はメソッド内ではなくクラスのスコープ内で宣言する必要があります。

调用方式:
	对象名调用
	类名调用(推荐)

静的変数は、staticとして宣言されたメンバー変数です。これらは、インスタンス化されたオブジェクトではなくクラスに属し、クラスのすべてのインスタンスで同じ値を共有します。静的変数には、クラスのインスタンスを作成せずに、クラス名を使用して直接アクセスできます。

public class MyClass {
    
    
    static int myStaticVariable = 10;
    // ...
}

上の例では、myStaticVariableは静的変数であり、MyClass.myStaticVariableを使用してアクセスできます。

[1] エラーメッセージ:

ここに画像の説明を挿入

[2] 静的変数とインスタンス変数は Java の 2 つの異なるタイプの変数であり、それらの間には次のような違いがあります。

1. 範囲:

  • 静的変数 (静的変数) は、クラスのインスタンスではなく、クラス全体に属します。これらはクラスのロード時に初期化され、クラスのすべてのインスタンスで同じ値を共有します。
  • インスタンス変数(インスタンス変数)は、クラスのインスタンス化された各オブジェクトに属します。すべてのオブジェクトにはインスタンス変数の独自のコピーがあり、オブジェクトの作成時に初期化されます。

2.アクセス方法:

  • 静的変数には、クラスのインスタンスを作成せずに、クラス名を介して直接アクセスできます。(< 1 > クラス内では、任意のメソッドの静的変数に直接アクセスできます。< 2 > 他のクラスでは、クラス名を通じてこのクラスの静的変数にアクセスできます。) 例ClassName.staticVariable:
  • インスタンス変数には、クラスのインスタンスを作成してアクセスする必要があります。(<1>クラス内では、非静的メソッドのインスタンス変数に直接アクセスできます。<2>このクラスまたは他のクラスの静的メソッドでは、クラスのインスタンス オブジェクトを通じてアクセスする必要があります。) 次に例を示します。 : objectName.instanceVariable

3. ライフサイクル:

  • 静的変数は、クラスがロードされるときに初期化され、プログラムが終了するまでプログラムの実行中ずっと保持されます。
  • インスタンス変数はオブジェクトの作成時に初期化され、オブジェクトが参照されなくなるとガベージ コレクターによってメモリが解放されます。

4. メモリ使用量:

  • 静的変数はメソッド領域 (メソッド領域) に配置され、コピーは 1 つだけです。(すべてのインスタンスには同じ定数属性が含まれており、静的定数タイプとして定義してメモリ領域を節約できます)
  • インスタンス変数はヒープ メモリ内の各オブジェクト インスタンス内に配置され、各オブジェクトは独自のコピーを持ちます。

5. 使用シナリオ:

  • 静的変数は、複数のインスタンス間で共有する必要があるクラス関連の定数またはデータを保持するのに適しています。(静的変数はクラスのすべてのインスタンスで共有できるため、静的変数をインスタンス間の共有データとして使用して、インスタンス間の対話性を強化できます。)
  • インスタンス変数は、オブジェクトの特定の状態とプロパティを保持するのに適しています。

以下は、静的変数とインスタンス変数の使用を示す例です。

public class MyClass {
    
    
    static int staticVariable;
    int instanceVariable;

    public static void main(String[] args) {
    
    
        // 静态变量访问
        MyClass.staticVariable = 10;

        // 创建类的实例
        MyClass obj1 = new MyClass();
        MyClass obj2 = new MyClass();

        // 实例变量访问
        obj1.instanceVariable = 20;
        obj2.instanceVariable = 30;
    }
}

上の例では、staticVariableはクラス名を通じて直接アクセスできる静的変数です。instanceVariableは、クラスのインスタンスを作成することによってアクセスする必要があるインスタンス変数です。

2. 静的メソッド

调用方式:
	对象名调用
	类名调用(推荐)

静的メソッドは、staticキーワードで修飾されたメソッドです。静的変数と同様に、静的メソッドもインスタンス化されたオブジェクトではなくクラスに属します。オブジェクトをインスタンス化せずに、クラス名によって直接呼び出すことができます。

public class MyClass {
    
    
    public static void myStaticMethod() {
    
    
        // 静态方法的实现
    }
    // ...
}

上の例では、myStaticMethod()これは を介し​​て呼び出すことができる静的メソッドですMyClass.myStaticMethod()

[1] 静的メソッドを使用する場合は、次の点に注意する必要があります。

  1. 静的メソッドはクラスのインスタンスではなく、クラスに属します。したがって、静的メソッドは、クラスのインスタンスを作成せずに、クラス名によって直接呼び出すことができます。

  2. 静的メソッドは、インスタンス変数や非静的メソッドなど、クラスの非静的メンバーにアクセスできません。静的変数やその他の静的メソッドを含む静的メンバーにのみアクセスできます。

  3. 「this」は現在のオブジェクトへの参照を表し、静的メソッドには特定のオブジェクト インスタンスがないため、キーワード「this」は静的メソッドでは使用できません。

  4. 静的メソッドはプログラムの実行時全体にわたって存在するため、オブジェクトの状態やインスタンス化に依存しないユーティリティ メソッドやパブリック メソッドを定義するのに適しています。

  5. 静的メソッドはサブクラスによって継承および非表示にすることができますが、サブクラスによってオーバーライドすることはできません。サブクラスに親クラスと同名の静的メソッドが定義されている場合、親クラスの静的メソッドは非表示になります。

以下に、クラスを使用した場合と使用しない場合のコード例をいくつか示します。

1. クラスのコード例:
public class MathUtils {
    
    
    public static int add(int a, int b) {
    
    
        return a + b;
    }
}

// 调用类的静态方法
int sum = MathUtils.add(3, 5);
System.out.println(sum); // 输出:8
2. クラスなしのコード例 (静的メソッドはクラスの外にあります):
public class Main {
    
    
    public static void main(String[] args) {
    
    
        int result = Calculator.add(3, 5);
        System.out.println(result); // 输出:8
    }
}

// 定义静态方法
class Calculator {
    
    
    public static int add(int a, int b) {
    
    
        return a + b;
    }
}

上記の例は静的メソッドの使用を説明するためにのみ使用されており、完全な実行可能なコードではないことに注意してください。特定のコード実装には、より多くのコンテキストとロジックが必要になる場合があります。

[2] 静的メソッドとインスタンス メソッドの使用方法には次のような違いがあります。

  1. 面接方法:

    • 静的メソッドは、クラスのインスタンスを作成せずに、クラス名によって直接呼び出すことができます。
    • インスタンス メソッドはオブジェクト インスタンスを通じて呼び出す必要があり、最初にクラスのインスタンスを作成する必要があります。
  2. 呼び出しオブジェクト:

    • 静的メソッドには特定のオブジェクト インスタンスがないため、インスタンス変数にアクセスしたり、キーワード「this」を使用したりすることはできません。
    • インスタンス メソッドは、特定のオブジェクト インスタンスに対する操作であり、インスタンス変数にアクセスでき、キーワード「this」を使用して現在のオブジェクトを参照できます。
  3. メモリ割り当て:

    • 静的メソッドは、プログラムが実行されている限りメモリ内に存在し、オブジェクトの状態やインスタンス化には依存しません。
    • インスタンス メソッドは、オブジェクトの作成時にメモリを割り当てる必要があり、オブジェクト インスタンスを通じて呼び出す必要があります。
  4. 継承とオーバーライド:

    • 静的メソッドはサブクラスによって継承および非表示にすることができますが、サブクラスによってオーバーライドすることはできません。
    • インスタンス メソッドは、継承、オーバーライド、およびサブクラスによるオーバーライドが可能です。
  5. アクセス許可:

    • 静的メソッドを public、protected、private、およびその他のアクセス修飾子に設定して、その可視性を制御できます。
    • インスタンス メソッドは、public、protected、private などのアクセス修飾子を設定することもできます。同時に、デフォルトのアクセス修飾子 (修飾子なし) を使用して、同じパッケージ内で表示することもできます。

静的メソッドはオブジェクト インスタンスに依存しない操作に適しており、一般にツール メソッドまたはパブリック メソッドを定義するために使用されますが、インスタンス メソッドはオブジェクト インスタンスの操作を必要とする動作に適していることに注意してください。静的メソッドを使用するかインスタンス メソッドを使用するかの選択は、特定のビジネス ニーズと設計目標によって異なります。

3. 静的ブロック

静的コード ブロックは、クラスの読み込みプロセス中に実行されるコードのブロックであり、静的メンバーの初期化やその他の静的前処理作業の実行に使用されます。静的コード ブロックは、クラスが初めてロードされるときに実行され、一度だけ実行されます。

静的コードブロックの定義形式は以下のとおりです。

static {
    
    
    // 静态代码块的代码逻辑
}

静的コード ブロックはキーワードで装飾され、その後にstatic中括弧{}で囲まれたコード ブロックが続きます。静的コード ブロック内に任意の Java コードを記述して、関連する初期化または前処理操作を完了できます。

静的コード ブロックの特徴は次のとおりです。

  • 静的コード ブロックは、クラスがロードされるときに自動的に実行され、一度だけ実行されます。
  • 静的コード ブロックの実行順序はソース コード内の位置に関連しており、最初に定義された静的コード ブロックが最初に実行されます。
  • 静的コード ブロックは、オブジェクト インスタンスの作成には使用されず、クラスの読み込み中に実行されるため、コンストラクターに渡されるパラメーターを受け入れることができません。

静的コード ブロックの一般的なアプリケーションには次のものがあります。

  • 静的変数の初期化: 静的変数は、静的コード ブロックで割り当てまたは計算できます。
  • 構成ファイルのロード、ドライバーの登録などの静的前処理作業を 1 回限り実行します。

静的コード ブロックの例を次に示します。

public class MyClass {
    
    
    static {
    
    
        System.out.println("静态代码块执行");
        // 一些初始化操作或预处理工作
    }

    public static void main(String[] args) {
    
    
        System.out.println("主方法执行");
        // 主方法中的其他代码
    }
}

出力結果:

静态代码块执行
主方法执行

上記の例では、クラスが最初にロードされたときに静的コード ブロックが実行され、「静的コード ブロックが実行されました」と出力されます。次に、main メソッドが呼び出され、「main メソッドが実行されました」と出力されます。静的コード ブロックは 1 回だけ実行され、オブジェクト インスタンスを作成するために再度実行されることはないことに注意してください。

4. 静的内部クラス

静的内部クラスは、別のクラス内で定義され、 として宣言されたクラスですstatic外部クラスとは何の関係もなく、外部クラス名を通じて直接アクセスできます。

public class OuterClass {
    
    
    static class StaticInnerClass {
    
    
        // 静态内部类的定义
    }
    // ...
}

上記の例では、StaticInnerClassは静的内部クラスであり、OuterClass.StaticInnerClassを使用してアクセスできます。

要約する

  • staticキーワードは、インスタンス化されたオブジェクトではなくクラスに属する静的メンバーを作成するために使用されます。
  • 静的変数はクラス全体のすべてのインスタンスによって共有され、クラス名を通じて直接アクセスできます。
  • 静的メソッドはインスタンス化されたオブジェクトに依存せず、クラス名を通じて直接呼び出すことができます。
  • 静的コード ブロックは、クラスのロード時に 1 回実行され、静的変数の初期化やクラスに関連するその他の静的操作の実行に使用されます。
  • 静的内部クラスは、別のクラス内で定義されたクラスであり、外部クラス名を通じて直接アクセスできます。

Java 静的変数はクラスのロード時にロードされ、クラスがメモリにロードされるときに初期化され、プログラム全体の実行中にコピーが 1 つだけ存在します。対照的に、オブジェクト変数は、オブジェクトの作成時にメモリ領域を割り当てて初期化する必要があります。したがって、静的変数はオブジェクトの外観よりも優先され、オブジェクトをインスタンス化せずにクラス名を通じて直接アクセスできます。

Nine._. Java パッケージ (パッケージ)

Java では、パッケージ (Package) は、クラスとインターフェイスを編成および管理するためのメカニズムです。これは、コードの編成と管理を改善するために、関連するクラスとインターフェイスをまとめて編成できる名前空間の概念を提供します。

パッケージの定義:
パッケージは、クラスまたはインターフェイスが属する組織またはモジュールを一意に識別する、ドットで区切られた一連の識別子です。通常、パッケージ名には小文字が使用され、規則に従って逆ドメイン名の命名規則が採用されます。たとえば、次のようになりますcom.example.mypackage

パッケージ形式:
ソース コード ファイルの先頭で、package宣言を使用して、ファイル内のクラスまたはインターフェイスが属するパッケージを指定します。宣言はすべてのimportステートメントの前に置く必要があり、パッケージ宣言は 1 つだけ存在できます。例えば:

package com.example.mypackage;

執筆上の注意:

  • パッケージ名は説明的で、パッケージに含まれるクラスまたはモジュールの機能を明確に表現する必要があります。
  • パッケージ名には小文字を使用し、特殊文字やスペースは避けてください。
  • パッケージ名は、グローバルな一意性を確保し、他のパッケージとの競合を避けるために、逆ドメイン名の命名規則に従う必要があります。
  • パッケージ名には数字とアンダースコアを使用できますが、パッケージ名の先頭文字として使用することはお勧めできません。
  • パッケージ名の各部分は有効な識別子である必要があり、Java キーワードをパッケージ名として使用することはできません。

短縮形式:
Java のパッケージでは、パッケージ全体またはパッケージ内のすべてのクラスをインポートするためのワイルドカード短縮形式の使用もサポートされています。一般的な短縮形式が 2 つあります。

  • パッケージ全体をインポートします:import com.example.mypackage.*;これは、com.example.mypackageパッケージ内のすべてのクラスをインポートすることを意味します。
  • 特定のクラスをインポートします: import com.example.mypackage.MyClass;、つまり、com.example.mypackageパッケージ内のクラスのみをインポートしますMyClass

バージョン番号:
パッケージ自体はバージョン番号に直接関連付けられていません。バージョン番号はクラス ライブラリ (ライブラリ ファイル) または JAR ファイルに関連しています。Maven などのビルド ツールでは、ライブラリの特定のバージョンを依存関係宣言で指定できます。たとえば、という名前のライブラリのバージョンがcom.example:mylibrary:1.0.0参照されていることを示しますmylibrary1.0.0

つまり、Java のパッケージは、固定の命名規則と記述形式を使用して、クラスとインターフェイスを編成および管理するためのメカニズムです。パッケージに適切な名前を付けて整理することで、コードの読みやすさ、保守性、モジュール性を向上させることができます。

パッケージの使用範囲。複数のパッケージを 1 つのファイルにインポートできます。

パッケージの使用範囲はプロジェクトまたはモジュールに限定されており、コードを整理および管理するために使用されます。これにより、名前の競合が解決され、コードの可読性と保守性が向上します。

Java ソース コード ファイルでは、複数のパッケージをインポートできます。packageただし、ファイル内のクラスまたはインターフェイスが属するパッケージを指定する宣言は1 つだけです。この宣言は、ファイルの先頭、すべてのimportステートメントの前に配置する必要があります。

例えば:

package com.example.mypackage;

import java.util.ArrayList;
import java.util.List;

上記の例では、ファイル内のクラスまたはインターフェイスはcom.example.mypackageパッケージに属します。同時に、と2 つのパッケージはステートメントを介してimportインポートされるため、完全なクラス名を使用せずにコード内でクラスを直接使用できます。java.util.ArrayListjava.util.List

Java ソース コード ファイルでは、必要なだけパッケージをインポートできます。importステートメントでパッケージを個別に指定することも、ワイルドカード ( *) を使用してパッケージ全体またはパッケージ内のすべてのクラスをインポートすることもできます。

例えば:

import java.util.*; // 导入java.util包下的所有类
import java.io.File; // 导入java.io包下的File类
import com.example.mypackage.MyClass; // 导入com.example.mypackage包下的MyClass类

複数のパッケージをインポートできますが、コードの可読性と保守性を向上させるために、無駄なクラスをインポートしすぎないように、実際に必要なクラスのみをインポートすることが最善であることに注意してください。package同じパッケージを繰り返しインポートすることは合法ですが、ファイル内のクラスがどのパッケージに属するかを指定する宣言は1 つだけであるため、追加の利点はありません。

導入

Java では、パッケージを使用してクラスをコレクション内に編成できます。パッケージはコードを整理し、他人が提供するコード ライブラリから独自のコードを分離する便利な方法です。

パッケージ名:

パッケージを使用する主な理由は、クラス名の一意性を確保することです。2 人のプログラマが偶然 Employee を提供した場合でも、クラスを異なるパッケージに配置している限り、競合は発生しません。
実際、パッケージ名の絶対的な同一性を確保するには、インターネット ドメイン名 (明らかに一意です) をパッケージ名として逆の順序で使用し、プロジェクトごとに異なるサブパッケージを使用します。
たとえば、ドメイン名 horstmann.c について考えてみましょう。逆の順序で記述すると、パッケージ名は cohorstmann になります。次に、com.horstmann.corejava などのプロジェクト名を追加できます。Employee クラスがこのパッケージに配置されている場合、このクラスの「完全修飾」名は com.horstmann.corejava,Employee になります。
注: コンパイラの観点からは、ネストされたパッケージ間には関係がありません。たとえば、java.util パッケージは jutil.jar パッケージとは何の関係もありません。各パッケージは独立したクラスのコレクションです。

ライブラリのクラスまたはパッケージを使用するには、キーワード import を使用する必要があります。

スキャナークラス:

Scanner クラスは、ユーザー入力またはファイルからデータを読み取るための Java のユーティリティ クラスです。これは、プリミティブ型と文字列を解析する簡単な方法を提供します。

Scanner クラスを使用するには、まず Scanner オブジェクトを作成し、入力ソース (System.in やファイルなど) をパラメーターとしてコンストラクターに渡す必要があります。その後、Scanner オブジェクトのメソッドを使用して入力を読み取ることができます。

Scanner クラスの一般的なメソッドの一部を次に示します。

next(): 入力内の次の単語 (スペースで区切られている) を読み取って返します。
nextInt(): 入力内の次の整数を読み取って返します。
nextDouble(): 入力内の次の倍精度浮動小数点数を読み取って返します。
nextLine(): 入力内の次の行を読み取り、返します。

next() と nextLine() の違い

次():

1. 入力を終了する前に、有効な文字を必ず読んでください。
2. next() メソッドは、有効な文字を入力する前に見つかった空白を自動的に削除します。
3. 有効な文字が入力された場合にのみ、その後に入力された空白は区切り文字または終了文字として使用されます。
next() はスペースを含む文字列を取得できません。

nextLine():

1. Enter を終了文字として使用します。つまり、nextLine() メソッドはキャリッジ リターンの前のすべての文字を返します。
2. ブランクを入手できます。

Scanner クラスを使用した例を次に示します。

import java.util.Scanner;

public class MyClass {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        System.out.print("请输入一个整数: ");
        int num = scanner.nextInt();
        System.out.println("您输入的整数是: " + num);

        System.out.print("请输入一个字符串: ");
        String str = scanner.next();
        System.out.println("您输入的字符串是: " + str);

        scanner.close();
    }
}

上の例では、まず System.in を入力ソースとして Scanner オブジェクトを作成しました。次に、 nextInt() メソッドを使用してユーザーが入力した整数を読み取り、 next() メソッドを使用してユーザーが入力した文字列を読み取ります。最後に、Scanner オブジェクトを閉じます。

Scanner クラスを使用するには、予想とは異なる型のデータを入力するなど、入力エラーを慎重に処理する必要があることに注意してください。例外処理メカニズムを使用してこれらの状況を処理し、プログラムの安定性と信頼性を確保できます。

pick up._.オブジェクトの配列:

オブジェクトの配列は、複数のオブジェクトを格納できるデータ構造です。Java では、オブジェクト配列を使用して、同じクラスの複数のオブジェクトを格納できます。各配列要素は、このクラスのインスタンスにすることができます。

 public static void main(String[] args) {
    
    
        BOOK[] book = new BOOK[3];
        for (int i = 0; i < book.length; i++) {
    
    
            book[i] = new BOOK();
        }
        for (BOOK b : book) {
    
    
            b.showDisplayBook();
        }
    }

配列内のオブジェクトにアクセスする場合は、型変換が必要です。Object はすべてのクラスの基本クラスであるため、オブジェクトを格納したりアクセスしたりするときに実際の型に変換する必要があります。

// 声明一个对象数组
Object[] myArray = new Object[5];

// 在数组中存储不同类型的对象
myArray[0] = "Hello";
myArray[1] = 42;
myArray[2] = new ArrayList<>();
myArray[3] = new Date();
myArray[4] = new MyClass();

// 访问数组中的对象
String str = (String) myArray[0];
int num = (int) myArray[1];
List<Object> list = (List<Object>) myArray[2];
Date date = (Date) myArray[3];
MyClass obj = (MyClass) myArray[4];

おすすめ

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