Javaのfinalはどうしたんですか.Stringの値は渡しますか、それとも参照は渡しますか.
3183 ワード
finalキーワードは4つの場所で使われます.
1、クラス定義;
2、変数定義;
3、方法の定義;
4、方法の入参;
最初の応用はStringクラスです
第2の応用、定数用を定義する.
第3の応用は、単純な望ましくない方法で覆われている.
第四の応用は、値伝達にかかわるか、引用伝達にかかわるか~~~~
まずコードを見てください.
上のプログラムを見て、finalと定義されているStringとFinalではないStringBの違いは何かあると思います~~
Stringタイプの変数を変更すると、常に新しいオブジェクトが作成され、元のオブジェクトは破棄されます.
StringBufferタイプはStringの代わりに綴ることができますが、実はStringBと同じで、Finalタグを放棄しました.
Stringによって変更が発生した場合、常に新規作成されますが、なぜfinalに設定するのですか?
答え:その理由の1つは,Stringタイプが参照伝達であるにもかかわらずint,charのように関数メソッドで値伝達の効果を果たすことができるからである.メソッドでパラメータを変更したStringは元のStringオブジェクトに影響しません!Stringの使用はこのように広範であるため、方法としての入参も非常に多く、StringはIntegerのように基本的なタイプの実現を望んでいないので、このような方法を借りて値伝達を実現すればいい!もしfinalを使わないならば、それは本当に引用伝達で、上のテストを通じて、あなたは非finalタイプの入参に対して、finalタグを追加しても、引用オブジェクトの修正を阻止することはできません.もしあなたがなぜ阻止できないのかと聞くならば、私はこの時のfinal制限の変数は、オブジェクトではありません~~
実は、final類の意味は継承できないと遡及し、この目的を達成するために指示したのです!クラスの内容の変更を阻止するためではありません!Javaは現在、クラスの変更を阻止する方法を提供していないようです.以下の方法を除きます.
上で定義したstrとiは定数を定義するように見えますが、実際にはintの定義方式だけが定数を定義しています.Stringは直接定数を定義するのではなく、間接的に実現しています.理由は上から探しています.3行目はStringBタイプを定義する定数ですか?いいえ、3行目は、あるStringBタイプのオブジェクトをじっと見つめている変数を定義しています.
1、クラス定義;
2、変数定義;
3、方法の定義;
4、方法の入参;
最初の応用はStringクラスです
第2の応用、定数用を定義する.
第3の応用は、単純な望ましくない方法で覆われている.
第四の応用は、値伝達にかかわるか、引用伝達にかかわるか~~~~
まずコードを見てください.
package string;
public class FinalString {
/**
* final
*
* @param args
*/
static String strc = "Hust";
public static void main(String[] args) {
// TODO Auto-generated method stub
/**
* @String final , 。 , ,
* @str2 hust
*/
String str1 = "Hust";
String str2 = str1;
str1 += str1; // , hust String , str !
System.out.println(str1);//HustHust
System.out.println(str2);//Hust
final String str11 = "Hust"; // str11 final ,str11
//str11 += str11;
/**
* StringB Final , , , strv1 strv2
*/
StringB strv1 = new StringB();
StringB strv2 = strv1;
strv1.name += strv1.name;
System.out.println(strv1.name);//Hust1Hust1
System.out.println(strv2.name);//Hust1Hust1
changestr(strc);
}
public static void changestr(String s) {
/**
* String , !
*/
System.out.println(s == strc);//true
s = "HustHust";
/**
* String final , s ,s ,s strc, s strc,
* String
*/
System.out.println(s == strc);//false
}
public static void changestr1(final String s, final int v, int k,
final StringB b) {
/**
* s,v , final, 。 s , String, s 。 v ,
* v
*/
// s = "HustHust";
// v = 300;
k = 200;
/**
* b final, b.name b , , b
*/
b.name = "HustHust";
// b = null;
}
}
/**
*
*
* @author M007
*
*/
class StringB {
String name = "Hust1";
}
上のプログラムを見て、finalと定義されているStringとFinalではないStringBの違いは何かあると思います~~
Stringタイプの変数を変更すると、常に新しいオブジェクトが作成され、元のオブジェクトは破棄されます.
StringBufferタイプはStringの代わりに綴ることができますが、実はStringBと同じで、Finalタグを放棄しました.
Stringによって変更が発生した場合、常に新規作成されますが、なぜfinalに設定するのですか?
答え:その理由の1つは,Stringタイプが参照伝達であるにもかかわらずint,charのように関数メソッドで値伝達の効果を果たすことができるからである.メソッドでパラメータを変更したStringは元のStringオブジェクトに影響しません!Stringの使用はこのように広範であるため、方法としての入参も非常に多く、StringはIntegerのように基本的なタイプの実現を望んでいないので、このような方法を借りて値伝達を実現すればいい!もしfinalを使わないならば、それは本当に引用伝達で、上のテストを通じて、あなたは非finalタイプの入参に対して、finalタグを追加しても、引用オブジェクトの修正を阻止することはできません.もしあなたがなぜ阻止できないのかと聞くならば、私はこの時のfinal制限の変数は、オブジェクトではありません~~
実は、final類の意味は継承できないと遡及し、この目的を達成するために指示したのです!クラスの内容の変更を阻止するためではありません!Javaは現在、クラスの変更を阻止する方法を提供していないようです.以下の方法を除きます.
final String str;
final int i;
final StringB strb;
上で定義したstrとiは定数を定義するように見えますが、実際にはintの定義方式だけが定数を定義しています.Stringは直接定数を定義するのではなく、間接的に実現しています.理由は上から探しています.3行目はStringBタイプを定義する定数ですか?いいえ、3行目は、あるStringBタイプのオブジェクトをじっと見つめている変数を定義しています.