質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

3回答

4218閲覧

静的クラスと静的メソッドについて理解したいです。

former_neet_cat

総合スコア46

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

1グッド

1クリップ

投稿2017/09/15 16:10

###私はJavaを始めて1日も経ってないです。
静的クラスがあるなら動的クラスもあるの?
staticをつければ静的クラスになるのか?
そもそも静的クラスとは何か、静的メソッドって何?
のレベルです。
Java本格入門という本を読んでいるのですが、説明を見ても理解しがたく、困っています。
教えて頂けると、ありがたいです。

seastar3👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

「static」をそのまま訳すと「静的」になるため、static修飾子がついたネストクラス※、フィールド、メソッドをそれぞれ「静的ネストクラス」、「静的フィールド」、「静的メソッド」などと呼ぶことがあります。ですが、何か「動的」なものがあってそれに対して「静的」であるということではなく、歴史的経緯でstaticと付けているだけです。それぞれは「クラスの名前空間にあるクラス」、「クラス変数」、「クラスメソッド」と理解するのが無難です(これらの用語はオブジェクト指向での用語であって、Javaの用語では無い事に注意してください)。

※ ネストクラスとはクラス定義の中に入れ子で定義されているクラスのことです。一番外側の通常のクラスはトップレベルクラスと言われ、トップレベルクラスにstatic修飾子を付けることはできません。また、ローカル変数、局所クラス(メソッド内で定義するクラス)もstatic修飾子を付けることはできません。

###なぜstaticなのか

遡ればB言語やBCPLの時からあるものもありますが、こういった予約語(修飾子、型名、制御文)や各記号の意味や構文等の文法はC言語に由来します。C → C++ → Javaという継承の流れであり、それらを見ないとなぜstaticを付けるのかは理解できないでしょう。

Cはオブジェクト指向を考慮した言語ではないため、クラスなどはありませんでした。それでもstaticは存在し、次のように使われていました。

  • staticを付けたローカル変数は、静的記憶期間の変数として扱い、プログラム起動時に変数は生成され、関数が終了しても変数は破棄されず、再度関数が呼び出されたときは、前回の変数の値が維持されている。
    なお、staticが付いていないローカル変数は、autoが付いている見なし、関数の呼び出しの度に毎回生成され、関数が終了した時点で自動的に破棄される。(auto自体は省略可能であり、通常は省略して使う。)
  • staticを付けた外部変数(関数の外で宣言された変数)や関数は、ファイルスコープ(そのファイルからしか見えない)になる。

ローカル変数での使い方はstaticautoの対比であり、まさしく静的な生成される変数動的に生成される変数と言っても良いものでした。しかし、外部変数や関数の使い方は単にスコープの制限であり、既に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

raccy

総合スコア21735

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

former_neet_cat

2017/09/17 06:51

詳しく教えて頂きありがとうございます。おかげで、なぜstaticが静的と呼ばれているのかが掴めたような気がします。この内容がより深く理解できるように精進していきたいです。
guest

0

ベストアンサー

Staticクラスとは、インスタンスを生成しないクラスのことです。
インスタンスとは、例えば、
「名前、身長、体重」を保持するクラスがあるとすれば、
そのインスタンスは「佐藤、170、60」というよう風にして作られる、
というと理解できるでしょうか。

例えば、「数字を引数として受け取り3桁ごとにカンマを付与して返却するクラス」があるとします。
これは、どんな処理でも一様に引数を受け取り処理を実行すれば良いので、Staticクラスで良い訳です。
このようなクラスを"静的クラス"と呼んでいます。(静的は単にStaticを和訳しただけです)

例えば、「会員情報を保持し、会員情報を操作するクラス」があるとします。
これは、会員ごとに異なる情報を保持する必要があるので、会員ごとにインスタンスが必要です。
これは静的でないクラスです。(=Staticがつかないクラス(なので通常は、動的とは呼びません))

以上を以って質問事項に回答致します。

静的クラスがあるなら動的クラスもあるの?

⇒"静的クラス"の逆は"静的でないクラス"となります。
Javaで言うと、staticクラスの逆はstaticでないクラスとなります。

そもそも静的クラスとは何か、静的メソッドって何?

⇒静的クラスと静的メソッドの違いは、インスタンスを生成しない範囲の違いというだけです。
静的クラス、静的メソッドの他に静的変数というものがあります。
staticの概念を理解しておけば、今は特にその違いを強く意識しなくても良いかもしれません。

投稿2017/09/15 22:06

yamashita_yuich

総合スコア316

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

former_neet_cat

2017/09/17 06:53

解りやすい説明ありがとうございます。とても助かりました。
guest

0

端的に述べれば、インスタンス化することを目的としないクラスやインスタンスに紐付かないフィールド、メソッドにstaticを付与することがあります。

例えば、クラスに属するインスタンスの数を保持するフィールドを持つならばstaticが適切です。これは特定のインスタンスに紐づくものでないからです。インスタンスは複数かもしれませんし0個かもしれませんのでインスタンスの数だけ用意する必要がありません。

投稿2017/09/15 16:19

HogeAnimalLover

総合スコア4830

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問