目录
一. Java的数据类型
1.1 数据类型
1.2 数据转换
1.3 表达式类型的自动提升
二. 不可变类
2.1 不可变类的概念
2.2 不可变类的优点
2.3 不可变类的创建
三. java基础技巧专栏
一. Java的数据类型 1.1 数据类型
Java语言支持的类型分为两种:基本数据类型和引用类型;
- 基本数据类型:
基础数据类型大家最为熟悉,包括boolean类型和数值类型,二数值类型又可细分为byte、short、int、long、char类型以及float和double类型;
- 引用类型:
引用类型包括一般自定义的类型、接口以及数组类型等;
所谓引用类型,实际上就是对一个对象的引用,它的本质还是一个指针。实际上除了上诉几种基本类型之外的Java所支持的数据类型,它们的对象实例都必须在堆内存空间上动态创建,而该类型的变量本身只是一个指针变量(或称为对象的引用);
代码举例1:
public class Try {
public static void main(String[] args){
int[] array;
array = new int[3];
System.out.println(array);//array指向一个大小为3的整数数组
}
}
代码举例2:
public class Text {
public Text(){}
/*
Text value; //定义一个Test类型的变量,它只是一个指针变量
*/
Text value = new Text(); //在堆内存上创建Text类型的对象实例
}
1.2 数据转换总而言之,Java语言虽然表面上取消了指针,但是实际上每个对象的实例都需要通过一个指针来引用它,否则该对象就是实处引用等待垃圾回收的对象了。即:Java没有指针,但是Java处处是指针。
基本类型间是可以进行类型转换的。具体来说,除了boolean类型的其他七种类型之间可以互相转换,且有两种类型转换方式:自动类型转换和强制类型转换;
1) 自动类型转换:
- 表示数值范围小的类型可以向表示数值范围大额类型进行自动类型转换;
- char类型的数据转化为高级类型(int,long等)时,会将其转换为对应的ASCII码;
- 基本数据类型与boolean类型都不能相互转换;
- 任何基本类型的值和字符串进行连接运算时,基本数据类型的数值都会自动转换成字符串;
- 当使用扩展赋值运算符例如“+=”时不会产生自动类型转换,而是隐含地包含了强制类型转换;
代码举例:
public class Try {
public static void main(String[] args){
char a = 'A';
int b = a; //自动类型转换char->int
System.out.println(b); //输出结果为字符A的ASCII码65
}
}
2)强制类型装换:
由于强制类型转换是将范围较大的的类型数值赋值给范围较小的类型数据,所以可能会损失精度,存在舍入误差,因此强制类型转换也被称为缩小转换(Narrow Conversation)。
代码举例:
public class Try {
public static void main(String[] args){
short a = 128;
byte b = (byte)a;
System.out.println(a); //输出结果为128
System.out.println(b); //输出结果为-128
}
}
1.3 表达式类型的自动提升
当一个算术表达式包含多个基本类型的数值时,整个算术表达式的数据类型将发生自动提升,其自动提升的原则是:
- byte、short、char类型被提升到int类型;
- 整个算术表达式的数据类型自动提升到与该表达式中最高等级 *** 作数同样的类型;
二. 不可变类 2.1 不可变类的概念
所谓不可变类(Immutable Class)是指创建了该类的实例后,该实例的值在其整个生命周期中都不能被修改。所以不可变类的实例类似于常量,它只允许程序对其读取,不允许对其修改;
一个典型的不可变类的例子就是String类型,在Java程序中一旦创建了String类型的实例,也就是一个字符串,该字符串的内容就无法修改了;
代码举例:
public class Try {
public static void main(String[] args){
String str = "Welcome to KUUUD";
str = "I am come";
System.out.println(str);//输出I am come
}
}
代码解析:
2.2 不可变类的优点这里的str只是一个指向字符串类型的对象的引用,最开始str指向的是字符串“Welcome to KUUUD”,然后将字符串“I am come”赋值给str,其实就是使str指向了字符串“I am come”而不再指向“Welcome to KUUUD”。这里并不是字符串内容发生了改变,而是变量str指向的内容发生了改变。
2.3 不可变类的创建
- 不可变类可以解决线程同步安全问题,如避免更新与读取的同步安全问题;
- 用起来简单方便,易于构成,使用与测试;
- 类定义为final或者把类中方法定义为final,以保证该类不能被继承和被子类覆盖;
- 确保所有变量都被private所修饰,以保证不被外部访问;
- 不提供改变成员变量的方法,例如,setXXX等方法;
- 对于类中的飞不变类成员,在使用getXXX方法返回该值时,不要直接返回该成员对象本身,而是clone该对象并返回对象的拷贝,以保证接触引用关系。基本数据类型成员除外;
代码创建不可变类:
public final class ImmutableClass { //类定义为final
private int[] array; //成员变量是private访问权限,不能被外部访问
public ImmutableClass(int[] array){
this.array = array.clone(); //构造方法采用深拷贝
}
public int[] getArray(){
return array.clone(); //get方法返回clone的成员对象,且不提供set方法
}
public static void main(String[] args){
int[] array1 = new int[6];
for(int i=0; i<6; i++){
array1[i] = i;
}
ImmutableClass instance = new ImmutableClass(array1);
array1[0] = 100;
int[] array2 = instance.getArray();
for(int i=0; i<6; i++){
System.out.println(array2[i]);
}
array2[0] = 100;
int[] array3 = instance.getArray();
for(int i=0; i<6; i++){
System.out.println(array3[i]);
}
}
}
三. java基础技巧专栏
https://blog.csdn.net/weixin_53919192/category_11805605.html?spm=1001.2014.3001.5482https://blog.csdn.net/weixin_53919192/category_11805605.html?spm=1001.2014.3001.5482
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)