2012-02-22 31 views
0

Iは、2つのコードスニペットたい:xの値は影響を受けないこのコードでのJava:によって値パスまたは参照渡し

class PassByTest{ 
    public static void main(String... args){ 
     PassByTest pbt=new PassByTest(); 
     int x=10; 
     System.out.println("x= "+x); 
     pbt.incr(x);//x is passed for increment 
     System.out.println("x= "+x);//x is unaffected 
    } 
    public void incr(int x){ 
     x+=1; 
    } 
} 

まず。この中

セカンド

import java.io.*; 
class PassByteTest{ 
    public static void main(String...args) throws IOException{ 
     FileInputStream fis=new FileInputStream(args[0]); 
     byte[] b=new byte[fis.available()]; 
     fis.read(b);//how all the content is available in this byte[]? 

     for(int i=0;i<b.length;i++){ 
      System.out.print((char)b[i]+""); 
      if(b[i]==32) 
       System.out.println(); 
     } 
    } 
} 

ファイルのすべてのコンテンツはbyte[] bで利用可能です。
どのように、なぜですか?第2のケースで

+0

intはプリミティブであり、byte []は参照型ですか? –

+3

@ YuriyZubarevすべての型は、プリミティブとリファレンスの両方がJavaの値で渡されます –

+2

[many](http://stackoverflow.com/questions/498747/java-pass-by-value-reference-variables)[関連] (http://stackoverflow.com/questions/2027/pass-by-reference-or-pass-by-value)[質問](http://stackoverflow.com/questions/40480/is-java-pass-by -reference)を参照してください。 – kabuko

答えて

9

Java is always pass-by-value.

、しかし、あなたは(アレイがオブジェクトであり、Javaオブジェクトを常に参照を介してアクセスされる)によって値の参照を渡しています。このメソッドは配列への参照を持つので、自由に変更することができます。

+0

@Yuriy次に、Javaにスワップメソッドを書く。それは楽しいでしょう.. – Voo

+0

@oil charlesworth:thnxあなたの答えです。この前に、私は常に 'byte []'も 'プリミティブ'データ型であると思っていましたが、javaの 'array'は動的(つまり、' reference'型)であることを忘れています。 –

+0

いいえ、配列はオブジェクトです。それらは参照型です。 – duffymo

4

Javaは値渡し - 常にです。ここで

は誰のための十分な権威であるべきジェームズ・ゴスリンを、引用referenceです:ジャワの著者から

:「 Javaで 正確に一つのパラメータ渡しモードがあります - 値渡し - とそれは を簡単にするのに役立ちます。 " Java プログラミング言語、第2版Ken ArnoldとJames Gosling、セクション 2.6.1、page 40、3段落。

+0

オブジェクトを使用している場合は参照渡し、プリミティブ型の場合は値渡しとなります。ここをクリックhttp://docs.oracle.com/javase/tutorial/java/javaOO/arguments.html – jonney

+0

間違っている、間違った、間違っている.....あなたは完全に間違っている、ジョニー。あなたは間違っていません - パウリ。あなたは、言語を発明したジェームスゴスリングの言葉に同意しませんか? 1日目以降は変更されていません。 – duffymo

+0

その後、Sun java oracleの記事は間違っています。また、この記事も間違ってhttp://www.javacertificate.net/passbyvalue.htm? どちらも同じことを言います。つまり、メソッドパラメータのオブジェクトが参照として渡されます。オブジェクトを値として渡したい場合は、不変にしてください。 – jonney

関連する問題