@[String为什么不是基本类型和理解final关键字]
八大基本类型
int:32位,最大数据存储容量是2的32次方减1,数据范围是负的2的31次方到正的2的31次方减1。
short:16位,最大数据存储量是65536,数据范围是-32768~32767之间。
long:64位,最大数据存储容量是2的64次方减1,数据范围为负的2的63次方到正的2的63次方减1。
float:32位,数据范围在3.4e-45~1.4e38,直接赋值时必须在数字后加上f或F。
double:64位,数据范围在4.9e-324~1.8e308,赋值时可以加d或D也可以不加。
byte:8位,最大存储数据量是255,存放的数据范围是-128~127之间。
boolean:只有true和false两个取值。
char:16位,存储Unicode码,用单引号赋值。
因此,String类并不是基本数据类。
————————————————
引用:https://blog.csdn.net/wojiao228925661/article/details/82385440
Java为什么不是基本类型
String类用final修饰,是不可变的,对String类的任何改变,都是返回一个新的String类对象。 String 对象是System.Char 对象的有序集合
用于表示字符串。String 对象的值是该有序集合的内容,并且该值是不可变的。
java 中String 是个对象,是引用类型。
基础类型与引用类型的区别是:
基础类型只表示简单的字符或数字,引用类型可以是任何复杂的数据结构。
java虚拟机处理基础类型与引用类型的方式是不一样的,对于基本类型,java虚拟机会为其分配数据类型实际占用的内存空间,对于引用类型变量,他仅仅是一个指向堆区中某个实例的指针。
引用:https://blog.csdn.net/qq_41668547/article/details/89603900
String类为什么是final的
1.为了实现字符串池
2.为了线程安全
3.为了实现String可以创建HashCode不可变性
被final修饰的类不能被继承,即它不能拥有自己的子类。
被final修饰的方法不能被重写,但是:
重写的前提是子类可以从父类中继承此方法,所以当父类中被final修饰的方法的访问权限为private时,子类中就可以重写该方法了。
final修饰的变量,无论是类属性、对象属性、形参还是局部变量,都需要进行初始化操作。
1.被final修饰的对象内容是可变的
虽然对象被final修饰对象不可被继承,但其内容依然可以被改变
2.final关键字的基本用法
在Java中,final关键字可以用来修饰类、方法和变量(包括成员变量和局部变量)。
(1) 修饰类
当用final修饰一个类时,表明这个类不能被继承。也就是说,如果一个类你永远不会让他被继承,就可以用final进行修饰。final类中的成员变量可以根据需要设为final,但是要注意final类中的所有成员方法都会被隐式地指定为final方法。
(2) 修饰方法
下面这段话摘自《Java编程思想》第四版:
“使用final方法的原因有两个。第一个原因是把方法锁定,以防任何继承类修改它的含义;第二个原因是效率。在早期的Java实现版本中,会将final方法转为内嵌调用。但是如果方法过于庞大,可能看不到内嵌调用带来的任何性能提升。在最近的Java版本中,不需要使用final方法进行这些优化了。“
因此,如果只有在想明确禁止 该方法在子类中被覆盖的情况下才将方法设置为final的。
注:类的private方法会隐式地被指定为final方法。
(3) 修饰变量
对于一个final变量,如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改;如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象.
上面的一段代码中,对变量i和obj的重新赋值都报错了。
3.final关键字与static对比
static作用于成员变量用来表示只保存一份副本,而final的作用是用来保证变量不可变
static关键字修饰变量时,会使该变量在类加载时就会被初始化,不会因为对象的创建再次被加载,当变量被static 修饰时就代表该变量只会被初始化一次
当用final作用于类的成员变量时,成员变量(注意是类的成员变量,局部变量只需要保证在使用之前被初始化赋值即可)必须在定义时或者构造器中进行初始化赋值,而且final变量一旦被初始化赋值之后,就不能再被赋值了。