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

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

詳細はこちら
Java

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

Q&A

解決済

1回答

566閲覧

Java 対象の一部を引用したい

gaju

総合スコア1

Java

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

0グッド

0クリップ

投稿2021/01/13 09:00

編集2021/01/13 10:56

前提・実現したいこと

Twitterの簡易的な疑似アプリを作成する途中で、リプライやリツイートをするときに元ツイートのユーザーIDを表示させたい

該当のソースコード

Java

1import java.text.SimpleDateFormat; 2import java.util.Calendar; 3 4public abstract class Base { 5 public int tweetId = 0; 6 public long datetime = 0; 7 public String userId = ""; 8 9 public Base(int tweetId,String userId) { 10 this.tweetId = tweetId; 11 this.userId = userId; 12 this.datetime = getNow(); 13 } 14 public static long getNow(){ 15 Calendar cl = Calendar.getInstance(); 16 SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddhhmmss"); 17 return Long.parseLong(sdf.format(cl.getTime())); 18 } 19 public int getTweetId() { 20 return tweetId; 21 } 22 public abstract String getText(); 23 24public class Tweet extends Base{ 25 public static String text; 26 public Tweet(int tweetId,String userId,String text) { 27 super(tweetId, userId); 28 this.text = text; 29 } 30 @Override 31 public String getText(){ 32 String tweet = text + " from @" + userId + "[" + datetime + "]"; 33 return tweet; 34 } 35} 36 37public class Reply extends Tweet{ 38 private String target = super.userId; 39 public Reply(int tweetId,String userId,String text, Tweet target) { 40 super(tweetId,userId,text); 41 } 42 @Override 43 public String getText() { 44 String reply = "@" + target + " " + super.getText(); 45 return reply; 46 } 47}

補足情報(FW/ツールのバージョンなど)

例えばMainで
Tweet t1 = new Tweet(0, "gaju" , "わからない");
を実行して
わからない from @gaju [20210113175300]
とツイートした時に、このツイートに対するリプライを
@gaju わかる from @someone [20210113175400]
とさせるようにしたいのですが、
Replyクラスのtargetがどうしてもリプライの送り主と同じになってしまい、
@someone わかる from @someone [20210112175400]
のようになってしまいます。
eclipseを使って開発をしています。
プログラミング自体が学びたてなので色々と拙くわかりづらい部分も多々あると思いますが、回答いただけると幸いです。

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

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

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

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

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

hoshi-takanori

2021/01/13 09:30

Reply クラスの target フィールドの型をTweet にすべきでは?
gaju

2021/01/13 10:24

返信していただきありがとうございます。 早速hoshi-takanori様の仰る通りtargetフィールドの型をString からTweetに変えてみましたが、=の後に型の不一致:StringからTweetに変換出来ませんというエラーが出てしまいます。 targetの対象がおかしいのでしょうか。
hoshi-takanori

2021/01/13 10:40

ごめんなさい、ソースよく見てませんでした。問題は static ですね。 私のコメントは忘れて momon-ga さんの回答をよくお読みください。
gaju

2021/01/13 10:51

分かりました。返信とアドバイスありがとうございました。 よろしければまたアドバイスを頂けると幸いです。
guest

回答1

0

ベストアンサー

現状、userIdがstaticのため、userIdは1つしか存在させることができません。

public static String userId = "";

例えばMainで

java

1Tweet t1 = new Tweet(0, "gaju" , "わからない"); 2Tweet t2 = new Tweet(1, "hoge" , "ほげ"); 3 4System.out.println(t1.getText());

とした場合t1のユーザIDで表示されるのは、gajuでなくhogeです。
※あとから作成したTweetのuserIdで上書きされる。Tweet.textも同様

上記でt1の内容を表示しようとしていますが、期待と異なる結果が表示されるはずです。

まずはインスタンス変数を利用するようにして
コンストラクタの処理も

this.userId = userId;

のように修正する必要があります。

あとは、

String reply = "@" + target + " " + super.getText();

も、たぶん勘違いされていると思います。が、まずはstaticを修正しないことには・・・

投稿2021/01/13 10:22

momon-ga

総合スコア4826

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

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

gaju

2021/01/13 10:48

回答して頂きありがとうございます。 最初はthis.で書いていたのですが、エラー修正の際に修正したままにしていたようです。ご指摘頂きありがとうございます。 仰っていただいた通りコンストラクタの処理を修正致しました。 Tweet自体は別userIdでも更新されないようにはなったのですが、Replyはまた同じuserIdが表示されています。 最後のString reply = ... の勘違いというのはどういったところでしょうか。
hoshi-takanori

2021/01/13 11:41

横から失礼します。 Base クラスのフィールドは static じゃなくなりましたが、Tweet クラスの text フィールドは static のままですね。これも修正しましょう。 また、Reply クラスの target フィールドは宣言と同時に target = super.userId; と初期化されてますが、この super.userId というのは Reply 自身の userId になってしまいます。Reply 先の Tweet の userId を取得する必要があるのでは?
gaju

2021/01/13 12:33

回答ありがとうございます。 Tweetクラスのstaticを修正し忘れておりました。ご指摘ありがとうございます。 Replyクラスのtargetフィールドを対象のTweetのuserIdとするためにいろいろと試してみたのですが、うまくいきません。 この場合Mainクラスで作ったt1のuserIdを呼び出せられればいいというのは分かったのですが、どうやって参照すればよいのでしょう… 質問ばかりで申し訳ないです。
hoshi-takanori

2021/01/13 12:49

たとえば t1 に対する Reply を生成する場合、 Tweet t1 = new Tweet(0, "gaju" , "わからない"); Reply t2 = new Reply(1, "hoge" , "ほげ", t1); という感じになると思いますが、Reply のコンストラクタには t1 が渡ってきてるので、その情報を利用すればいいと思います。
gaju

2021/01/13 13:05

返信ありがとうございます。 フィールドを private String target; Replyコンストラクタを public Reply(int tweetId,String userId,String text, Tweet target) { super(tweetId,userId,text); this.target = target.userId; } とすることで解決いたしました。 稚拙な質問ばかりで煩わしかったかもしれませんが解決までアドバイス頂き本当にありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問