###私はJavaを始めて1日も経ってないです。
静的クラスがあるなら動的クラスもあるの?
staticをつければ静的クラスになるのか?
そもそも静的クラスとは何か、静的メソッドって何?
のレベルです。
Java本格入門という本を読んでいるのですが、説明を見ても理解しがたく、困っています。
教えて頂けると、ありがたいです。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
「static」をそのまま訳すと「静的」になるため、static
修飾子がついたネストクラス※、フィールド、メソッドをそれぞれ「静的ネストクラス」、「静的フィールド」、「静的メソッド」などと呼ぶことがあります。ですが、何か「動的」なものがあってそれに対して「静的」であるということではなく、歴史的経緯でstatic
と付けているだけです。それぞれは「クラスの名前空間にあるクラス」、「クラス変数」、「クラスメソッド」と理解するのが無難です(これらの用語はオブジェクト指向での用語であって、Javaの用語では無い事に注意してください)。
※ ネストクラスとはクラス定義の中に入れ子で定義されているクラスのことです。一番外側の通常のクラスはトップレベルクラスと言われ、トップレベルクラスにstatic
修飾子を付けることはできません。また、ローカル変数、局所クラス(メソッド内で定義するクラス)もstatic
修飾子を付けることはできません。
###なぜstatic
なのか
遡ればB言語やBCPLの時からあるものもありますが、こういった予約語(修飾子、型名、制御文)や各記号の意味や構文等の文法はC言語に由来します。C → C++ → Javaという継承の流れであり、それらを見ないとなぜstatic
を付けるのかは理解できないでしょう。
Cはオブジェクト指向を考慮した言語ではないため、クラスなどはありませんでした。それでもstatic
は存在し、次のように使われていました。
static
を付けたローカル変数は、静的記憶期間の変数として扱い、プログラム起動時に変数は生成され、関数が終了しても変数は破棄されず、再度関数が呼び出されたときは、前回の変数の値が維持されている。
なお、static
が付いていないローカル変数は、auto
が付いている見なし、関数の呼び出しの度に毎回生成され、関数が終了した時点で自動的に破棄される。(auto
自体は省略可能であり、通常は省略して使う。)static
を付けた外部変数(関数の外で宣言された変数)や関数は、ファイルスコープ(そのファイルからしか見えない)になる。
ローカル変数での使い方はstatic
とauto
の対比であり、まさしく静的な生成される変数と動的に生成される変数と言っても良いものでした。しかし、外部変数や関数の使い方は単にスコープの制限であり、既にstaticという単語の意味とはかけ離れたものになっています。
C++になるとここにオブジェクト指向の概念が加わり、クラスのメンバー(メンバー変数とメンバー関数があり、Javaでいうフィールドとメソッドに相当する)にstatic
修飾子を付けられるようにしました。その場合は次のようなものです。
static
を付けたメンバー変数は、プログラム起動時に一つのみ生成され、個々のインスタンスとは関係無しにアクセスできる。(クラスにそのものに紐付いた変数、いわゆるクラス変数)static
を付けたメンバー関数は、個々のインスタンスとは関係無しに呼び出せる。ただし、内部でstatic
が付いていないメンバー変数やメンバー関数は使用できない。(クラスにそのものに紐付いた関数、いわゆるクラスメソッド)
staticメンバー変数の使い方は起動時に生成などローカル変数に近い物がありますが、クラスそのものに紐付いていると言うことが重要なことです。これと併せてstaticメンバー関数もクラスそのものに紐付くとされました。もう、この時点で「静的」という言葉の本来の意味にはなっていません。そもそも(ラムダ式などで動的に作成する場合を除いて)全ての関数はプログラムが起動された時点で初めから存在しており、静的に生成されるも何も無いからです。
では、なぜstatic
という言葉を選んだのかですが、C++ではCから予約語をなるべく増やしたくないというのがあったからだと思われます。C++はCのスーパーセットであり、Cで書いたコードがほぼそのまま動くように考慮して作られました。予約語を増やすことは、その予約語を変数名に使っているプログラムを全て書き換えることになるため、慎重に行う必要があります。そのため、既存の予約語を別の意味で再利用するという手法が使われたと思われます。近年でもC++11からauto
がCとは別の意味で再利用されています。
最後にJavaです。JavaはC++のオブジェクト指向部分に強く影響を受けて作られた言語です。そのため、修飾子の使い方等も踏襲した部分があります(全てではありませんが)。static
もその中の一つです。Javaのstatic
も、クラスに紐付く、インスタンスから独立している、という意味以外の何者でもありません。「静的」などという意味はとうの昔に失われてしまっているのです。
###他言語
C++やJavaから強く影響を受けたオブジェクト指向言語はこのstatic
の使い方をそのまま踏襲しています。D、C#、PHP、JavaScript等です。いわゆるC-like言語とかC-family言語とかC風言語とか言われるものが該当します。これはC++やJavaを学んだものにとってわかりやすいというのが採用の理由だと思います。
逆に文法的な影響が薄い言語では、static
でクラス変数やクラスメソッドを作りません。Smalltalk、Objectvi-C、Python、Ruby、VB.NET、Scala、Kotlin、Perl6等です。
なお、Swiftではstatic
修飾とclass
修飾の両方があり、それぞれ細部が異なるようです。あまり詳しくないので、詳しい人から聞いてください。
プログラミングを始めたばかりの人にする説明じゃ無いような…。
投稿2017/09/15 22:55
総合スコア21735
0
ベストアンサー
Staticクラスとは、インスタンスを生成しないクラスのことです。
インスタンスとは、例えば、
「名前、身長、体重」を保持するクラスがあるとすれば、
そのインスタンスは「佐藤、170、60」というよう風にして作られる、
というと理解できるでしょうか。
例えば、「数字を引数として受け取り3桁ごとにカンマを付与して返却するクラス」があるとします。
これは、どんな処理でも一様に引数を受け取り処理を実行すれば良いので、Staticクラスで良い訳です。
このようなクラスを"静的クラス"と呼んでいます。(静的は単にStaticを和訳しただけです)
例えば、「会員情報を保持し、会員情報を操作するクラス」があるとします。
これは、会員ごとに異なる情報を保持する必要があるので、会員ごとにインスタンスが必要です。
これは静的でないクラスです。(=Staticがつかないクラス(なので通常は、動的とは呼びません))
以上を以って質問事項に回答致します。
静的クラスがあるなら動的クラスもあるの?
⇒"静的クラス"の逆は"静的でないクラス"となります。
Javaで言うと、staticクラスの逆はstaticでないクラスとなります。
そもそも静的クラスとは何か、静的メソッドって何?
⇒静的クラスと静的メソッドの違いは、インスタンスを生成しない範囲の違いというだけです。
静的クラス、静的メソッドの他に静的変数というものがあります。
staticの概念を理解しておけば、今は特にその違いを強く意識しなくても良いかもしれません。
投稿2017/09/15 22:06
総合スコア316
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
端的に述べれば、インスタンス化することを目的としないクラスやインスタンスに紐付かないフィールド、メソッドにstaticを付与することがあります。
例えば、クラスに属するインスタンスの数を保持するフィールドを持つならばstaticが適切です。これは特定のインスタンスに紐づくものでないからです。インスタンスは複数かもしれませんし0個かもしれませんのでインスタンスの数だけ用意する必要がありません。
投稿2017/09/15 16:19
総合スコア4830
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/09/17 06:51