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

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

ただいまの
回答率

90.50%

  • Java

    15842questions

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

Javaという言語では、クラス定義のブロック外で変数を定義出来ますか?

解決済

回答 4

投稿

  • 評価
  • クリップ 0
  • VIEW 572
退会済みユーザー

退会済みユーザー

以下はJavaScriptのコードですが、Javaに関する質問になります。

設計などの書籍を読むとJavaが解説に用いられる言語になっていることが多く、普段、JavaScriptを書いている自分の場合は、Java自体書いたことがなく、かといって、時間をとって他の何よりも最優先でJavaを勉強するということも時間の制約上、出来ないため、すごく初歩的なJavaの質問をさせてください。Javaの前提知識がないため、設計の本を読んでいても、「もしかしてこれはJavaでは自分の知らない仕様上の制約があるから、こういう考えなのか?」といった疑問が出てくることがたまにあるので。

 質問

Javaという言語では、クラス定義のブロックの外で、変数などを宣言、代入して、そのファイル内のクラス内でその変数を参照するといったことは可能でしょうか? JavaScriptではできるのですが。

 Sample.js

//ココ!!!
const word = 'blah blah blah';

class Sample {

    constructor(name) {
        this.name  = name;
    }

    greeting() {
        console.log(this.name);
    }

    saySomething() {
        console.log(word);
    }

}

const sample = new Sample('teratail');
sample.greeting()
sample.saySomething()
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

+3

javascriptでは、プログラムの1行目から実行されますが、Javaは複数のファイルに記述されることもあり、スタート地点が定まりません。そこで通常mainというメソッドが実行されます。これが、javascriptにおけるファイルの1行目に当たります。

そういった意味では、書き方はともあれ同様のモノと考えてよいです。特にJavaのコードを読む際にはそのように考えても問題はないとおもいます。

ただし覚えておいてほしい点として、mainメソッドで定義した変数はほかのメソッドからは呼び出せません。メソッドを呼び出すときに引数として渡す必要があります。(クロージャは別ですがここでは混乱を招くので割愛します。)

また、クラスの外側ではありませんが、プログラムのどこからでも呼び出せる変数も定義できますが、少し回りくどい方法をとります。というのもどこからでも呼び出せる変数は、ある程度の大きなプログラムを書く際にプログラムを複雑にするため、推奨されていません。このような変数をグローバル変数と呼びます。

ここからは余談です。

Javaはグローバル変数を書きずらく(書けなく)して推奨しない立場をとっていると考えられます。逆にjavascriptはグローバル変数を許して、サクッと書けるようにしてあります。

このような違いが判るとjavascriptである程度の大きさのプログラムを書く際は、グローバル変数に当たるものを避けた方がよいなどの知識になります。

時間の制約がどのようなものかわかりませんが、複数の言語の仕様について学ぶことはこのように今使っている言語を上手に使うために非常に有意義なことです。回り道に見えますが、今すぐなでなくとも時間を割くことをお勧めします。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

checkベストアンサー

+2

Javaではできません。基本的にJavaは、「クラスからオブジェクトを生成してそのオブジェクトを操作、状態をもたせることで開発を行う言語」ですので、クラスに属していないフィールドやメソッドが存在することはありません。(なお、ENUMについては触れません)
※Javaではできないのは確かですが、Pythonはオブジェクト指向言語にもかかわらずクラス外宣言が可能ですので、このオブジェクト指向言語だからクラス外宣言はできないというのは間違っておりましたため訂正します。申し訳ありません。

JavaScriptは、オブジェクト指向言語ではなくスクリプト言語で、クラスの存在は必須ではありませんから、クラスの外に定義することは問題ないですし、普通ですよね。

オブジェクト指向について説明する記事がわかりやすかったので貼っておきます。→プログラミング勉強中の人にオブジェクト指向とは何なのかを何となく伝えたい話
※よくよく記事を読んだら、今回の質問で補足としてお伝えするには微妙な内容でしたので訂正線を引かせていただきます。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/03/11 16:30

    ご回答ありがとうございます。rubyも確か完全にオブジェクト指向の言語だったきがしますが、rubyもjavaと同じく、このようなことは出来ないのですかね。pythonはきっと出来ますよね。

    キャンセル

  • 2018/03/11 16:44

    今調べてきたら確かにPythonではできるようですね。ということはオブジェクト指向言語だからクラス外での宣言ができる、というのは間違っていますね。すみません、回答を修正しておきます。言語仕様だからです、と言ったらそれで終わってしまうのですが、なんででしょうね。静的型付けか動的型付けかが関係している気がします。

    キャンセル

  • 2018/03/11 16:45 編集

    pythonは完全なオブジェクト指向言語ではないと聞きます。rubyはそうらしいですが。pythonって関数を定義できますよね。rubyができるなら、もはや言語仕様で決着感が!

    キャンセル

  • 2018/03/11 16:46

    というか、こういう場合の検索の仕方がわからない。。。

    キャンセル

  • 2018/03/11 17:24

    to: 質問者さん

    オブジェクト指向かどうかとクラス定義の外に何かがかけるかどうかには直接的な関係はない気がします。

    rubyもpythonもオブジェクト指向機能を備えていますが、クラスの外に書いたものも結局はオブジェクトです。例えば関数を定義するのに「Functionインターフェースを継承したクラスを定義してそのインスタンスをnewする」なんてまどろっこしいことはしませんが、それでも関数がFunctionのインスタンスであることには変わりません(Functioinという名前はRubyやPythonの実在するクラス名ではなく説明上持ち出した名前です)。単に構文がどう規定されているかの違いだけと捉えた方が本質的ではないかと自分は思います。

    ちなみに「完全なオブジェクト指向」かどうかには人によって捉え方が違うかも知れません。自分はJavaは完全なオブジェクト指向言語には思えず、Pythonは完全なオブジェクト指向言語という捉え方をします。クラス定義が必須かどうかの違いではなく「全てがオブジェクトかどうか」が自分の分類基準だったりします。

    キャンセル

+2

結論としては無理ですというのが回答ですが。

ある言語の仕様について知りたい時は原典(言語仕様)当たるのが一番かと。

Java Language Specification 4.12.3. Kinds of Variables

■上記リンクの意訳

変数には8種類あります。

  1. クラス変数
  2. インスタンス変数
  3. 配列コンポーネント
  4. メソッドパラメータ
  5. コンストラクタパラメータ 
  6. ラムダパラメータ
  7. 例外パラメータ
  8. ローカル変数

各変数の種類についてはリンク先に詳しい解説があります。

質問文の以下のコードは上記8種類のどれにも属してません。

const word = 'blah blah blah';

よって、無理(定義不可能)となります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

不可能。

それってC言語でいうグローバル変数なので、無理です。

可能だとしてもバグがおきやすい。よって不可能だと思う。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/03/11 16:21

    ご回答ありがとうございます。不可能なのですね。なるほど。
    そして、グローバル変数扱いになってしまうのですね。
    ファイル単位での(モジュール単位での)ローカル変数扱いにもならず、他の別ファイルで定義されているクラス内部からさえも参照出来てしまうということでしょうか。

    キャンセル

  • 2018/03/11 16:51

    Javaは一ファイルにつき一クラスです。
    なので物理的に無理だと思います。
    万が一可能だとしても、
    そのファイルを認識できればどこからでも書き換えが可能になってしまうのでかなり危険だと思います。
    よって、Javaを作った人はグローバル変数は使えないようにしているはず。
    ( C言語で問題視されていたのに、わざわざ入れるってありえないし。 )

    キャンセル

  • 2018/03/11 16:52

    JavaScript, Pythonとかはエントリポイント ( mainメソッドに相当するもの ) がないので、グローバルっていう考え方が無いから使うことができるのだと思います。

    キャンセル

  • 2018/03/11 16:54

    > Javaは一ファイルにつき一クラスです。

    1ファイルにつき1クラスに限定されるわけじゃないですよ。習慣上そうするだけで。
    ただし、publicクラスは同名の.javaファイルに記述しなければいけませんが。

    ---
    > よって、Javaを作った人はグローバル変数は使えないようにしているはず。

    public staticにすれば、かなりグローバル変数に近い働きをさせることが出来ます。
    例えばSystem.outはpublic staticなフィールドで、自由にアクセスできます。

    キャンセル

  • 2018/03/11 17:05

    LouiS0616さん。ども。

    >> 1ファイルにつき1クラスに限定されるわけじゃないですよ。...

    書くときはそうでしょうけど、最終的には分離されますよね。
    複数のクラスをひとつのjavaファイルに記述してもコンパイルするときは複数のclassになっていますし。

    >> よって、Javaを作った人はグローバル変数は使えないようにしているはず。...

    あぁ! それがありましたね。static付なら単一だから。

    キャンセル

  • 2018/03/11 17:07

    > 最終的には分離されますよね。
    ああ、クラスファイルと言うことならおっしゃるとおりですね。失礼しました。

    キャンセル

同じタグがついた質問を見る

  • Java

    15842questions

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