Javaの引数

java-argument.png

引数が組込型変数(int,float)の場合は値渡し
引数がオブジェクト型の場合は参照渡し
なのでオブジェクト型が引数だったら、それを出力に出来る
なのでこんなことが起きる

Javaで引数を出力先にするには?

ちょっとややこしいので

組み込み型は出力先にできない。

次のコードで実験してみるといい。

public class Miffy {    
    public static void func(int dst){
        dst=2;//dstに値を入れようと試みる
        System.out.println("funcの中では値は変化してる dst="+dst);
    }
    public static void main(String[] args)  {
        int a=10;
        func(a);//この関数に入れれば値が変わってくれるよね?
        System.out.println("関数を抜けた後、何事もなかったかのよう a="+a);//あれー?
    }
 
}

出力結果

funcの中では値は変化してる dst=2
関数を抜けた後、何事もなかったかのよう a=10

自作オブジェクト型が引数ならば出力先にできる

オブジェクトだった場合は参照渡しになるから
極端な話、こうしてしまえば、出力先にできる
**intを出力先にしたいがためだけにintのメンバーだけを持ったクラスを作る

public class Data {
    public int m;
    public Data(int _m){
        m=_m;
    }
}
public class Miffy {    
    public static void func(Data dst){
        dst.m=2;//dstに値を入れようと試みる
        System.out.println("funcの中では値は変化してる dst="+dst.m);
    }
    public static void main(String[] args)  {
        Data a=new Data(10);
        func(a);
        System.out.println("クラスにすれば値は反映される a="+a.m);
    }
 
}

関数の中でnewはできない?

public class Miffy {    
    public static void func(Data dst){
        dst=new Data(2);//ここでnewしても関数の外に出たら何事もなかったことになる
        System.out.println("funcの中 dst="+dst.m);
    }
    public static void main(String[] args)  {
        Data a=null;//new Data(10);
        func(a);
        System.out.println(" a="+a.m);//NullPointerExceptionになる!!
    }
 
}

もしこういうことしたかったら、
return new Data(2);

すればいい。

出力にする引数はnullではいけない

関数を呼ぶ前にちゃんとnewしておく必要がある。

出力にする引数はimmutableなオブジェクトではいけない

immutableなオブジェクトとは、一回初期化したらその後ずっと同じ値のままであるようなオブジェクトのことである。
たとえば、Stringなんかはimmutableなオブジェクトなので出力にすることは出来ない

参考にしたサイト

Java Practice...Output parameter


argument java output-parameter

サポートサイト Wikidot.com argumentjavaoutput-parameter