2011-08-08 19 views
2

インスタンス化されたオブジェクトのプライベートメソッドを呼び出すことはできません。なぜ私は以下のコードが動作するのだろうか?私はプライベートメソッドを呼び出すことができますか?

public class SimpleApp2 { 

/** 
* @param args 
*/ 
private int var1; 

public static void main(String[] args) { 
    SimpleApp2 s = new SimpleApp2(); 
    s.method1(); // interesting?! 
} 

private void method1() { 
    System.out.println("this is method1"); 
    this.method2(); // this is ok 
    SimpleApp2 s2 = new SimpleApp2(); 
    s2.method2(); // interesting?! 
    System.out.println(s2.var1); // interesting?! 
} 

private void method2() { 
    this.var1 = 10; 
    System.out.println("this is method2"); 
} 
} 

私はクラス内からプライベートメソッドにアクセスできることを理解しています。しかし、クラス内のメソッドがその同じクラスのオブジェクトをインスタンス化する場合、そのインスタンス化されたオブジェクトにスコープ規則を適用すべきではないでしょうか?

mainのような静的メソッドは、この例のようにクラスの非静的メンバーにアクセスできますか?

+0

このstackflow質問は役立つかもしれない:[Javaでは、公共、デフォルト、保護、およびプライベートの違いは何ですか?] [1] [1]:http://stackoverflow.com/questions/ 215497/in-java-whats-the-difference-between-public-default-protectedとprivateの違い – zengr

答えて

11

mainメソッドはSimpleAppのメソッドなので、SimpleAppのプライベートメソッドを呼び出すことができます。それはstatic方法だという理由だけで

publicprivateなどの目的のための方法のように振る舞うことを防ぐことはできませんprivateだけSimpleApp年代のメソッドにアクセスすることからクラスのメソッドを防ぐことができます。

3

mainSimpleAppのメンバーです。

0

privateスコープがメソッドを定義するクラスへのアクセスを制限し、mainが同じクラスに存在するためです。

private修飾子 - フィールドは、それ自身のクラス内でのみアクセス可能です。

JavaドキュメントのAccess Modifiersを参照してください。 Java Tutorialから

2

private修飾子フィールドは、独自のクラス内でアクセス可能である

main方法は、プライベートメソッドと同じクラス内であり、したがって、それへのアクセスを持っています。

0

あなたが発行する呼び出しは、プライベートメソッドが存在する同じクラス内からのものです。これは許可されています。これはjavaで 'private'が定義されている方法です。

2

privateは、「このクラスのものだけがそれを混乱させる」ことを意味します。それはではありませんは、 "このインスタンスだけがそのメソッドを呼び出すことができます"という意味で、あなたが期待しているようです。 SimpleAppのコードでは、SimpleAppのものを使用できます。代わりに、カプセル化を中断することです - たとえば、、またはpublicのフィールドを作成せずに、別のインスタンスのフィールドへのアクセスを必要としない、適切なequalsメソッドを作成する方法、または利用可能なデータに対してのみゲッターを必要とする方法クラス内?

0

プログラムでは、2つのプライベートメソッドを呼び出すために、クラスのインスタンスを2つ作成しました。この作業が、オブジェクト参照を使用してクラス外でパブリックメソッドまたはデフォルトメソッドを呼び出すために使用した方法であるということは興味深いことです。この場合は、すべてクラス定義内で実行されるため、有効です。同じコードをクラス外に置くと、エラーが発生します。あなたの方法は、それが上記の親指ルールに基づいてアクセス可能な車の中でのよう

2

は、グラフの下

アクセス修飾子

     **Same Class Same Package Subclass Other packages** 
**public**    Y    Y   Y    Y 
**protected**    Y    Y   Y    N 
**no access modifier** Y    Y   N    N 
**private**    Y    N   N    N 

を参照してください。

関連する問題