🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Java

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

Q&A

解決済

2回答

637閲覧

(初歩的な質問)Javaのクラスがなぜ作成できるのかわからないです。

TeraNayu

総合スコア2

Java

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

0グッド

0クリップ

投稿2020/12/14 01:06

現在JavaのBronzeに向けて勉強を行っているのですが納得できないことがあります。

イメージ説明

この問題において、クラスBを作成する宣言はクラスBの中で行われていると思います。

普通は
「クラスBを作ります→クラスBを実行します」
という流れになると思うのですが、このプログラムだと
「クラスBを実行します→クラスBを作成します」
になっていると思います。

変数などはあらかじめ宣言しておかないと使えないのに、このクラスはとりあえず実行させたら中からクラスBを作る記述ができたから結果的につじつまが合いました。という風に感じています。

初心者向きの参考書を読んでみても、基本Mainが別にありこんな風な記述をしているのを見つけることができず、この描き方の仕組みが理解できない状況です。

浅学で恐縮ですが、この仕組みについて初心者でも理解できるようにご教示いただければ幸いです。

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

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

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

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

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

m.ts10806

2020/12/14 01:13

>(初歩的な質問) 誰の観点でしょうか。「自身」なら「わかってるならなぜ質問した?」ですし、「見ている人」なら「不要」です。 「自身が初心者である」ことを伝えたいのでしたら質問に「初心者アイコン」をつけるだけで十分です。
m.ts10806

2020/12/14 01:14

むしろ「new」という絶対的なキーワードがあるのですから何も調べようがないとは思えません。
TeraNayu

2020/12/14 01:24

なぜそんなに攻撃的な口調なのかはわかりかねますが、Bronzeの内容なのでプロの方からしたら初歩的な内容であると考えました。 もっともここについては本質的な話ではないのでこれ以降割愛させていただきます。 >>「new」という絶対的なキーワードがあるのですから何も調べようがないとは思えません。 これについては >>初心者向きの参考書を読んでみても、基本Mainが別にありこんな風な記述をしているのを見つけることができず、この描き方の仕組みが理解できない状況です。 と記載しております。 よろしくお願いします。
m.ts10806

2020/12/14 01:41

これで攻撃的と言われても困ります。「質問するときのヒント」は読みましょう。
m.ts10806

2020/12/14 01:42

書いてないことは伝わらないので、「参考書」などと濁さず書籍名を書くべきですしね。 間違ったことが書いてあったなら理解できないのは当たり前ですし、出版社や著者へ指摘しなければなりません(嘘でお金とってるわけですから)
TeraNayu

2020/12/14 01:52

ご自身で自覚がないようでしたら、攻撃的な口調になっているということをご自覚いただければ幸いです。 また、質問するときのヒントは読んだうえで質問しています。 そもそも、この追記修正依頼は必要だったのでしょうか。 最初の加筆修正依頼については結局何をしてほしいのか不明ですし、そのあとの「new」についても要件としては「だからこんな質問するな」という風に受け取りました。 それであれば削除依頼を出すか、こういう風に調べたらわかりますと回答していただくのがこのシステム上適切なのではないかと思われます。 少なくとも、あなたの加筆修正依頼は「何を」「どう」加筆修正してほしいのかが不明瞭です。 なお、解決したためこれ以降何を返信いただいてもこちらからの返答は控えます。 ご不快であれば削除依頼をお願いいたします。
m.ts10806

2020/12/14 01:58

私はあなたという人を知らないので、どういうつもりで書いたのか分からないので確認しています。 どこまで調べたのか何を知っているのか それがわかればできるアドバイスもあるのですが、ないので、追記してもらえれば良いのですけど。 調べたことが何も書いてなければ、既に調べたことが回答として提示されても文句は言えませんし、「それはもう読んだ、確認した」と後出しされたらいい気はしませんよね? そのあたりの配慮は質問者には必要です。 質問内容から、「質問するときのヒント」を読んだ感がないので指摘しました。 読んだのならそれらあえて無視して自分がやりたいように書いたと理解します。
quickquip

2020/12/14 02:14 編集

一番初めのコメントはいたって普通の指摘だと思います。どこを"攻撃的"だと思ったのか……
guest

回答2

0

クラスとインスタンスの違いに着目すると分かると思います。

new はクラスを基にインスタンスを作成します。
new で作成するのはインスタンスであってクラスではないです。

「クラスBを作ります→クラスBを実行します」

ではなく、「インスタンスBを作ります→インスタンスBを実行します」となります。

パソコンのメモリに着目すると new でクラスを基にインスタンスを生成してメモリ上に配置する、となります。
クラスはクラスでインスタンスとは別にメモリ上に存在します。
メモリ上に読み込まれるタイミングは初めて使用される時です。
例えば new B() と書かれた箇所がプログラムの実行上初めて出てきたら、
まずはメモリ上にクラスBを読み込んで、それからクラスBを基にインスタンスを作ります。
クラス をメモリ上に読み込むタイミングは new とは異なりソースコード上に明示されておらず、
JVMが勝手に判断して自動的に行うので、JVMのクラスの扱いを知らないと分からないと思います。

static についてですが、メンバ変数や関数(メソッド)に static を付けると、
インスタンスではなくクラスを使用します。
main 関数が new せずとも使用できるのはインスタンスの関数ではなく、
クラスの関数を使用しているからです。
もしクラスBを、main 関数を呼び出す前まで使用していないのであれば、
main 関数を呼び出す時点で、まずはJVMが自動的にクラスBをメモリ上に読み込み、
それから main 関数を実行します。

投稿2020/12/14 01:36

編集2020/12/14 01:41
QZX

総合スコア44

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

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

TeraNayu

2020/12/14 01:55

なるほど。 当方がクラスやインスタンスをごっちゃになって考えていた上に、仕様を正確に理解できていなかったのが混乱の原因ですね。 丁寧にご説明いただきありがとうございました。 とても助かりました!
guest

0

ベストアンサー

main関数には、staticがついてます
staticが付いてる関数、変数は、そのクラスを生成しなくても直接使えるようになってます。

ということで、main関数を実行する時点ではBクラスのインスタンスは生成されてません

投稿2020/12/14 01:10

y_waiwai

総合スコア88038

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

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

TeraNayu

2020/12/14 01:30

ご回答ありがとうございます。 大変わかりやすくイメージしやすかったです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問