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

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

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

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

String

Stringは、ゼロ以上の文字から連続してできた文字の集合を扱うデータ型です。基本的にテキストを表すために使われます。

コンストラクタ

オブジェクト指向言語において、オブジェクトを生成時に呼び出され、データの初期化などを行なう関数・メソッドのことである。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

1回答

691閲覧

Java Stringクラスのコンストラクタについて

yama777

総合スコア2

Java

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

String

Stringは、ゼロ以上の文字から連続してできた文字の集合を扱うデータ型です。基本的にテキストを表すために使われます。

コンストラクタ

オブジェクト指向言語において、オブジェクトを生成時に呼び出され、データの初期化などを行なう関数・メソッドのことである。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

0クリップ

投稿2022/02/28 21:34

JavaのAPIの理解を深めるためにSrtingクラスの中身を読んでいます。
その中にString型を引数に持つコンストラクタがあります。

public String(String original) { this.value = original.value; this.hash = original.hash; }

このコンストラクタの引数はConstant Poolのオブジェクトという認識で良いのでしょうか。
もし、このStringクラスだった場合、newした際に再帰的な呼び出しになり無限ループになるのではと思いました。

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

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

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

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

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

yama777

2022/02/28 22:15

すいません、少し聞きたいことが間違っていたかもしれません。 上記で記載しているコンストラクタを使用してStringオブジェクトを生成したとします。 new String("aaa"); この場合、文字列「"aaa"」の生成元はどこか ということが聞きたかったです。
Zuishin

2022/02/28 23:19 編集

new String("aaa") は、リテラル "aaa" から生成された String を引数にしているだけです。 リテラル "aaa" の生成元は new String("aaa") ではないので、再帰的に呼び出しはされません。 リテラルから String への変換はコンパイラの仕事なので気にしなくていいと思いますが、コンパイラは人間に読めるリテラルを、内部表現である char 配列やバイト列に直しているはずです。
yama777

2022/03/01 03:16

ご回答ありがとうございます。 教えて頂いた内容を他のユーザーの回答と一緒に整理して回答欄にコメントしています。 間違いなどあればご指摘いただけると有り難いです!
guest

回答1

0

newした際に再帰的な呼び出しになり無限ループになるのでは

なりません。

投稿2022/02/28 21:48

maisumakun

総合スコア145183

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

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

maisumakun

2022/02/28 21:48

どうして「再帰的な呼出になる」と考えたのでしょうか?
maisumakun

2022/02/28 21:55

> このコンストラクタの引数はConstant Poolのオブジェクトという認識で良いのでしょうか。 特にそれに限られたものではなく、すでに存在するStringオブジェクト全般を受け入れます。
yama777

2022/02/28 22:03

申し訳ございません。「再帰的な呼出になる」というのは 実動作が無限ループになるという意味ではなく、 現在の私が理解している範囲でのJavaの言語仕様に則って コードを読んだときに、こうなるのではという話になります。 再帰的になると考えた理由は、引数に使用されているString型は 自身のStringクラスになるのでは?と考えたためです new String("aaa"); →new String(new String("aaa")); →new String(new String(new String("aaa"))); →… しかし、普通に使えばわかるようにそうはならないので、 この引数に使われているString型はコンストラクタのStringクラス とは違うもの→とすればJVMが生成したオブジェクトなのかな? と考えています。
maisumakun

2022/02/28 22:55 編集

> 引数に使用されているString型は 自身のStringクラスになるのでは? そのとおりですが、Stringには他のコンストラクタもありますので、何ら問題ありません。 (自作のクラスでも、そのクラスのインスタンス自身を受け取るコンストラクタ「も」あってかまいません)
yama777

2022/03/01 03:04

> Stringには他のコンストラクタもありますので、何ら問題ありません。 Zuishinさんのご回答と合わせて整理すると、コンパイラが使用するコンストラクタは String型ではないので無限ループにはならないということでよいでしょうか。 それぞれの生成の流れをまとめてみました。 何か認識違うところあれば教えていただけると幸いです。  ・文字列リテラル(Constant Poolに配置されている文字列オブジェクト)    → コンパイラがchar配列型やバイト配列型のコンストラクタでStringオブジェクトを生成    → 生成したオブジェクトをHeap領域に配置  ・Stringオブジェクト(Heap領域に配置された文字列オブジェクト)    → Heap領域内にあるStringオブジェクトを使い、String型のコンストラクタでオブジェクトを生成    → 生成したオブジェクトをHeap領域に配置
yama777

2022/03/01 03:12

すいません、文字列リテラルのところは「→ 生成したオブジェクトをHeap領域に配置」 という記載はいらなかったかもしれません。
maisumakun

2022/03/01 03:20 編集

> 文字列リテラル これがどのような方法でコンストラクトされているかなんてことは、Java処理系を作るのでもない限り「考えなくていい」ことではないかと考えます。Javaコードで操作・介入できる世界ではありません(特に、Stringはバイトコードに作り付けられているぐらいに特殊な型です)。
yama777

2022/03/01 03:32

ありがとうございます。 私自身まだJavaの経験が浅いので、今はとりあえず見えている部分の理解に努めようと思います。 ここらへんの知識は実務で使いそうなったら、専門書などで詳しく勉強してみようと思います。 ご回答ありがとうございました!
yama777

2022/03/01 03:35

貼っていただいたリンクも参考にして勉強させていただきます!
maisumakun

2022/03/01 03:39

> 実務で使いそうなったら Javaのコンパイラ、VMなどのツールそのものに手を入れるでもしない限り、縁のない世界です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問