CodeGym /Java Blog /ランダム /Java クラス: 独自のクラス、コンストラクターの作成
John Squirrels
レベル 41
San Francisco

Java クラス: 独自のクラス、コンストラクターの作成

ランダム グループに公開済み
やあ!今日はJavaのクラスについて話します。クラスは Java プログラミングの基礎を形成していると言えます。プログラマーになると、ほぼすべての仕事が、さまざまな機能を持つ独自のクラスを作成することになります。それが何を意味し、どのように機能するかを見てみましょう。:) ご存知のとおり、Java はオブジェクト指向プログラミング言語です。すべてのプログラムは、何らかの形で相互に関連するオブジェクトで構成されます。クラスは本質的に、オブジェクトのテンプレートです。それは、オブジェクトがどのように見えるか、どのような機能を持つかを決定します。すべてのオブジェクトは、何らかのクラスのオブジェクトです。次の非常に単純な例を考えてみましょう。

public class Cat {

    String name;
    int age;

}
何らかの理由で猫に関係するプログラムを作成しているとします (たとえば、オンライン アカウントへのアクセスを提供する動物病院があります)。Catクラスを作成し、その中でString nameint ageという 2 つの変数を宣言しました。これらのメンバー変数はフィールドと呼ばれます。基本的に、これは今後作成するすべての猫のテンプレートです。各Catオブジェクトには、名前と年齢という 2 つの変数があります。

public class Cat {

    String name;
    int age;

    public static void main(String[] args) {
        Cat smudge = new Cat();
        smudge.age = 3;
        smudge.name = "Smudge";

        System.out.println("We created a cat named " + smudge.name + ". His age is " + smudge.age);
    }

}
仕組みは次のとおりです。猫を作成し、名前と年齢を付けて、すべてコンソールに表示します。ケーキの一部。:) 多くの場合、クラスは現実世界の物事や現象を説明します。猫、テーブル、人、稲妻、本のページ、車輪など、これらすべてのものを個別のクラスを使用してプログラム内で作成します。ここでは、 Catクラスで宣言した変数に注目してみましょう。これらはフィールド、またはインスタンス変数と呼ばれます。彼らの名前はまさにそれを物語っています。Catクラスの各インスタンス (またはオブジェクト) にはこれらの変数があります。私たちが作成する各猫には、独自の名前変数と独自の年齢があります。変数。これは当然のことであり、実際の猫の場合も基本的には同じです。:) インスタンス変数に加えて、クラス変数 (静的変数) もあります。例を終了しましょう。

public class Cat {

    String name;
    int age;

    static int count = 0;

    public static void main(String[] args) {
        Cat smudge = new Cat();
        smudge.age = 3;
        smudge.name = "Smudge";
        count++;

        Cat fluffy = new Cat();
        fluffy.age = 5;
        fluffy.name = "Fluffy";
        count++;

        System.out.println("We created a cat named " + smudge.name + ". His age is " + smudge.age);
        System.out.println("We created a cat named " + fluffy.name + ". His age is " + fluffy.age);

        System.out.println("Total number of cats = " + count);
    }
}
コンソール出力: Smudge という名前の猫を作成しました。彼の年齢は3歳です。私たちはフラッフィーという名前の猫を作りました。彼の年齢は 5 猫の総数 = 2 これで、クラスに count という新しい変数が追加されました。作成された猫を数える役割を果たします。メインで猫を作成するたびにこの変数は、キーワード static を使用して宣言されます。つまり、クラスの特定のオブジェクトではなく、クラスに属します。もちろん、これは当然のことです。各猫の名前はその特定の猫に属しますが、すべての猫に適用される 1 つの猫カウンターが必要です。これはまさにキーワード static が実現することです。これにより、count 変数がすべての猫に対する単一の変数になります。注: 変数を表示するときは、smudge.count または Fluffy.count を使用しません。それはスマッジにもフラッフィーにも属しません。それはCatクラス全体に属します。だからこそ、単純に数えるだけなのです。Cat.count と書くこともできます。それもまた正しいでしょう。name 変数を表示する場合、次のことは行いません。

public class Cat {

    String name;
    int age;

    static int count = 0;

    public static void main(String[] args) {
        Cat smudge = new Cat();
        smudge.age = 3;
        smudge.name = "Smudge";
        count++;

        System.out.println("We created a cat named " + name + ". His age is " + smudge.age);

        System.out.println("Total number of cats = " + count);
    }
}
これは間違いです! それぞれの猫には独自の名前が付いています。ここでコンパイラは混乱します。「コンソールに名前を出力しますか? 誰の名前ですか?」:/"

メソッド

変数に加えて、各クラスにはメソッドがあります。これらについては別のレッスンで詳しく説明しますが、一般原則は非常に単純です。メソッドは、クラスの機能、つまりクラスのオブジェクトが実行できる内容を定義します。これらのメソッドの 1 つであるmain()メソッドについては、すでによくご存じでしょう。ただし、覚えているかもしれませんが、メインメソッドは静的です。つまり、メイン メソッドはクラス全体に属します (ロジックは変数の場合と同じです)。ただし、標準の非静的メソッドは、作成した特定のオブジェクトに対してのみ呼び出すことができます。たとえば、猫クラスを作成したい場合、プログラム内の猫にどのような機能を持たせる必要があるかを知る必要があります。その前提で、猫用のメソッドをいくつか書いてみましょう。

public class Cat {

    String name;
    int age;

    public void sayMeow() {
        System.out.println("Meow!");
    }

    public void jump() {
        System.out.println("Pounce!");
    }

    public static void main(String[] args) {
        Cat smudge = new Cat();
        smudge.age = 3;
        smudge.name = "Smudge";

        smudge.sayMeow();
        smudge.jump();

    }
}
見てみな!これで、私たちのクラスは猫にかなり近づいてきました。これで、名前 (「スマッジ」) と年齢 (3 歳) が付けられた猫がいるだけではありません。ニャーと鳴いたり、ジャンプしたりすることもできます。その「機能」がなかったらどんな猫になるでしょうか?:) 特定のオブジェクト (smudge) を取得し、そのSayMeow() メソッドJump()メソッドを呼び出します。コンソールを見てみましょう。ニャー!突撃!本物の猫!:)

独自のクラスを作成します。抽象化

将来的には、独自のクラスを作成する必要があります。書くときに気をつけることは何でしょうか?変数について話している場合は、抽象化と呼ばれるものを利用する必要があります。抽象化は、オブジェクト指向プログラミングの 4 つの基本原則の 1 つです。これは、アイテムの最も重要かつ重要な特徴を抽出し、逆に、マイナーまたは重要ではない特徴を無視することを意味します。たとえば、会社員用のファイル キャビネットを作成してみましょう。従業員オブジェクトを作成するために、 Employeeを作成しました。クラス。当社のファイリングキャビネットにとって、従業員の重要な特徴は何ですか? 名前、生年月日、SSN、従業員 ID。しかし、会社の従業員記録に従業員の身長、目の色、髪の色が必要になる可能性は低いでしょう。企業にはこのような情報は必要ありません。したがって、Employeeクラスで次の変数を宣言します: String nameint ageint socialSecurityNumber、およびint memberId。そして、不必要な情報(目の色など)は省略します。言い換えれば、抽象化を作成します。ただし、モデル事務所用のファイルキャビネットを作成する場合、状況は劇的に変わります。モデルの身長、目の色、髪の色は重要な特徴ですが、彼女の SSN は私たちにとってまったく無関係です。したがって、Modelクラスで次の変数を作成する必要があります: String heightString HairString eye。これが抽象化の仕組みです。簡単です。:)

コンストラクター

猫の例に戻りましょう。

public class Cat {

    String name;
    int age;

    public static void main(String[] args) {
        Cat smudge = new Cat();

        System.out.println("Here the program does something for 2 hours...");

        smudge.age = 3;
        smudge.name = "Smudge";

    }
}
このコードを調べて、プログラムのどこが間違っているのかを見つけてください。私たちの番組では、名前も年齢も明かされていない猫が2時間出演しました!もちろん、これは本質的に間違っています。動物病院のデータベースには、情報のない猫が含まれるべきではありません。現在、我が家の猫はプログラマーのなすがままです。私たちは、彼が名前と年齢を明記することを忘れず、すべてがうまくいくと信じています。彼が忘れると、データベースに問題が発生します。名前のない猫です。この問題はどうすれば解決できるでしょうか? 名前や年齢のない猫が生み出されるのを何とか阻止しなければなりません。ここで建設業者が助けになります。例を挙げてみましょう:

public class Cat {

    String name;
    int age;

    // Constructor for the Cat class
    public Cat(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public static void main(String[] args) {

        Cat smudge = new Cat("Smudge", 5);
    }
}
基本的に、コンストラクターはクラスのオブジェクトのテンプレートです。この場合、各catオブジェクトに対して 2 つの引数Stringint を指定する必要があることを示します。今、名前のない猫を作ろうとしてもうまくいきません。

public class Cat {

    String name;
    int age;

    public Cat(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public static void main(String[] args) {

        Cat smudge = new Cat(); // Error!
    }
}
クラスにコンストラクターが追加されたため、Java コンパイラーはオブジェクトがどのようなものであるかを認識し、引数を指定せずにオブジェクトを作成することはできません。次に、コンストラクター内に表示されるキーワード this を調べてみましょう。それもシンプルです。this というキーワードは、特定のオブジェクトを示すためのものです。コンストラクター内のコード

public Cat(String name, int age) {
    this.name = name;
    this.age = age;
}
「この猫 (私たちが作成している猫) の名前 = コンストラクターの name パラメーターに渡される引数。この猫 (私たちが作成している猫) の年齢 = コンストラクターの名前パラメーターに渡される引数」とほぼそのまま解釈できます。年齢パラメータ。」コンストラクターの実行後、必要な値がすべて cat に割り当てられていることを確認できます。

public class Cat {

    String name;
    int age;

    public Cat(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public static void main(String[] args) {

        Cat smudge = new Cat("Smudge", 5);
        System.out.println(smudge.name);
        System.out.println(smudge.age);
    }
}
コンソール出力: Smudge 5 コンストラクターが呼び出されたとき:

Cat smudge = new Cat("Smudge", 5);
これは実際に内部で起こったことです:

this.name = "Smudge";
this.age = 5;
そして、コンストラクターに渡された引数の値がsmudgeオブジェクトに割り当てられました (この場合、これが指します)。実際、クラス内でコンストラクターを宣言しなくても、クラスはコンストラクターを呼び出します。しかし、どうしてそんなことが可能なのでしょうか?О_О なぜなら、すべての Java クラスにはいわゆるデフォルト コンストラクターがあるからです。引数は必要ありませんが、任意のクラスのオブジェクトを作成するたびに呼び出されます。

public class Cat {

    public static void main(String[] args) {

        Cat smudge = new Cat(); // The default constructor is invoked here
    }
}
一見すると、これは明らかではないかもしれません。オブジェクトを作成したので、どうなるでしょうか? ここでコンストラクターはどこで何かを行っているのでしょうか? これを確認するには、 Catクラスの空のコンストラクターを明示的に作成してみましょう。その中で、いくつかのフレーズをコンソールに出力します。フレーズが表示される場合、コンストラクターが呼び出されています。

public class Cat {

    public Cat() {
        System.out.println("A cat has been created!");
    }

    public static void main(String[] args) {

        Cat smudge = new Cat(); // The default constructor is invoked here
    }
}
コンソール出力: 猫が作成されました。確認です。デフォルトのコンストラクターは常にクラス内に目に見えない形で存在します。しかし、それについてもう 1 つ知っておく必要があります。引数を使用してコンストラクターを作成すると、デフォルトのコンストラクターはクラスから削除されます。実際、これの証拠はすでに上で見ました。それは次のコードにありました。

public class Cat {

    String name;
    int age;

    public Cat(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public static void main(String[] args) {

        Cat smudge = new Cat(); // Error!
    }
}
Catコンストラクターを string パラメーターと int パラメーターで 宣言したため、名前と年齢なしで Cat を作成することはできませんでした。これにより、デフォルトのコンストラクターがクラスから即座に消えてしまいました。したがって、引数のないコンストラクターを含め、クラス内に複数のコンストラクターが必要な場合は、それを個別に宣言する必要があることに注意してください。私たちのクリニックは善行を行い、名前も年齢も不明のホームレスの子猫を助けたいと考えています。コードは次のようになります。

public class Cat {

    String name;
    int age;

    // For cats with owners
    public Cat(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // For street cats
    public Cat() {
    }

    public static void main(String[] args) {
        
        Cat smudge = new Cat("Smudge", 5);
        Cat streetCat = new Cat();
    }
}
明示的なデフォルト コンストラクターを指定したので、両方のタイプの猫を作成できます。 コンストラクターでは、値を直接割り当てることができます。常に引数からそれらを取得する必要はありません。たとえば、「Street cat No. <count>」をテンプレートとして使用して、データベース内のすべての街路猫にラベルを付けることができます。:

public class Cat {

    String name;
    int age;

    static int count = 0;

    public Cat() {
        count++;
        this.name = "Street cat No. " + count;
    }

    public Cat(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public static void main(String[] args) {

        Cat streetCat1 = new Cat();
        Cat streetCat2 = new Cat();
        System.out.println(streetCat1.name);
        System.out.println(streetCat2.name);
    }
}
街の猫の数をカウントするcount変数 があります。デフォルトのコンストラクターが実行されるたびに、count が 1 ずつ増加し、この数値が猫の名前に付加されます。引数の順序はコンストラクターにとって非常に重要です。コンストラクターに渡される name 引数と age 引数を交換してみましょう。

public class Cat {

    String name;
    int age;

    public Cat(int age, String name) {
        this.name = name;
        this.age = age;
    }

    public static void main(String[] args) {

        Cat smudge = new Cat("Smudge", 10); // Error!
    }
}
エラーが発生しました! コンストラクターは、Catオブジェクトの作成時に、数値と文字列をこの順序で渡す必要があることを明確に規定しています。したがって、私たちのコードは機能しません。独自のクラスを宣言するときは、必ずこのルールを覚えて尊重してください。

public Cat(String name, int age) {
    this.name = name;
    this.age = age;
}

public Cat(int age, String name) {
    this.age = age;
    this.name = name;
}
これら 2 つはまったく異なるコンストラクターです。次に、資料の理解を確実にするために、いくつかのタスクを完了してください。:)
  1. 古代遺物博物館。

    あなたのタスクは、 Artifactクラスを設計することです。
    博物館には3種類の遺物が保管されています。
    最初のタイプについては、博物館によって割り当てられたシリアル番号 (例: 212121) 以外は何もわかりません。
    2 番目のタイプについては、シリアル番号とそれを作成した文化がわかっています (例: 212121、「Aztecs」)。
    3 番目のタイプについては、シリアル番号、それを作成した文化、および作成された世紀がわかります (例: 212121、「Aztecs」、12)。

    博物館に保管されている古遺物を説明するArtifactクラスを作成し、そのクラスに必要なコンストラクターのセットを作成します。次に、main()メソッドで、各種類のアーティファクトを 1 つ作成します。

    
    public class Artifact {
        
        // Write your code here
    
        public static void main(String[] args) {
            // Write your code here
        }
    }
    
  2. 出会い系サイト

    出会い系サイトのユーザー データベースを作成してみましょう。
    しかし、ここに問題があります。必要な引数の順序を忘れており、利用可能な技術文書もありません。次のフィールドを持つUser
    クラス を設計します: name ( String )、age ( short )、および height ( int )。 名前、年齢、身長を任意の順序で指定できるように、適切な数のコンストラクターを作成します。

    
    public class User {
    
        String name;
        short age;
        int height;
    
        // Write your code here
    
        public static void main(String[] args) {
            
        }
    }
    
学んだことをさらに強化するには、Java コースのビデオ レッスンを視聴することをお勧めします。
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION