JavaRush /Java Blog /Random-JA /クラスの概要: 独自のクラス、コンストラクターの作成

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

Random-JA グループに公開済み
こんにちは!今日はJavaのクラスについて話します。 クラスはJavaプログラミングの中核とも言えます。プログラマーになると、主な仕事は、さまざまな機能を備えた独自のクラスを作成することになります。 クラスの概要: 独自のクラス、コンストラクターの作成 - 1これが何なのか、そしてそれがどのように機能するのかを理解してみましょう :) すでにご存知のとおり、Java はオブジェクト指向プログラミング言語です。すべてのプログラムは、何らかの形で相互に接続されたオブジェクトで構成されています。クラスは本質的にはオブジェクトのテンプレートです。それはオブジェクトがどのように見えるか、そしてどのような機能を持つかを決定します。すべてのオブジェクトは、何らかのクラスのオブジェクトです。最も単純な例を見てみましょう。
public class Cat {

    String name;
    int age;

}
プログラムを作成していて、このプログラムでは何かのために猫が必要であるとします (たとえば、オンライン予約ができる動物病院があります)。クラスを作成しCat、それに文字列nameと数値という 2 つの変数を指定しましたage。このようなクラス変数はフィールドと呼ばれます。基本的に、これは今後作成するすべての猫のテンプレートです。各猫 (クラス object Cat) には、名前と年齢という 2 つの変数があります。
public class Cat {

    String name;
    int age;

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

        System.out.println("We created a cat named" + barsik.name + ", his age - " + barsik.age);
    }

}
それが仕組みです!猫を作成し、名前と年齢を付けて、すべてコンソールに出力しました。複雑なことは何もありません:) ほとんどの場合、クラスは周囲の世界のオブジェクトや現象を説明します。猫、テーブル、人、稲妻、本のページ、車輪 - これらすべては、別個のクラスを使用してプログラム内で作成されます。次に、クラス内に作成した変数を見てみましょうCat。これらはフィールド、またはインスタンス変数と呼ばれます。実際、その名前はその本質をすべて表しています。クラスの各インスタンス(オブジェクト)にはこれらの変数がありますCat。私たちが作成する各猫には、独自の変数nameと独自のがありますage。一般に、これは論理的です。実際の猫ではすべてが同じです:) インスタンス変数に加えて、クラス変数や静的変数などもあります。例に次のことを追加しましょう。
public class Cat {

    String name;
    int age;

    static int count = 0;

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

        Cat vasia = new Cat();
        vasia.age = 5;
        vasia.name = "Vasya";
        count++;

        System.out.println("We created a cat named" + barsik.name + ", his age - " + barsik.age);
        System.out.println("We created a cat named" + vasia.name + ", his age - " + vasia.age);

        System.out.println("Total number of cats = " + count);
    }
}
コンソール出力:

Мы создали кота по имени Барсик, его возраст - 3
Мы создали кота по имени Вася, его возраст - 5
Общее количество котов = 2
これで、クラスに新しい変数count(数量) が追加されました。彼女は作成された猫を数える責任があります。main メソッドで cat を作成するたびに、この変数を 1 ずつ増やします。この変数は、staticキーワードで指定されます。これは、クラスの特定のオブジェクトではなく、クラスに属していることを意味します。もちろん、これは論理的です。各猫に独自の名前を付ける必要がある場合、すべての猫に対して 1 つの猫カウンターが必要になります。これはまさに「静的」という言葉が実現できること、つまりcountすべての猫にとって同じ変数です。注意してください: コンソールに出力するとき、barsik.countまたは は書きませんvasia.count。彼女は Barsik にも Vasya にも属していません。彼女はクラス全体に属していますCat。したがって、簡単ですcount。と書くこともできますCat.count- それも正しいでしょう。これは、変数をコンソールに出力する場合にはname機能しません 。
public class Cat {

    String name;
    int age;

    static int count = 0;

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

        System.out.println("We created a cat named" + name + ", his age - " + barsik.age);

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

メソッド

変数に加えて、各クラスにはメソッドがあります。詳細については別の講義で説明しますが、一般的なポイントは非常に簡単です。 メソッドはクラスの機能です。このクラスのオブジェクトができること。方法の 1 つはすでにご存知でしょう。これは ですmain()。しかし、覚えているとおり、メソッドはmain静的です。つまり、クラス全体に属します (ロジックは変数の場合と同じです)。また、通常の非静的メソッドは、作成した特定のオブジェクトに対してのみ呼び出すことができます。たとえば、猫用のクラスを作成したい場合、プログラム内で猫にどのような機能を持たせる必要があるかを理解する必要があります。これに基づいて、そのためのメソッドをいくつか書いてみましょう。
public class Cat {

    String name;
    int age;

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

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

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

        barsik.sayMeow();
        barsik.jump();

    }
}
さて、これで私たちのクラスは本物の猫の描写にかなり似てきました。今では、名前と年齢が付けられた Barsik という名前の猫がいるだけではありません。ニャーと鳴いたり、ジャンプしたりすることもできます。そのような「機能」のない猫がいるでしょうか:) 特定のオブジェクト - を取得しbarsik、そのメソッドsayMeow()と を呼び出しますjump()。コンソールを見てみます。

Мяу!
Прыг-скок!
本物の猫!:)

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

将来的には、独自のクラスを作成する必要があります。書くときにどんなことに注意すればいいでしょうか?変数について話している場合は、抽象化と呼ばれるものを使用する必要があります。 抽象化は、オブジェクト指向プログラミングの 4 つの基本原則の 1 つです。これには、オブジェクトの主な最も重要な特徴を強調することが含まれます。また、その逆、二次的で重要でない特徴を破棄することも含まれます。たとえば、会社の従業員のファイルを作成しているとします。従業員オブジェクトを作成するために、 クラス を作成しましたEmployee。会社ファイルで従業員を説明するにはどのような特徴が重要ですか? 氏名、生年月日、社会保障番号、納税者番号。しかし、社員証に彼の身長、目、髪の色が必要になる可能性は低いでしょう。会社はこの情報を必要としません。したがって、クラスにはEmployee変数String nameint ageint socialInsuranceNumberを設定しint taxNumber、必要のない情報 (目の色など) を破棄して抽象化します。しかし、モデル事務所向けに写真モデルのファイルを作成すると、状況は劇的に変わります。ファッションモデルを説明する場合、身長、目の色、髪の色は非常に重要ですが、TIN 番号はまったく重要ではありません。したがって、クラス内で変数、、Modelを作成する必要があります。これが抽象化の仕組みです。簡単です。:) int heightString hairString eyes

コンストラクター

猫の例に戻りましょう。
public class Cat {

    String name;
    int age;

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

        System.out.println("Something has been happening in the program for 2 hours...");

        barsik.age = 3;
        barsik.name = "Barsik";

    }
}
このコードを見て、プログラムの何が問題なのか推測してみてください。私たちの番組には2時間、名前も年齢も知らない猫がいました。もちろん、これは完全に間違いです。動物病院のデータベースには、猫に関する情報のない猫は存在しないはずです。あとはプログラマに任せます。自分の名前と年齢を忘れずに伝えれば、大丈夫です。彼が忘れると、データベースにエラーが発生します、未知の猫。この問題はどうすれば解決できるでしょうか? 名前と年齢のない猫の作成を何らかの方法で禁止する必要があります。ここでコンストラクター関数が役に立ちます。以下に例を示します。
public class Cat {

    String name;
    int age;

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

    public static void main(String[] args) {

        Cat barsik = new Cat("Barsik", 5);
    }
}
コンストラクターは本質的にクラス オブジェクトのテンプレートです。この場合、オブジェクトごとにcat2 つの引数 (文字列と数値) を指定する必要があることを指定します。今、名前のない猫を作ろうとしても、成功しません。
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 barsik = new Cat(); //error!
    }
}
クラスにコンストラクターが追加されたため、Java コンパイラーはオブジェクトがどのようなものであるかを認識し、引数が指定されていないオブジェクトの作成を許可しません。this次に、コンストラクター内に表示されるキーワードを見てみましょう。彼にとってもすべてがシンプルです。「this」は英語で「これ、これ」という意味です。つまり、この単語は特定の対象を指します。コンストラクター内のコード
public Cat(String name, int age) {
    this.name = name;
    this.age = age;
}
ほぼ文字通りに翻訳できます: 「この猫 (作成中) の名前=コンストラクターで指定された名前引数。この猫 (作成中) の年齢=コンストラクターで指定された年齢引数。」コンストラクターが起動した後、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 barsik = new Cat("Barsik", 5);
        System.out.println(barsik.name);
        System.out.println(barsik.age);
    }
}
コンソール出力:

Барсик
5
コンストラクターが完了すると、次のようになります。
Cat barsik = new Cat("Barsik", 5);
実際に内部では次のようなことが起こりました。
this.name = "Barsik";
this.age = 5;
そしてオブジェクトbarsik(それはthis)にはコンストラクターの引数から値が割り当てられました。実際、クラス内でコンストラクターを指定しない場合でも、コンストラクターが起動されます。しかし、どうしてそんなことが可能なのでしょうか?O_O 実際のところ、Java ではすべてのクラスにいわゆるデフォルト コンストラクターがあります。引数はありませんが、任意のクラスのオブジェクトが作成されるたびに起動されます。
public class Cat {

    public static void main(String[] args) {

        Cat barsik = new Cat(); //this is where the default constructor worked
    }
}
一見するとこれは目立ちません。さて、私たちはオブジェクトを作成して作成しましたが、デザイナーの仕事はどこにあるのでしょうか? Catこれを確認するには、クラスの空のコンストラクターを自分の手で作成し、その中でいくつかのフレーズをコンソールに出力してみましょう。表示されていれば、コンストラクターは機能しています。
public class Cat {

    public Cat() {
        System.out.println("Created a cat!");
    }

    public static void main(String[] args) {

        Cat barsik = new Cat(); //this is where the default constructor worked
    }
}
コンソール出力:

Создали кота!
ここで確認です。デフォルトのコンストラクターは常にクラス内に目に見えない形で存在します。しかし、もう 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 barsik = new Cat(); //error!
    }
}
文字列 + 数値のコンストラクターを定義したため、名前と年齢のない猫を作成することはできませんでしたCat。この直後、デフォルトのコンストラクターがクラスから消えました。したがって、クラス内に空のコンストラクターを含む複数のコンストラクターが必要な場合は、それを個別に作成する必要があることを必ず覚えておいてください。たとえば、私たちの動物病院は善行を行い、名前も年齢も分からない飼い主のいない猫を助けたいと考えています。コードは次のようになります。
public class Cat {

    String name;
    int age;

    //for domestic cats
    public Cat(String name, int age) {
        this.name = name;
        this.age = age;
    }

    //for street cats
    public Cat() {
    }

    public static void main(String[] args) {

        Cat barsik = new Cat("Barsik", 5);
        Cat streetCat = new Cat();
    }
}
デフォルトのコンストラクターを明示的に指定したので、両方のタイプの猫を作成できます。コンストラクターでは、引数から値を取得するだけでなく、明示的に値を割り当てることができます。たとえば、すべての街の猫を「街の猫番号...」という名前でデータベースに記録できます。
public class Cat {

    String name;
    int age;

    static int count = 0;

    public Cat() {
        count++;
        this.name = "Street cat number" + 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野良猫カウンターという 変数があります。デフォルトのコンストラクターを実行するたびに、それを 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 barsik = new Cat("Barsik", 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;
}
この二人は全く違うデザイナーなんです! 次に、マテリアルを統合するためにいくつかの問題を解決します:)
  • 古代遺物博物館。
あなたの仕事はクラスを設計することですArtifact。博物館に保管されている遺物は3種類あります。1 つ目は、博物館によって割り当てられたシリアル番号 (例: 212121) 以外は何もわかっていません。2 つ目は、シリアル番号とそれが作成された文化がわかっているものです (例: 212121、「アステカ」)。3 番目のタイプは、シリアル番号、それが作成された文化、およびその作成の正確な年齢がわかっているものです (例: 212121、「Aztecs」、12)。Artifact博物館に保管されている古遺物を記述するクラスを作成し、そのクラスに必要な数のコンストラクターを記述します。メソッドでmain()、各タイプのアーティファクトを 1 つ作成します。
public class Artifact {

    public static void main(String[] args) {
    }
}
  • 会議のウェブサイト
あなたは出会い系サイトのユーザー データベースを作成しています。しかし問題は、どのような順序で指定する必要があるかを忘れてしまったことと、技術仕様が手元にないことです。名前 ( )、年齢 ( )、身長 ( )Userのフィールドを持つクラスを設計します。名前、年齢、身長を任意の順序で指定できるように、必要な数のコンストラクターを作成します。 Stringshortint
public class User {

    String name;
    short age;
    int height;

    public static void main(String[] args) {

    }
}
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION