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

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的第四行,思考一下!!

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

时间: 2024-10-05 00:05:45

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

java基础之final关键字

与final关键字相关的笔试题面试题也是一道必考题.而且对于final的实际应用非常广泛,在代码设计的时候,如果对此不够足够掌握,可能就会很难排查与此相关的异常. final的理论知识如下: final类型的成员变量初始化值: 1.声明时候直接赋值 2.构造方法中赋值,如果一个类中有多个构造方法,就要保证在每个构造方法中都要完成对final类型变量的初始化工作 3.静态final成员变量必须在声明时赋值,且不能在构造方法中赋值 4.final成员变量指的是引用不能改变,即该变量的引用不能在指向其

【Java基础】final关键字总结

Java中的final关键字非常重要,它可以应用于类.方法以及变量.这篇文章中我将带你看看什么是final关键字?将变量,方法和类声明为final代表了什么?使用final的好处是什么?最后也有一些使用final关键字的实例.final经常和static一起使用来声明常量,你也会看到final是如何改善应用性能的. final关键字的含义? final在Java中是一个保留的关键字,可以声明成员变量.方法.类以及本地变量.一旦你将引用声明作final,你将不能改变这个引用了,编译器会检查代码,如

Java基础(三)-final关键字分析

今天来谈谈final关键字的作用, 虽然有很多博文关于final进行了很深的研究,但还是要去记录下谈谈自己的见解加深下印象.下面直接进入主题: 一.final关键字的作用 1.被final修饰的类不能被继承. 这一点应该很多人都知道也遇到过,经典案例就是java.lang.String类 还有一些常见的类也是被final所修饰的,如下: 基本类型对应的包装类型(如java.lang.Integer.java.lang.Long等).字符相关类(java.lang.StringBuilder.ja

二、Java基础之final关键字

final变量: final修饰的变量(成员变量或局部变量),即常量,只能赋值一次,不能再次修改. final成员变量要么在声明时赋值,要么在构造函数里赋值. 如果变量为引用类型,变量的引用不能修改,但是引用指向的内容是可以被修改的. final方法: final修饰的方法不能被子类重写. final类: final修饰的类不能被继承. 最典型的例子:String类.因为String是immutable的,所以不能允许其他类继承String,否则其子类会轻易的将其改为mutable.详细参考:h

java 基础 1 final关键字

1. final关键字 数据:声明数据为常量,对于基本类型final使数值不变,对于引用类型final使引用不变,但引用所指向的值是可以改变的,例如       final StringBuffer sb = new StringBuffer("sb");  sb.append(1); 此时打印sb的值为sb1; 方法:声明方法不能被子类覆盖,private方法隐式地被指定为final,如果在子类中定义的方法与基类中private方法签名相同,此时                  

java基础复习之对于String对象,可以使用“=”赋值,也可以使用new关键字赋值,两种方式有什么区别?

String类型是实际工作中经常用到的类型,从数据类型上划分,String是一个引用类型,是API中定义的一个类.所以String类型的对象可以用new创建,例如String name=new String("string");为变量name进行赋值,值为"string" ,然而String类比其他类有些特殊,可以使用'='直接赋值,如 String name="string";也是为变量name进行赋值,值为"string"

Java基础语法(一)---关键字、常量、变量、运算符

Java基础语法(一)---关键字.常量.变量.运算符一.关键字 定义:被Java赋予了特殊含义的单词. 特点:体现上都是英文小写. 1. 用于定义数据类型的关键字 基本数据类型: 整数类型: byte(1字节,最大值127) short(2字节,最大值为2^15-1) int(4字节,最大值为2^31-1) long(8字节,最大值为2^63-1) 浮点类型: float (单精度实数在内存中占32bit 有效数字为6~7位) double(双精度实数占内存单元为64bit 有效数字为15~1

浅析Java中的final关键字

原文出处: 海子 谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来了解final这个关键字的用法.下面是本文的目录大纲: 一.final关键字的基本用法 二.深入理解final关键字 若有不正之处,请多多谅解并欢迎指正. 一.final关键字的基本用法 在Java中,final关键字可以用来修饰类.方法和变量(包括成员变量和局部变量).下面就从这三个方面来了解一下final关键字

转载:浅析Java中的final关键字

文章转自:http://www.cnblogs.com/dolphin0520/p/3736238.html 谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来了解final这个关键字的用法.下面是本文的目录大纲: 一.final关键字的基本用法 二.深入理解final关键字 若有不正之处,请多多谅解并欢迎指正. 请尊重作者劳动成果,转载请标明原文链接: http://www.cn