2012-03-12 11 views
2

私はJavaを学んでいます。メソッドやメンバが静的なときにpublicとprivateがなぜ使用されるのか不思議です。 staticは、クラスメソッドとクラスメンバであり、オブジェクトを作成せずに他のクラスから使用できるので、publicとprivateは必要ですか?いくつかの助けは、理解するためにpreciateです。申し訳ありませんが、この質問が単純すぎる場合は、いくつかの。なぜ静的メンバーとメソッドにpublicとprivateを使用するのですか?

+0

あなたの質問は不明です.public *と* privateとして何かを指定することはできません。静的vsインスタンスメンバーに関係なくアクセシビリティルールは同じです...なぜプライベートvsパブリックの強制はインスタンスメンバーにとって重要ですが、静的メンバーではないと思いますか? –

+0

多分あなたがクラスを作成するときに操作するべきではない値があるかもしれません。クラスサークルは常にプライベートダブルPI = 3.14 ....を持ち、半径は時々異なる可能性があるのでpublicでなければなりません。 –

答えて

4

フィールドまたはメソッドのアクセシビリティは、静的であるかどうかとは正反対です。

外部からアクセスできる静的メソッドと、静的メソッド(静的メソッドまたは非静的メソッド)をクラス内部からのみ使用する必要があります。同じことがフィールドにも当てはまります。例えば

:私は、Javaを学んでいると私はちょうどメソッドまたはメンバーが静的であるとき、なぜ公共と民間が使用されているだろう

// not visible from the outside 
private static final long MILLISECONDS_IN_A_MINUTE = 1000L * 60 * 60; 

public static Date addMinutes(Date d, int amount) { 
    return addMillis(d, MILLISECONDS_IN_A_MINUTE * amount); 
} 

// not visible from the outside 
private static Date addMillis(Date d, long amount) { 
    return new Date(d.getTime() + amount); 
} 
+0

OKですが、静的メソッドまたは静的フィールドを呼び出すクラスまたはメソッドも静的でなければならないという規則がありますか? –

+0

いいえ、そのようなルールはありません。しかし、反対のためのルール(のような)があります。静的メソッド内で 'instanceMethod()'を呼び出すことはできません(非静的メソッドを呼び出すインスタンスが必要です)。 – aioobe

0

これは必須ではありませんが、staticメソッドと内部メンバー専用のデータメンバーがあります。あなたはクラスのインスタンスごとに一意のIDたい場合

このための例は次のとおりです。

class Foo 
{ 
    private static int nextId = 0; 
    private static int generateId() { return ++nextId; } 
    private int id; 
    public Foo() 
    { 
     id = generateId(); 
    } 
} 

あなたが見ることができるように、nextIdgenerateId()がクラス外で必要とされていないが、また彼らは屋外で使用する必要がありますクラス。クラス自身がidの生成を担当します。しかし、それらをstaticにする必要があります(nextIdstaticになる必要がありますが、非スタティックメンバーにはアクセスしないので、generateId()を静的にすることもできます)。

オブジェクトFooが作成されるたびに、staticカウンタが増分されるため、クラスのインスタンスごとに異なるIDが取得されます。 (この例はスレッドセーフではありません)

0

静的パブリックメソッドがあり、このメソッドがプライベート属性にアクセスする必要があるとします。このプライベート属性も静的でなければなりません。プライベートスタティックが存在する理由の1つがあります。

例:上記

public class Test { 
    private static int myattr = 0; 

    public static void foo() { 
    myattr = 2; 
    } 
} 

myattrfoo()方法でそれを使用するためには、静的な属性でなければなりません。

0

はい、必要です。

スタティックメソッドがあり、そのメソッドでプライベート変数を使用する場合は、静的メソッドも宣言する必要があります。

また、静的変数を他のパッケージに表示したくない場合は、パブリック宣言しないでください。

1

は、私はあなたの質問は、アクセス修飾子がインスタンスのためのものであることを一般的な誤解が原因であると考えているが、彼らはありません!

クラスの2つの異なるインスタンスが互いにプライベートメンバーにアクセスできます。

つまり、アクセス修飾子は、クラスレベルで動作します。静的メンバーもいくつかのクラスに属しているため、アクセス修飾子を持つことも意味があります。

(JB Nizetの例のように)同じクラスのコードでのみ使用する静的メソッド(または変数)は、プライベートである必要がありますが、任意のクラスのコードで使用できる静的メソッドまたは変数公開する必要があります。

0

私は覚えているから、実際にはが必要ですが必要です。しかし、publicは、基本的にどのプログラミング言語でも、外部ファイルで使用できることを意味します。 プライベートはそのファイル内でのみ使用でき、スタティックは前記参照の値を変更できないことを意味します。これらが関数であれ、変数であれ、同じ規則が適用されます。私はオフかもしれません。約1年半でJavaをやっていない。

これらのタイプを組み込む方法はあなた次第です。結局のところ、プログラムはユーザーの多様性だけです。^_^

0

パブリックとプライベートのキーボードは可視性と関係があります。どのメンバーに他のクラスからアクセスしたいのか、隠したりカプセル化したりする必要がありますか? 静的メンバーはクラス全体に関連し、非静的メンバーはオブジェクトインスタンスに作用します。

0

静的メソッドをメソッドとともに使用する場合、静的メソッドを他のクラスのメンバーが使用する必要があるだけではありません。 (メソッドを含む) クラス、すなわちないオブジェクトはそのクラスを作成できませんインスタンス化できない場合。

場合、我々はクラスの静的メソッドにアクセスするものです

2つの異なるクラスが同じ名前の静的メソッドを持つ場合があります。その場合、他のクラスのメソッドではなく、同じクラスのメソッドを使用します。

関連する問題