Javaでprivate,public,protectedのいくつかのキーワード


1、キーワードprivate 
class Sundae {
	private Sundae() {}
	static Sundae makeASundae() {
		return new Sundae();
	}
}

public class IceCream {

	public static void main(String[] args) {
		//!	Sundae sundae = new Sundae()	//     “  ” ,      
		Sundae sundae = Sundae.makeASundae();
		System.out.println(sundae);
	}
}

この例ではprivateの使用の便利さを示します.オブジェクトの作成方法を制御し、特定のコンストラクタに直接アクセスすることを防止したい場合があります.
(またはすべてのコンストラクタ).上記の例では、コンストラクタからSundaeオブジェクトを作成することはできません.逆に、
makeASundae()メソッドを呼び出して実装する必要があります(注釈③).③:デフォルトのコンストラクタは一意に定義され、その属性はprivateであるため、このクラスの継承を防止できます.
2、キーワードprotected 
public class Cookie {

	public Cookie() {
		System.out.println("Cookie construct");
	}
	
	void foo() {
		System.out.println("foo");
	}
}
public class ChocolateChip extends Cookie{

	public ChocolateChip() {
		System.out.println("ChocolateChip constructor");
	}
	
	public static void main(String[] args) {
		ChocolateChip x = new ChocolateChip();
		//! x.foo();	//      foo
	}
}

継承について,メソッドfoo()がクラスCookieに存在する場合,Cookieから継承されたすべてのクラスにも存在することに注目すべき興味深い.クラスCookieとクラスChocolateChipが同じパケットの下にない場合、foo()メソッド(同じパケットの下で可能)にアクセスできません.もちろん、publicにすることもできます.しかし、これでは誰もが自由に訪問できるので、私たちが望んでいる状況ではないかもしれません.次のようにクラスCookieを変更すると、
public class Cookie {

	public Cookie() {
		System.out.println("Cookie construct");
	}
	
	protected void foo() {
		System.out.println("foo");
	}
}

メソッドfoo()のアクセス制御権限をprotectedに設定すると、Cookieのサブクラスは外部パケットでfoo()メソッドにアクセスできます.
x.foo();   間違いを報告することはありません.
このときメソッドfoo()メソッドは公開されていない(public).