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

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

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

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

Q&A

3回答

567閲覧

intやfloatやboolean型はなんでnewしなくても使えるのですか?

foxhoge

総合スコア15

Java

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

0グッド

0クリップ

投稿2019/05/06 05:16

編集2019/05/06 05:17

本で読んだのですが、Stringクラスは特例としてインスタンスを生成しなくても使えると書いてあります。
intやfloatやboolean型もnewしなくても使えますよね?
なぜ使えるのですか?

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

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

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

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

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

LouiS0616

2019/05/06 05:19 編集

『Stringクラスは特例としてインスタンスを生成しなくても使える』と確かに書いてあるのでしょうか。 本のタイトルを追記し、当該文章をそのまま引用して下さい。
m.ts10806

2019/05/06 05:27

あと自身で検証したコードも
退会済みユーザー

退会済みユーザー

2019/05/06 10:34

なぜ使えるか?  結論だけをいうと「そういう言語仕様だから」 という回答しかできない気がするが
quickquip

2019/05/06 11:06

文章を読み間違えている可能性の方が高いと思うので正確な引用が欲しいですね。
otn

2019/05/06 11:36

「newしなくても使える」とは具体的にどういうコードのことを言っていますか? 逆の「newしないと使えない」というのがあるなら、それは具体的にどういうコードのことを言っていますか?
guest

回答3

0

プリミティブ型だからです。(Stringは参照型)

Stringクラスは特例としてインスタンスを生成しなくても使えると書いてあります。

「インスタンスを生成しなくても」ではなく、「newしなくても」の間違いでしょうか?
Stringは使用頻度が高いため、newを使わないインスタンス生成方法が定められているだけです。

投稿2019/05/06 05:18

編集2019/05/10 18:20
swordone

総合スコア20651

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

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

xebme

2019/05/06 06:19

String リテラルをなぜ new しなくても使えるのか?は説明しなくてもいいですか? プリミティブ型だからは、説明になっていますか?
退会済みユーザー

退会済みユーザー

2019/05/09 02:20

その説明だと以下はできないことになる Integer a = 1; Long b = 2L; Float c = 3F; Double d = 4D; etc...
swordone

2019/05/09 02:27

「intやfloatやboolean型がnewせず使えるのはなぜなのか」という問いに対して「プリミティブ型であるから」という回答は間違ってないですよね? つまり「プリミティブ型である」⇒「newせず使える」と言ってるだけで、「newせず使える」⇒「プリミティブ型である」とは言っていない
guest

0

Java の型は二種類あることはご存じですね。

  • プリミティヴ型 (boolean, byte, char, short, int, long, float, double)

プリミティヴ型変数には、算術演算する「値」を直接格納する。

  • 参照型 (配列、String、その他のクラス)

参照型変数には「参照(算術演算できないある整数)」を格納する。参照は、別の場所(ヒープ)にあるインスタンスを指す。

プリミティヴ型は「インスタンス化」しない(できない)が、参照型は「インスタンス化」(new) しなければ本体が作られない。インスタンス化しなければ null である。

参考資料をご覧になってください。参照型とプリミティブ型

本で読んだのですが、Stringクラスは特例としてインスタンスを生成しなくても使えると書いてあります。

String リテラルは、new しなくても、あらかじめインスタンスが作られていて、リテラルを使用した時にヒープに登録され、一元管理されます。

投稿2019/05/10 17:59

xebme

総合スコア1081

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

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

0

swordoneさんの回答の補足として・・・

Stringクラスは特例としてインスタンスを生成しなくても使えると書いてあります。

その本は、間違ったことが書いてあるようですね。。。(質問者さんの言う通りなら)

javadocにもきちんと

Stringクラスは文字列を表します。Javaプログラム内の"abc"などのリテラル文字列はすべて、このクラスのインスタンスとして実行されます。

インスタンスとして実行されると書いてあります。
newをしなくても使えるなら、まぁStringに限らずインスタンスを生成するのにnewを使わなくてもできます。

ちなみに文字列リテラルは

String#internにあるとおりです。

すべてのリテラル文字列および文字列値定数式が保持されます。文字列リテラルは、『Java(tm)言語仕様』のセクション3.10.5で定義されています。

よく文字列はequalsで比較しないといけませんとありますが、
※これ自体は、その通りなので以下を見ても==で比較してはダメです

実際に==で比較してもtrueになります。
Stringをnewしてはいけない理由は同じ文字列を違う領域に作成する=メモリの無駄使い
というのもわかると思います。

java

1String abc = "abc"; 2String abc2 = "abc"; 3String abcNew = new String("abc"); 4String abcIntern = new String("abc").intern(); 5String abcIntern2 = "a" + "b" + "c"; 6 7System.out.println(abc == abcNew); // false 8System.out.println(abc == abcIntern); // true 9System.out.println(abc == abcIntern2); // true 10System.out.println(abc == abc2); // true

投稿2019/05/09 01:41

momon-ga

総合スコア4820

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

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

momon-ga

2019/05/09 01:59

ようは「そういう言語仕様だから」なんですけどね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問