基础数据类型总结
a) 基础类型
byte 8 char 16 short 16 int 32 float 32 long 64 double 64 boolean ~
注意:
boolean类型的字节长度 ,并没有具体的规定。boolean只有两个值true、false。JVM再编译时期将boolean类型的数据转换成int类型,用1表示true,0表示false。JVM支持byte数组类型的数组,所以是通过读取byte数组来进行实现的。
b) 包装类型
Byte Character Short Integer Float Long Double Boolean
自动拆装箱处理
自动装箱:将基本数据类型自动转换成对应的包装类
自动拆箱:将包装类自动转换成对相应的基本数据类型
Integer i = 10; //自动装箱
int b = i; //自动拆箱
Integer i =10 其实就等同于Integer i = new Integer(10);减少了开发人员的工作,开发者不需要手动去new一个Integer对象。
c) 缓存池
1 自动拆装箱和缓存机制
Integer integer1 = 3;
Integer integer2 = 3;
if(integer1==integer2) {
System.out.println("integer1==integer2");
}else {
System.out.println("integer1!=integer2");
}
Integer integer3 = 300;
Integer integer4 = 300;
if(integer3==integer4) {
System.out.println("integer3==integer4");
}else {
System.out.println("integer3!=integer4");
}
结果:
integer1==integer2
integer3 !=integer4
解析:
可能都会认为两个if语句中都会返回false,但实际上第一个返回false,第二个返回true。
正是因为缓存池的问题,在Java 5 之后,再Integer之后引入了一个新的功能为了节省内存和提高性能。Integer对象通过使用相同的对象引用实现了缓存和重用。
但是只适用于整数值区间-128 至 +127。只适用于自动装箱,使用构造函数创建对象的时候不适用。
Integer i = 3 等于 Integer i = Integer.valueOf(3);
Integer i = 300 等于 Integer i = new Integer(300); 只有超出缓存值的范围之后才会创建对象。
d) float 与double
Java中不能执行向下转型,因为这会使精度降低。
1.1 字面量是属于double类型的,不能直接将1.1赋值给float变量,向下转型会降低精度。
float f 1=1.1;//会提示报错
1.1f 字面量才是float类型
float f = 1.1f;
e) 隐式类型转换
字面量1 是int类型,比short精度要高,所以不能向下转型将int转换成short类型。
short s =1;
s = s1 + 1;//此句会报错,int类型不能转换成short类型的数据
s + = ;//编译通过
s++;//编译通过
使用+= 或者 ++ 运算符可以执行隐式类型转换。相当于s = (short) (s + 1);
f) 参数传递
Java 的参数的值是以值传递的形式传入到方法中,而不是引用传递
下列代码的Dog dog 的dog是一个指针,存储的 是对象的地址。在将一个参数传入方法时,本质上是将对象的地址以值得方法传递到形参中。因此在方法中使用指针引用其他对象,这两个指针指向得是不同的对象,在一方改变之后内容之后对另一方没有影响。
public class Dog {
String name;
Dog(String name) {
this.name = name;
}
String getName() {
return this.name;
}
void setName(String name) {
this.name = name;
}
String getObjectAddress() {
return super.toString();
}
}
public class PassByValueExample {
public static void main(String[] args) {
Dog dog = new Dog("A");
System.out.println(dog.getObjectAddress()); // Dog@4554617c
func(dog);
System.out.println(dog.getObjectAddress()); // Dog@4554617c
System.out.println(dog.getName()); // A
}
private static void func(Dog dog) {
System.out.println(dog.getObjectAddress()); // Dog@4554617c
dog = new Dog("B");
System.out.println(dog.getObjectAddress()); // Dog@74a14482
System.out.println(dog.getName()); // B
}
}
class PassByValueExample {
public static void main(String[] args) {
Dog dog = new Dog("A");
func(dog);
System.out.println(dog.getName()); // B
}
private static void func(Dog dog) {
dog.setName("B");
//此时在方法中改变对象得字段值会改变原对象该字段值,因此此处改变的是同一个地址指向的内容。
}
}