Javaの変数のリンクにアクセスする方法がないことを私は知っています(&Cや&phpのように)。しかし、例えば私にはそのような仕事があります:
public class JustTest {
private int n = 1;
private int x = 10;
public int[] getIntegers() {
return new int[] { n, x };
}
public void filledInteger() {
int[] vals = getIntegers();
System.out.println("Before change");
System.out.println(Arrays.toString(vals));
vals[0] = 2;
vals[1] = 20;
System.out.println("After change");
System.out.println(Arrays.toString(vals));
System.out.println("Values of name & xml");
System.out.println(n);
System.out.println(x);
System.out.println("calling getIntegers");
System.out.println(Arrays.toString(getIntegers()));
}
public static void main(String[] args) {
JustTest t = new JustTest();
t.filledInteger();
}
}
結果は次のとおりです。
Before change
[1, 10]
After change
[2, 20]
Values of name & xml
1
10
calling getIntegers
[1, 10]
そこで、クラスインスタンスの「n」フィールドと「x」フィールドの値を変更したいと思います。まっすぐに設定して(this-> n = 20;)これを行うことはできません。これは、自分が持っているフィールドがわからない場合があるためです。getIntegersメソッドのみが知っています。
(このコードではありませんが、たとえば、独自のフィールドを持つ子クラスがあり、親クラスには、子クラスの指定されたプロパティを変更する必要があるメソッドfilledInteger()があります(彼はこのプロパティについて、メソッドgetIntegersから知っています。親クラスで抽象化し、子クラスで実装します))
これは、phpのリンクを使用した単純な実装(継承なし)です
<?php
class JustTest {
private $n = 1;
private $x = 10;
public function getIntegers() {
return array( &$this->n, &$this->x );
}
public function filledInteger() {
$vals = $this->getIntegers();
echo("Before change" . "<br/>");
echo(print_r($vals, true) . "<br/>");
$vals[0] = 2;
$vals[1] = 20;
echo("After change" . "<br/>");
echo(print_r($vals, true) . "<br/>");
echo("Values of n & x". "<br/>");
echo $this->n , "<br/>";
echo $this->x , "<br/>";
echo("call getIntegers again" . "<br/>");
echo(print_r($this->getIntegers(), true) . "<br/>");
}
}
$t = new JustTest();
$t->filledInteger();
?>
結果は次のとおりです。
Before change
Array ( [0] => 1 [1] => 10 )
After change
Array ( [0] => 2 [1] => 20 )
Values of n & x
2
20
call getIntegers again
Array ( [0] => 2 [1] => 20 )
それが私がまさに必要としているものです。私はあなたが理解したことを願って、Javaでこれをどのように実装するのか興味があります。
次の例:
public abstract class ParentTest {
abstract int[] getIntegers();
public void fillIntegers(int[] newIntegers) {
int[] integersOfChild = getIntegers();
for (int i = 0; i < integersOfChild.length; i++) {
integersOfChild[i] = newIntegers[i];
}
}
}
public class ChildTest extends ParentTest {
private int x;
private int y;
@Override
int[] getIntegers() {
return new int[] {x, y};
}
}
public class UseTest {
void main() {
List<ParentTest> list;
for (ParentTest item : list) {
item.fillIntegers(myItegers);
}
}
}
これが私に必要なものです。ParentTestインスタンスのリストがあり(ChildTest、ChildTest2、ChildTest3の場合がありますが、すべてParentTestの子です)、すべてのフィールドに整数値を入力する必要がありますが、リストインスタンスの項目がChildTest、またはChildTest2、またはChildTest3クラス