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

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

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

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

Q&A

解決済

2回答

4920閲覧

Java newを使うときと使わない時の違いを知りたいです。

Daikichi_ttt

総合スコア4

Java

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

0グッド

1クリップ

投稿2021/06/02 07:28

Java を始めたばかりで、以下の2文の用途の違いについて理解できません。

new を使うときの意味と使わない時の意味の違いについて悩んでいます。

Java

1int a=Keisan.tasi(1,2);

Java

1int a=new Keisan.tasi(1,2);

上のコードは、Keisanクラスのtasiメソッドに引数1と2を渡して、処理結果をint型の変数aに代入すると解釈しています。
下のコードは、newを使っているので、Keisanクラスのインスタンスを新たに生成して、インスタンスの初期値としてtasiメソッドの処理結果をint型の変数aに代入すると解釈しています。

newを使ってインスタンスを生成するかどうかの違いは判るのですが、それぞれどんな場面で使い分けるのか分かりません。

どなたかご教示いただけると幸いです。

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

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

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

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

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

m.ts10806

2021/06/02 07:30

調べても何も出ないのでしょうか。 始めて間もないのでしたらなおさら調べまくる時期かと思いますが、そのあたりが分かりません。 あと、クラスの実装次第ではないでしょうか。
ozwk

2021/06/02 07:35 編集

下のコードはコンパイル通らない気がします。 int a = new Keisan().tasi(1, 2); ではありませんか?
maisumakun

2021/06/02 07:47 編集

> 下のコードはコンパイル通らない気がします。 (誤解があったので消去)
ozwk

2021/06/02 07:46 編集

Keisan.tasiクラスの可能性は考えましたが、そうなると、それで生成したインスタンスをint型のaに代入していることになります。
maisumakun

2021/06/02 07:46

言われてみれば、intに代入はできないですね。
guest

回答2

0

newを使ってインスタンスを生成するかどうかの違いは判るのですが、それぞれどんな場面で使い分けるのか分かりません。

Keisantasiが何であるかによって、書けるコードが決まってきますので、「使い分ける」という事は起きません。


後者の構文は、「static内部クラス」という高度なことをしないと出てきませんので、おそらく入門直後に書く機会はありません。

  • 前者…Keisan.tasiは(Keisanがクラスなら)Keisanstatic tasiメソッドを呼ぶ
  • 後者…Keisan.tasiクラスで、それをnewする

投稿2021/06/02 07:42

maisumakun

総合スコア145313

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

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

Daikichi_ttt

2021/06/02 08:23

回答ありがとうございます。 クラスやメソッドについてももう少し、学習してこの構文を理解したいと思います!
guest

0

ベストアンサー

Keisanクラスがどのように実装されているか分からないため想像にはなってしまうのですが、
Keisanクラスのtasiメソッドがstaticなメソッドかどうかで、メソッドの使い方が違ってきます。

(追記)質問者の方が例示された2つ目のコードint a=new Keisan.tasi(1,2);は、恐らくint a=new Keisan().tasi(1,2);の誤記であろうと想定して解説しております。
この方が初心者であることを考えると、「static内部クラス」に出会っているとは考えづらかったので、、

  • staticなメソッドのとき(メソッドを定義している部分が「(アクセス修飾子) static~」のように始まっている)

Keisan.tasi(1,2)のように、(クラス名).(メソッド名)というように使います

  • staticなメソッドでないとき(メソッドを定義している部分で、アクセス修飾子の後にstaticの文字が含まれていない)

(インスタンス名).(メソッド名)というように使います。
上の例で言うと、「new Tasi()」の部分がインスタンス名に当たります。

(追記2)コメントいただいた内容を受けまして、回答内容を一部修正いたしました。

投稿2021/06/02 07:41

編集2021/06/02 08:27
hallen0225

総合スコア587

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

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

m.ts10806

2021/06/02 07:44

個人的には「アクセス修飾子」は出して構わないと思います。 static「メソッド」としてしまうと誤解も与えかねない気もします。
hallen0225

2021/06/02 07:51 編集

>> m.ts10806様 不勉強で申し訳ないのですが、「staticメソッド」という呼び名がどのような誤解を与えうるでしょうか?(staticメソッド=static修飾子を付けて宣言したメソッド、という意味で使用される用語と認識しておりました。)
m.ts10806

2021/06/02 07:53

メソッドと表記してしまうことの誤解ですかね。 正しくはstaticがアクセス修飾子として付与されたtasiメソッド ですし、どちらかというとメソッドの属性的な扱いになると思います(通じないわけではないと思うのですが、初心者だとそのまま鵜呑みにする恐れはあります。)
hallen0225

2021/06/02 08:01

「tasiメソッドがstaticメソッドかどうか」という表記でなく、「tasiメソッドにstatic修飾子が付いているかどうか」が正解であるということで認識相違ないでしょうか? (私にはその違いが理解できないのですが、、)
K_3578

2021/06/02 08:01

>staticメソッド 私はstaticなメソッドって言うかなぁ・・・
m.ts10806

2021/06/02 08:05

そうですね。文章的な問題でもありますが、1文字省略するだけでも意味が変わってきますし、「アクセス修飾子」って今回はかなり重要なキーワードなので、むしろこれを機に覚えてもらうということで。
hallen0225

2021/06/02 08:13 編集

確かに、Javaの学習において「アクセス修飾子」が避けて通れないのは間違いありませんね。 staticメソッドという表記についても「staticなメソッド」の方が「staticという属性を持つメソッド」という意味が明らかだと感じるので、今後は「staticなメソッド」と呼ぼうと思います。コメントいただきありがとうございました。 (追記:今更気づいたのですが、「staticメソッド」だと、staticという名前のメソッドと誤解される可能性があるわけですね。。そういう用語だと思い込んでいたため盲点でした。)
m.ts10806

2021/06/02 08:13

回答の調整についてはおまかせします。
K_3578

2021/06/02 08:16

(「staticなメソッド」も大概にわかりにくいのでなんか上手い名前ないですかね・・・。)
m.ts10806

2021/06/02 08:24 編集

個人的な話ですが、私が若手指導するときはそのまま 「static修飾子が付与されたメソッド」と呼んでいます。無駄な解釈をさせないためですね。 「この子が指導する立場になったらどう教えてほしいか」という視点で考えてます。 会話の流れだと「staticとして定義されたメソッド」になりますかね。
dodox86

2021/06/02 08:26

用語については私も常に気になる方ですので、コメントさせていただきます。 "staticメソッド"についてどう呼ぶか(呼称として一体何が正しいか)はなかなか悩ましいようです。例としてJava SE8の言語リファレンスのひとつを覗いてみると、 https://docs.oracle.com/javase/specs/jls/se8/jls8.pdf 「8.4.3.2 static Methods」のところで、 > A method that is declared static is called a class method. 意訳で、「staticで宣言されたメソッドはクラスメソッドと呼ばれる」とあります。ですが、「staticで修飾されたメソッドをstatic method(s)」と総称しているような記述もありますし、難しいですね。文脈で使い分けるべきか。日本語訳などもあたってみるとまた参考になるかもしれませんね。
Daikichi_ttt

2021/06/02 08:28

ご回答・コメントありがとうございます。 メソッドの定義にstaticを付けると、クラス名.メソッド名と表記できるのですね。 アクセス修飾子についてはあまり意識してなかったので、修飾子によってどのように記述が変わってくるのか、もっと勉強して上の構文を理解しようと思います。 ご協力ありがとうございました!
hallen0225

2021/06/02 08:33

Daikichi_tttさん ちなみに、アクセス修飾子については、そのメソッドがどこから参照できるかを決めているものなので、メソッドを呼び出すときの記述に変化はないものです。 static修飾子についても、「どのようなときに付けるか」が大変重要になりますので、そういったところも考えて実装できるように、これからも理解を深めていかれてください。
K_3578

2021/06/04 03:13 編集

@dodox86さん 情報提供ありがとうございます。もうちょっと私も調べてみます。 これ以上ここで続けても迷惑になりそうなのでどっかでstatic修飾子に関しては まとめてみようかなぁ・・・。
m.ts10806

2021/06/02 09:19

私も参考になりました。
Zuishin

2021/06/02 09:47

static はアクセス修飾子じゃないんじゃないでしょうか。 メソッド修飾子として挙げられているのはみつかりましたが、アクセス修飾子として挙げられているのはみつかりませんでした。 また、以下を見ると public, protected, and private がアクセス修飾子であるように読めます。 https://docs.oracle.com/javase/specs/jls/se15/html/jls-8.html#jls-8.4.3 > It is a compile-time error if the same keyword appears more than once as a modifier for a method declaration, or if a method declaration has more than one of the access modifiers public, protected, and private (§6.6). ちなみに以下は C# のアクセス修飾子です。 https://docs.microsoft.com/ja-jp/dotnet/csharp/programming-guide/classes-and-structs/access-modifiers
m.ts10806

2021/06/02 09:51 編集

言われてみれば確かに、アクセス修飾子と表現するとまずいかもしれません。 私自身も混同してたかもしれません。認識改めます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.44%

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

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

質問する

関連した質問