Java オブジェクトのコピーについて

このQ&Aのポイント
  • Javaのオブジェクトのコピーについてわからない部分があります。具体的には、変数のメモリ上のアドレスを別のオブジェクトにコピーしたい場合の方法について教えてください。
  • 現在のコードでは、変数のメモリ上のアドレスが格納されているだけで、値の変更が他のオブジェクトにも影響を与えてしまいます。どのようにして別のアドレスでコピーすることができるのでしょうか。
  • Javaのオブジェクトのコピーについて詳しく教えてください。
回答を見る
  • ベストアンサー

Java オブジェクトのコピーについて

Java オブジェクトのコピーについて 現在、Javaの勉強を行っているのですが、 オブジェクトのコピーについてどうしてもわからない部分があります。 以下についてご教授お願いいたします。 ----------------------------- (型定義) public class TypeAB{   List<String[]> ab = new ArrayList<String[]>;   public List<String[]> getAb(){     return ab;   }   public setAb(List<String[]> ab){     this.ab = ab;   } } ------------------------------ public class mst{   private void function(){     TypeAB hoge1 = new TypeAB();     TypeAB hoge2 = new TypeAB();     List<String[]> ab = new ArrayList<String[]>;     String[] a = {"1","2","3"};     String[] b = {"4","5","6"};     ab.add(a);     ab.add(b);     hoge1.setAb(ab);     hoge2.setAb(ab);   } } ------------------------------ 上記処理についてなのですが、 現在のままでは、最終的な[hoge][hoge1]には 変数[a][b]のメモリ上のアドレスが格納されているだけで、 hoge1.ab.get(0).a = {"4","5","6"}とした場合に、 hoge2の変数[a]の値まで変わってしまいます。 これをどうにかして最終的な、 hoge1.setAb(ab); hoge2.setAb(ab); の部分で別アドレスでコピーしたいのです。 言語:Java フレームワーク:SAStrutsです。 よろしくお願いいたします。

  • Java
  • 回答数2
  • ありがとう数12

質問者が選んだベストアンサー

  • ベストアンサー
  • salsberry
  • ベストアンサー率69% (495/711)
回答No.2

文法的におかしいところが多くて、何をしたいのかが読み取りにくいです。 > hoge1.ab.get(0).a = {"4","5","6"}とした場合に、 hoge1.ab.get(0)の返り値型はString[]なので、そこに.aをつけることはできません。 .aがないとしても、hoge1.ab.get(0) = {"4","5","6"};という書き方は許されていません。 hoge1.ab.get(0)[2] = "XYZ";だったら可能ですが。 この辺がはっきりしないと、ArrayListの複製を作ればいいだけなのかArrayListの要素のString[]も複製しなければいけないのかが曖昧です。 ANo.1さんのthis.ab.addAll(ab)は、複数回setAb()が呼ばれた場合の挙動が心配です。 > List<String[]> ab = new ArrayList<String[]>; これもセミコロンの前の()が不足しています。 あと、setAB()の返り値型の指定も抜けています。

kyanki
質問者

お礼

数々のご指摘ありがとうございます。 目的としては、最終的に[hoge1][hoge2]に[ab]をセットする際に、 変数[a][b]を別のアドレスで登録したかったのですが・・・ 私の説明力の無さと、処理が間違いだらけなので、 今回は一旦閉めさせていただきます。 もう少し煮詰めてから再度投稿したいと思います。 その際にはまたよろしくお願いいたします。 回答ありがとうございました。

その他の回答 (1)

  • sacra04
  • ベストアンサー率33% (1/3)
回答No.1

TypeABクラスのsetABメソッド内部の処理を、 this.ab.addAll(ab) でうまく動作するかな…?携帯からなので、動作確認ができないですが。。。 getter/setterがあるので、TypeABクラスの変数abはprivate変数にした方がいいですよ。

kyanki
質問者

お礼

申し訳ありません。 目的が明確でない上に、処理が間違いだらけでした。 もう少し煮詰めてから投稿いたします。 回答ありがとうございました。

関連するQ&A

  • Generic.Listに1次元配列の配列を格納したい(VB2005)

    VB2005の質問です。 変数ghogeにString型の1次元配列の配列を格納したいと考えています。 ----------------------------------------------- 'a) Dim hoge()() As string = _       {New string() {"a1", "b1", "c1"}, _       New string() {"a2", "b2", "c2"}, _       New string() {"a3", "b3", "c3"}} Dim ghoge As New Generic.List(of )   'b) MessageBox.Show(ghoge(1)(1))      ' "b2"と表示したい ----------------------------------------------- 質問内容は、(a)を(b)の初期値として設定するにはどのようにすればよいか、ということです。 (b)がGeneric.ListでなくArrayListの場合だと、   Dim ghoge As New ArrayList(hoge) でhoge配列を格納できますが、Generic.Listの場合はどのような構文にすればよいでしょうか。 現在は、下記のような処理でghogeに値を格納しています。 ------------------------------------------------------------ Dim ghoge As New Generic.List(Of Generic.List(Of String)) Dim aryhoge1 As New Generic.List(Of String)(New String() {"a1", "b1", "c1"}) Dim aryhoge2 As New Generic.List(Of String)(New String() {"a2", "b2", "c2"}) gary_hoge.Add(ary_hoge1) gary_hoge.Add(ary_hoge2) MessageBox.Show(gary_hoge(1)(1))    ' "b2"と表示される ------------------------------------------------------------ どうぞよろしくお願い致します。

  • javaでリストにオブジェクトを入れたい

    ユーザー情報を配列にしたものをセッターを使い、オブジェクトをリストに入れる処理をしたいです。 例(yamada,pas1,山田) リストを使用しているのは後々他のユーザーを追加する予定の為です。 例(yamada,pas1,山田) (suzuki,pas2,鈴木) リストにlist.add("yamada")などと入力すれば表示させることが出来るのですが、 オブジェクトを入れるとうまくいきません。list.add(オブジェクト名); 実行するとコンソールに「GetUser@19e0bfd」のようなものが出てきます。どうすればよろしいでしょうか? ここから上は省略。カプセル化したゲッターセッターの処理をしています。 public static void main(String[] args){   GetUser gu = new GetUser();//ユーザー情報をnew      String name[]=new String[3];   name[0]="yamada";   name[1]="pas1";   name[2]="山田";   gu.setId(name[0]);   gu.setPass(name[1]);   gu.setName(name[2]);   List list = new ArrayList();   list.add(gu); }

    • ベストアンサー
    • Java
  • Java コレクション・ジェネリクスについて

    Javaのコレクション・ジェネリクスについてです。 以下のコードについて、私はa.y();でAインタフェイスにyメソッドがないため コンパイルエラーになるのではないかと思っているのですが(実際にエラーが出ている) 書籍では「実行されるがなにも表示されない」とあります。 もし私の考え方に間違いがあればご指摘いただけると幸いです。 ocj-pを受験目前なので切実です。 よろしくお願いいたします。 interface A { void x(); } class B implements A { public void x(){} public void y(){} } class C extends B public void x(){} } public class D { public static void main(String[] args) { List<A> list = new ArrayList<A>(); list.add(new B()); list.add(new C()); for(A a : list) { a.x(); a.y(); } } }

    • ベストアンサー
    • Java
  • ArrayListのcloneメソッド

    お世話になります。 ArrayListのcloneメソッドなんですが、API上は「ArrayList のインスタンスのシャローコピーを返します。要素自体はコピーされません。 」と記載がありますが、 「ディープコピー」をしているような感じがして、なぜ「シャローコピー」と言っているのか、教えて欲しいです。 しかも、要素自体もコピーされているような…。 自分の理解では、 シャローコピー:コピー元、コピー先で同じオブジェクトを参照する ディープコピー:コピー元、コピー先で違うオブジェクトを参照する 試したソースは以下です。 --------------- import java.util.ArrayList; public class Test { public static void main(String[] args) { ArrayList<String> array = new ArrayList<String>(); array.add("a"); array.add("b"); ArrayList<String> array2 = (ArrayList<String>) array.clone(); array2.add("c"); System.out.println("array:" + array); System.out.println("array2:" + array2); } } --------------- cloneメソッドはシャローコピーなので、array2で「c」がaddされたら、arrayも「c」が追加されて、 array:[a, b, c] array2:[a, b, c] となるはずが、 array:[a, b] array2:[a, b, c] となります。 array、array2は別々のオブジェクトを参照しているような気がします。 恐らく大きな勘違いをしているのかもしれませんが、 調べてもいまいち理解できませんでした。 お手数おかけしますが、よろしくお願い致します。

    • ベストアンサー
    • Java
  • Javaのプログラムについて教えてください!

    Genericsを使ってエラーの出ないようにするにはどうすればいいですか? import java.util.*; public class Sample{ public static void main(String[] args){ ArrayList ary = new ArrayList(); ary.add("Mac"); ary.add("Wiindows"); ary.add("Linux"); for(Object str:ary){ System.out.println((String)str); } } }

    • ベストアンサー
    • Java
  • sleepメソッドを呼び出すには?

    JAVAのプログラムを勉強しているのですが、ArrayList<Character>の各要素に対してsleepメソッドを呼び出したいのですが、c.sleep ();と打つとエラーになってしまいます。 package pkg6.pkg5.pkg1; import java.util.ArrayList; import java.lang.*; public class Main { public static void main (String[] args) { ArrayList<Character>list2 = new ArrayList<Character>(); list2.add ('A'); list2.add ('b'); for (Character c:list2) { c.sleep (); //↑この部分がエラーになる } } } なぜこうなるのでしょうか?sleepメソッドは呼び出せないのでしょうか? ご教授願います

    • ベストアンサー
    • Java
  • またjavaでの問題です

    今回ArrayListを使って"Bye"、"Hi",""Hello"を表示するプログラムです ソース乗せたほうが早いので載せます import java.util.*;; class Act{ private String phrase="A"; public Act(String p){ phrase=p; } } class Stage2 { public static void main(String[] args){ ArrayList<String> strList =//String用のArrayListを作成 new ArrayList<String>(); strList.add("Bye");//Bye,Hi,HelloをArrayListに追加 strList.add("Hi");//Bye,Hi,Helloを出力したいです strList.add("Hello"); for(int i=0; i<strList.size(); i++){ strList.get(i); } } エラーはなく、例外処理もありません ただ出力しないだけです System.out.println(phrase)を書かない理由は呼び出しかたがわからないので書きませんでした どうかアドバイスなどの御助力お願いします

    • ベストアンサー
    • Java
  • java勉強中です。

    java勉強中です。 今、ArrayListでつまづいています。 質問の仕方が下手で、内容が分かり難いかもしれませんが、 どなたか、どうかよろしくお願いいたします。 ArrayList<String> listA = new ArrayList<String>(); ArrayList<String[]> listB = new ArrayList<String[]>(); があります。 1回目に listA = [aaa, bbb, ccc, ddd] 2回目に listA = [eee, fff, ggg, hhh] と、listA.add("~")で4つ追加して、 4つたまったら、それを1つの塊として 今度はlistBにaddしていきたいのですが、 listB.add(listA);としてしまっているので 下記のようにエラーになってしまいます。 ArrayList<String[]> add(String[])は引数(ArrayList<String>)に適用できません。 listBに[aaa, bbb, ccc, ddd],[eee, fff, ggg, hhh] としたいのですが、どのようにしたら良いでしょうか?

    • ベストアンサー
    • Java
  • すいません。解説してください。

    いつも教えて頂き大変お世話になっております。 下記プログラムを解説して頂きたいのです。 特に最初の4行を詳しく教えて欲しいです。 何度もすみません。 ご回答のほど、宜しくお願い申し上げます。 OSはUbuntu18.04を使っています。 このプログラムは、他のプログラムも関係するのでしょうか? 色々とお手数かけます。 コンパイルしたら注意:Sample90.javaの操作は、未チェックまたは安全ではありません。とエラーメッセージが出ました。 何でも参考になります。 ご回答のほど、宜しくお願い申し上げます。 package sample; import java.util.List; import java.util.ArrayList; import java.util.LinkedList; public class Sample90 { public static void main(String[] args) { new Sample90().execute(); } public void execute() { List list = new ArrayList(); list.add("A"); list.add("B"); for (int i = 0; i < list.size(); i++) { String s = (String) list.get(i); System.out.print(s + " "); } System.out.println(""); list = new LinkedList(); list.add("A"); list.add("B"); for (int i = 0; i < list.size(); i++) { String s = (String) list.get(i); System.out.print(s + " "); } } }

  • コレクションクラスについて

    ●下記のコードについて質問があります import java.util.*; public class Test { public static void main(String args[]) { ArrayList<ObjectOne> list = new ArrayList<ObjectOne>(); list.add(new ObjectOne()); list.add(new ObjectOne()); list.add(new ObjectOne()); Collections.sort(list); } } class ObjectOne { private int x = 0; private int y = 0; } このソースをコンパイルすると、 シンボル: メソッド sort(java.util.ArrayList<ObjectOne>) 場所 : java.util.Collections の クラス Collections.sort(list); と、エラーが表示されてしまいます。 java.util.*をインポートしているので、上記のようなエラーはでないと 思うのですが、うまくいかないです。おそらく、ObjectOneクラスで 何か処理漏れが起きているのかもしれませんが、エラーとなる原因を 特定することができません。 エラーとなる原因と解消する手立てを教えていただければと思っております。 宜しくお願い致します。 「追記」 ArrayList<ObjectOne> list = new ArrayList<ObjectOne>(); の<ObjectOne>を消せばエラーはなくなりますが、 <ObjectOne>を消さない方針で考えがあればと思っております。

専門家に質問してみよう