码迷,mamicode.com
首页 > 编程语言 > 详细

Java基础001:final关键字、String字符串的相加问题

时间:2018-07-12 14:38:58      阅读:840      评论:0      收藏:0      [点我收藏+]

标签:1.2   不难   equals   false   strong   情况   作用   返回   赋值   

1、final关键字的作用

1.1、final修饰的类:不能被其他类继承;
1.2、final修饰的方法:不能被子类重写
1.3、final修饰的变量:分两种情况,引用变量、基本类型变量,如下:
  final修饰的引用变量:一旦给其赋值,就不能被再次赋值

final String s = "32"; //引用变量
s = "1";
/**    
报错:The final local variable s cannot be assigned. It must be blank and not using a compound assignment
*/

  

  final修饰的基本类型变量:一旦给其赋值,不能改变其值

final int i = 0; // 基本类型
i = 2;
/**
报错:The final local variable s cannot be assigned. It must be blank and not using a compound assignment
*/

 

2、String字符串的相加问题

 例1:

1  String str1 = "a";
2  String str2 = "b";
3  String str3 = "ab";
4  String str4 = str1 + str2;
5  System.out.println(str3 == str4); //输出结果?
6  String str5 = str4.intern();
7  System.out.println(str3 == str5); //输出结果?

第一行:"a"作为一个常量存放于字符串池中,并将它的引用地址赋值给了str1;
第二行:"b"作为一个常量存放于字符串池中,并将它的引用地址赋值给了str2;
第三行:"ab"作为一个常量存放于字符串池中,并将它的引用地址赋值给了str3;
第四行:str1 + str2,当+号两边存在变量时(两边或任意一边),在编译期是无法确定其值的,所以要等到运行期再进行处理,处理方法:先new一个StringBuilder,然后append str1 和 str2,所以:str4引用变量指向的是堆中new出来的一个对象,而str3引用变量指向的是字符串池中常量"ab"的地址;
第五行:str3 == str4 比较的str3和str4的引用地址,so false;
第六行:String的intern()方法会将该对象的值转到字符串池中去,如果字符串池已有同样的值,则直接返回地址,如果没有,则在字符串池中新建一个,然后返回地址。再看此例子,显然"ab"已经在字符串池中存在了(第三行),所以str5和str3均指向字符串池中的"ab",且语法str3 == str5比较是引用地址,所以输出结输出结果为:true;

注:intern()这个方法API里的解释是:“当调用 intern 方法时,如果池已经包含一个等于此 String 对象的字符串 (用equals(Object)    方法确定),则返回池中的字符串。否则,将此 String 对象添加到池中,并返回此 String 对象的引用。”

 

例2:

1 String str1 = "ab";
2 String str2="a"+"b";
3 System.out.println(str1 == str2);//输出结果?

第一行:"ab"作为一个常量存放于字符串池中,并把引用地址赋值给str1;
第二行:"a"和"b"作为两个常量相加,由于编译器优化,在编译期就将+两边拼接合并了,直接认为成是一个常量"ab",结果发现字符串池中已经有一个常量"ab"了,就直接把"ab"的引用地址赋值给了str2;
第三行:str1 == str2比较的str1和str2的引用地址,当然是一样的,so输出结果: true ;

 

例3:

1 final String str1 = "a";
2 final String str2 = "b";
3 String str3 = "ab";
4 String str4 = str1 + str2;
5 System.out.println(str3 == str4);//输出结果?

第一行:"a"作为一个常量存放于字符串池中,并将它的引用地址赋值给了str1; final使得变量str1被当作一个常量对待
第二行:"b"作为一个常量存放于字符串池中,并将它的引用地址赋值给了str2; final使得变量str2被当作一个常量对待
第三行:"ab"作为一个常量存放于字符串池中,并将它的引用地址赋值给了str3;
第四行:str1 + str2,此时+号两边都是常量哦,在编译期就可以确定其值了
               即:String str4 = str1 + str2;
               就等价于 String str4 = "a" + "b";
               就等价于 String str4 = "ab";
第五行:str4指向常量"ab",str3指向常量"ab"(第三行),所以str3 == str4 等于true
        
那么现在思考个小问题:如果把第一行的final去掉,输出结果是true还是false呢?若对上述内容都理解,这个问题应该不难
提示:如果不清楚答案,请结合例1的第四行,思考一下!!

 

Java基础001:final关键字、String字符串的相加问题

标签:1.2   不难   equals   false   strong   情况   作用   返回   赋值   

原文地址:https://www.cnblogs.com/liushengit/p/9298980.html

(0)
(1)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!