まず、クラスはpublicでしか変更できないというのは誤った提案です。publicで変更されたクラスのみが表示され、一部のクラスにはアクセス修飾子がありません。現時点では、アクセス許可はデフォルトです。次に、クラスは実際には外部クラスと内部クラス(内部クラス)に分けられます。一般クラスは外部クラスであり、内部クラスは外部クラスによって生成される必要があり、内部クラスはさまざまなアクセス修飾子を使用して変更できます。それで、質問はに変換されます、なぜ私たちは外部クラスを変更するためにプライベートと保護を使用できないのですか?
Javaでは、アクセス修飾子がクラス、メソッド、変数、および構築メソッドを変更できることを私たちは知っています。
アクセス権には、高から低まで4種類あります。
クラス内 | このパッケージ | サブパッケージ | 外部包 | |
---|---|---|---|---|
公衆 | v | v | v | v |
保護された | v | v | v | バツ |
デフォルト | v | v | バツ | バツ |
民間 | v | バツ | バツ | バツ |
さまざまなアクセス許可に従ってクラスにアクセスできるようにするために、アクセス修飾子を使用してクラスを変更します。
外部クラスがプライベート変更を使用する場合、他のクラスからアクセスできず、このクラスはその意味を失います。
外部クラスがprotectedで装飾されている場合、デフォルトと比較して、パッケージ内のアクセシビリティに基づいて、パッケージ外のサブクラスにもアクセスできるようです。ただし、パッケージ外の子クラスになりたい場合は、最初に親クラスを継承する必要がありますが、親クラスが見つからず、継承できません(鶏が先か卵が先か)、効果はデフォルトであり、存在する必要はありません。
インナークラスについて:
内部クラスは、メンバー内部クラス、ローカル内部クラス、匿名内部クラス、および静的内部クラスに分けられます。
メンバー内部クラスは、別のクラスで定義されたクラスであり、最も一般的な種類の内部クラスです。
class Circle {
double radius = 0;
public Circle(double radius) {
this.radius = radius;
}
class Draw {
//内部类
public void drawSahpe() {
System.out.println("drawshape");
}
}
}
このように、クラスDrawはクラスCircleのメンバーのようなものであり、Circleは外部クラスと呼ばれます。メンバーの内部クラスは、外部クラスのすべてのメンバー属性とメンバーメソッド(プライベートメンバーと静的メンバーを含む)に無条件でアクセスできます。
内部クラスはprivate、protected、default、publicで変更でき、private変更は外部クラスでのみアクセスできます。
インターフェースについて
public interface Comparable<T>{
int compareTo(T other);
}
インターフェイスのすべてのメソッドは自動的にpublicに属し、インターフェイスでメソッドを宣言するときにキーワードpublicを指定する必要はありません。
変更された工法
シングルトンデザインパターンでは、privateを使用して構築メソッドを変更し、コンストラクターをプライベート化します。つまり、クラスをクラスの外部でインスタンス化することはできません。クラスがインスタンス化された後、インスタンスオブジェクトを返すための外部アクセスのメソッドを提供します。
public class SingletonTest {
public static void main(String[] args) {
//测试
Singleton instance = Singleton.getInstance();
Singleton instance2 = Singleton.getInstance();
System.out.println(instance == instance2); // true
System.out.println("instance.hashCode=" + instance.hashCode());
System.out.println("instance2.hashCode=" + instance2.hashCode());
}
}
//饿汉式
class Singleton {
//1. 构造器私有化
private Singleton() {
}
//2.本类内部创建对象实例
private final static Singleton instance = new Singleton();
//3. 提供一个公有的静态方法,返回实例对象
public static Singleton getInstance() {
return instance;
}