Javaの基本クラスとオブジェクト、シングルトンパターン、継承

巴扎黑
リリース: 2017-06-26 11:29:32
オリジナル
994 人が閲覧しました

Java クラスとオブジェクト

一般クラスはパブリックまたはデフォルトのみにすることができます。パブリックの場合、クラス名はファイル名と同じである必要があります。通常、ファイルにはクラスは 1 つしか記述されないため、このクラスは public で追加するのが一般的です。

内部クラスはプライベートにして保護することもできます。現在のクラスのみが必要なため、通常はプライベートです。こうすることで、外部クラスのみが直接アクセスできるようになります。したがって、内部のデータがパブリック、プライベート、またはデフォルトであるかどうかは関係ありません。

public class Out {private int d = 10;public int add() {      // 外部类不能直接访问内部类的数据,除非new出内部类对象,如下  // Out.In abc = new Out().new In();a = 3; // falseb = 5; // false}  // 内部类private class In {private int a = 100;int b;public int c;public void add() {
            System.out.println(d); // true, 内部类却可以直接访问外部类的数据}
    }public static void main(String[] args) {
        Out bb = new Out();
        Out.In abc = new Out().new In();
        bb.d = 20; // 本类可以直接访问private,一般不这样,而是写个set函数,搭配get函数System.out.println(aa.a); // 100System.out.println(bb.d); // 被修改为20}
}
ログイン後にコピー
  • 匿名オブジェクト

new Abc().run(); // 调用一次后这个对象就销毁new Abc().run(); // 这是另外一个Abc对象了
ログイン後にコピー
  • プライベート変数について

  • プライベート変数: データをカプセル化し、メソッドのみをユーザーに表示します。たとえば、プライベート String 名は自由に変更できませんが、setName() メソッドと getName() メソッドを呼び出してデータのカプセル化を実現することができ、より安全です。

  • プライベート メソッド: ユーザーが呼び出す関数を使用せずに、いくつかの内部実装の詳細を完了することでプライベートとして定義できます。たとえば、選択ソート アルゴリズムは、2 つのデータを交換するプロセスを含むメソッドとして記述され、関数にカプセル化されます。この関数はユーザーが操作する必要はなく (ユーザーは sort() を使用するだけで済みます)、この swap() は private として定義されます。

単一ケース設計パターン

は、メモリ内のクラスのオブジェクトの一意性を保証できます。複数のプログラムで同じ構成情報オブジェクトを使用する必要がある場合、この場合、オブジェクトの一意性を保証する必要があります。 単一のケースが必要です。

ツールクラスにおいて、オブジェクトのメンバーデータを使用(アクセス)しない場合は、オブジェクトを作成する必要はありません。オブジェクトの作成を防ぐために、コンストラクターを private として定義できます。

オブジェクトの一意性を保証するにはどうすればよいですか?

  1. 他のプログラムが new を使用してこのクラスのオブジェクトを作成することを許可せず、コンストラクターを private に設定します

  2. このクラス内に一意のクラス インスタンスを作成します

  3. 他のプログラムがこれを取得できるようにメソッドを提供しますユニークなオブジェクト

単一ケースの設計手順

  1. このクラスのコンストラクターをプライベート化します

  2. newを通じてこのクラスのオブジェクトをこのクラスに入れます

  3. 公開メソッドを定義し、2を追加します作成されたオブジェクトは戻ります

ハングリーモード

// 饿汉式--不管用不用得到,先new出一个再说public class SingleDemo {// private不能将这个实例暴露出去,只能通过getInstance()获取,另为何是static?private static SingleDemo s = new SingleDemo();private SingleDemo() {}// 供外界调用来获取这个对象public static SingleDemo getInstance() {return s;
    }  // 只有本类中可以new对象并调用addpublic void add() {
        System.out.println("danli");
    }public static void main(String[] args) {      // 本类可以newSingleDemo a = new SingleDemo();
        a.add();
    }
}public class Test {public static void main(String[] args) {      // fasle, 其他类中若用到这个单例,不能newSingleDemo aa = new SingleDemo();      // true  SingleDemo aa = SingleDemo.getInstance();
    }
}
ログイン後にコピー

レイジーモード

// 另外一种单例设计模式--懒汉模式--用到了才new,延时加载public class SingleDemo {// 先设为空private static SingleDemo s;private SingleDemo() {}// 供外界调用来获取这个对象public static SingleDemo getInstance() {      if (s == null)
        s = new SingleDemo();return s;
    }
ログイン後にコピー

Q: メンバー変数が静的でメソッドが静的なのはなぜですか?

A: new は他のクラスで新しいオブジェクトを作成することを許可されていないため、getInstance() を 静的メソッド に設定すると、Single.getInstance()</ を通じて取得できます。 code> 新しいオブジェクトは必要なく、静的メソッド内のデータも静的である必要があります。したがって、この SingleDemo オブジェクトも静的である必要があります。 <code>Single.getInstance()来获取而无需new对象,又静态方法里的数据也必须是static的。故这个SingleDemo对象也必须是static的。

Q:饿汉模式和懒汉模式的区别?
A:懒汉模式是延时加载的,用到了才new;在多线程时不能保证对象的唯一性,是线程不安全的。饿汉模式是随着类的加载,就new出这个对象,不管用不用得上,是线程安全的。

继承

Java一般是单继承,不能直接多继承 --> 因为多个父类可能有相同的成员,调用会导致二义性。

但是可以多层继承,如 A --> B -->C--> D,可以表示A继承自B,而B继承自C,以此类推。

  • 本类成员和局部变量之间用this区分

  • 子类、父类的成员同名时用super区分

  • 派生类也不能访问基类的private成员,但是确实是继承过来了,只是不能访问而已,可以调用父类的set、get函数来操作子类的private成员,对父类没影响。

  • 若成员是protected等权限更高的,则不用set、get

    Q: 飢えた人モードと怠け者モードの違いは何ですか?
    A:
  • Lazy モード
  • は読み込みが遅く、使用されて初めて新しいものになります。マルチスレッドではオブジェクトの一意性が保証されず、スレッド安全ではありません。

    Hungry Man Mode

    は、クラスがロードされるときに新しいオブジェクトを作成します。使用されるかどうかに関係なく、スレッドセーフです。
継承
Java は一般的に
    単一継承
  • を持ち、直接多重継承することはできません --> 複数の親クラスが同じメンバーを持つ可能性があるため、呼び出しは曖昧さにつながります。

    ただし、A --> B -->C--> などの
  • 複数レベルの継承
  • は可能です。これは、A が B から継承し、B が C から継承することを意味します。

    このクラスのメンバーとローカル変数を区別するには、this を使用します

サブクラスと親クラスのメンバーが同じ名前を持つ場合は、super を使用して区別します
🎜🎜派生クラスは基本クラスのプライベートメンバーにアクセスできませんが、確かに継承されていますが、アクセスすることはできません。親クラスの set 関数と get 関数を呼び出して操作できます。サブクラスのプライベート メンバー。親クラスには影響しません。 🎜🎜🎜🎜メンバーが保護されているか、より高い権限を持っている場合は、set または get を使用せずにメンバーに直接アクセスできます。 🎜🎜🎜🎜親クラスとサブクラスのメンバーは互いに独立しています。サブクラスが自身のメンバーを変更しても、親クラスは変わりません。 🎜🎜🎜🎜
package Chap1;public class Fu {  // 父类的成员是私有的,子类继承过去了也不能直接访问
  private int age;private String name;public Fu(int age, String name) {this.age = age;this.name = name;
    }public int getAge() {return age;
    }public void setAge(int age) {this.age = age;
    }public String getName() {return name;
    }public void setName(String name) {this.name = name;
    }
}class Zi extends Fu {  // 特有的job,父不能访问private String job;Zi(int age, String name, String job) {super(age, name);this.job = job;
    }public String getJob() {return job;
    }  public static void main(String[] args) {
        Zi aa = new Zi(23, "Zi","Study");
        Fu bb = new Fu(55, "Fu");      // 改变子类不会影响父类aa.setAge(24);
        aa.setName("zi");      // zi 24 Study  // Fu 55System.out.println(aa.getName()+" "+aa.getAge() + " " + aa.getJob());
        System.out.println(bb.getName()+" "+bb.getAge());

    }
}
ログイン後にコピー
🎜🎜🎜🎜新しい子オブジェクトの場合、サブクラスは暗黙的に super() を実行します。最初に親クラスのコンストラクターが呼び出され、次にサブクラスのコンストラクターが実行されます。 🎜🎜🎜🎜デフォルトのコンストラクターはパラメーターなしであり、🎜パラメーター化されたコンストラクターはパラメーターのないコンストラクターをオーバーライドします🎜。このとき、 super(args) を明示的に使用する必要があり、これを最初の行に配置する必要があります。 super を明示的に記述しない場合、パラメータのない親クラスのコンストラクターであるデフォルトの super()🎜 が使用されます。実行されました。 🎜🎜🎜🎜りー🎜
  • 类是public,构造函数也是public的。他们的修饰符是对应的。

一个对象的实例化过程

Person p = new Person();

  1. JVM读取Person.class文件,加载进内存;若有父类,会先加载父类。

  2. 在堆内存中开辟空间,分配地址。

  3. 在对象空间中,对对象的属性进行默认初始化,如int age = 0; String name = null;

  4. 显示初始化,如private int age = 9。若是子类,则会先调用父类的构造器。

  5. (子)类的 构造函数进行特定的初始化。如下程序中age变成100。

  6. 初始化后,将地址传递给引用变量。Person p <-- new Person();

package Test;// 先打印9// 再打印100public class Demo {private int age = 9;
    {
        System.out.println(age);
    }Demo(int age) {this.age = age;
    }public static void main(String[] args) {
        Demo aa = new Demo(100);
        System.out.println(aa.age);
    }
}
ログイン後にコピー

以上がJavaの基本クラスとオブジェクト、シングルトンパターン、継承の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート