一、值类型与引用类型

值类型:

在Java中,值类型表示的是这种数据类型的值代表数据本身。八种基本数据类型就是值类型,基本数据类型都是直接存储在内存中的内存栈上的,数据本身的值就是存储在栈空间里面。

引用类型:

引用类型是通过class来定义的类型,除了八种数据类型之外的所有类型都是引用类型。引用类型继承于Object类(也是引用类型)都是按照Java里面存储对象的内存模型来进行数据存储的,使用Java内存堆和内存栈来进行这种类型的数据存储,简单地讲,“引用”是存储在有序的内存栈上的,而对象本身的值是存储在内存堆上的。

传递

值传递:基本数据类型的赋值都属于值传递,值传递传递的是实实在在的变量值,是传递原参数的备份,值传递后,实参传递给形参的值,形参发生改变不影响实参。

引用传递:引用传递传递的是地址,形参改变会改变实参变量的值。

二、自动类型转换

1、基本数据类型

从低位类型到高位类型可以自动转换,从高位类型到低位类型需要强制类型转换,另外,目标类型需能与源类型兼容。

布尔型和其它基本数据类型之间不能相互转换;

char可转换为int、long、float和double,其他类型不能转换为char;

其他六种类型从低到高的排序为:byte、short、int、long、float、double;

算术运算中,基本会先转换为高位数据类型,再参加运算,结果也是最高位的数据类型。

public class Test {
public static void main(String[] args) {
int price = 3;
double finalPrice = price;
System.out.println(finalPrice);
System.out.println(price+finalPrice);
/*输出结果:
3.0
6.0*/
}
}

特殊情况:

如采用+=、*=等缩略形式的运算符,系统会自动强制将运算结果转换为目标变量的类型。

当运算符为自动递增运算符(++)或自动递减运算符(--)时,如果操作数为byte,short或char,类型不发生改变;

2、引用类型

基本类型与对应包装类可自动转换,这是自动装箱和拆箱的原理。

子类能直接转换为父类或接口类型: 子类就是父类。

Animal cat = new Cat();

父类转换为子类要强制类型转换;且在运行时若实际不是对应的对象,会抛出ClassCastException运行时异常。

三、强制类型转换

1、基本数据类型

语法:( 数据类型 ) 数值

public class Test {
public static void main(String[] args) {
double finalPrice = 3.25;
int price = (int)finalPrice;
System.out.println(price);
//输出结果:3
//损失了部分数据
}
}

2、引用类型

语法与上述相同,需要注意若转换后在运行时实际不是对应的对象,会抛出ClassCastException运行时异常。

Animal animal = new Cat();
Cat cat = (Cat)animal;