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

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

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

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

Q&A

解決済

4回答

2801閲覧

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

退会済みユーザー

退会済みユーザー

総合スコア0

Java

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

1グッド

0クリップ

投稿2018/03/11 07:12

以下は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()
yukapome789👍を押しています

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

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

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

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

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

guest

回答4

0

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

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

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

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

ここからは余談です。

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

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

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

投稿2018/03/11 15:49

iwamoto_takaaki

総合スコア2883

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

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

0

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

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

Java Language Specification 4.12.3. Kinds of Variables

■上記リンクの意訳

変数には8種類あります。
0. クラス変数
0. インスタンス変数
0. 配列コンポーネント
0. メソッドパラメータ
0. コンストラクタパラメータ
0. ラムダパラメータ
0. 例外パラメータ
0. ローカル変数

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

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

JavaScript

1const word = 'blah blah blah';

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

投稿2018/03/11 10:02

umyu

総合スコア5846

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

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

0

ベストアンサー

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

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

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

投稿2018/03/11 07:23

編集2018/03/11 07:47
yukapome789

総合スコア361

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

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

退会済みユーザー

退会済みユーザー

2018/03/11 07:30

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

2018/03/11 07:44

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

退会済みユーザー

2018/03/11 07:45 編集

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

退会済みユーザー

2018/03/11 07:46

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

2018/03/11 08:24

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

0

不可能。

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

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

投稿2018/03/11 07:19

BeatStar

総合スコア4958

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

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

退会済みユーザー

退会済みユーザー

2018/03/11 07:21

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

2018/03/11 07:51

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

2018/03/11 07:52

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

2018/03/11 07:54

> Javaは一ファイルにつき一クラスです。 1ファイルにつき1クラスに限定されるわけじゃないですよ。習慣上そうするだけで。 ただし、publicクラスは同名の.javaファイルに記述しなければいけませんが。 --- > よって、Javaを作った人はグローバル変数は使えないようにしているはず。 public staticにすれば、かなりグローバル変数に近い働きをさせることが出来ます。 例えばSystem.outはpublic staticなフィールドで、自由にアクセスできます。
BeatStar

2018/03/11 08:05

LouiS0616さん。ども。 >> 1ファイルにつき1クラスに限定されるわけじゃないですよ。... 書くときはそうでしょうけど、最終的には分離されますよね。 複数のクラスをひとつのjavaファイルに記述してもコンパイルするときは複数のclassになっていますし。 >> よって、Javaを作った人はグローバル変数は使えないようにしているはず。... あぁ! それがありましたね。static付なら単一だから。
LouiS0616

2018/03/11 08:07

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問