数据类型
基础介绍
类型 | 占用存储空间 | 范围 |
byte | 1字节 | -128~127 |
short | 2字节 | -32768~32767 |
int | 4字节 | -21~21(亿) |
long | 8字节 | |
float | 4字节 | -3.403E38~3.403E38 |
double | 8字节 | -1.798E308~1.798E308 |
注意事项
- 整型常量默认为int型,声明long型常量可以后加‘ l ’或‘ L ‘(建议使用大写,小写容易误认为数字1)。
如: long a = 55555555; //不出错,在Int表示的范围内(21亿内)。
long b = 55555555555;//不加l出错,已经超过int表示的范围。 - 浮点常量默认为double。要变为float,需在后面增加F/f. 如: 3.14F
- 浮点数存在舍入误差,很多数字不能精确表示。如果需要进行不产生舍入误差的精确数字计算,需要使用BigDecimal类。
- Java.math包下面有两个有用的类:BigInteger和BigDecimal这两个类可以处理任意长度的数值。BigInteger实现了任意精度的整数运算。BigDecimal实现了任意精度的浮点运算。
例如:BigDecimal bd=BigDecimal.valueOf(0.1)//bd等于0.1 - Java进制
八进制:要求以0开头。
十六进制:要求以0x或者0X开头。
二进制:要求以0b或者0B开头。 - 科学计数法
314e2=314E2=31400
314e-2=3.14
类型转换
强制类型转换
高级变为低级需要强制转换。
如何转换
- 赋值运算符“=”右边的转换,先自动转换成表达式中级别最高的数据类型,再进行运算。
- 赋值运算符“=”两侧的转换,若左边级别>右边级别,会自动转换;若左边级别 == 右边级别,不用转换;若左边级别 < 右边级别,需强制转换。
- 可以将整型常量直接赋值给byte, short,
char等类型变量,而不需要进行强制类型转换,前提是不超出其表述范围,否则必须进行强制转换。
二元运算符的运算规则
- 整数运算
如果两个操作数有一个为long,则结果也为long。
没有long结果为int。即使操作数全为short、byte结果也为int。 - 浮点运算
如果两个操作数有一个为double,则结果为double。
只有两个操作数都是float,结果才是float。 - 取模运算
其操作数可以是浮点数,一般使用整数,结果是“余数”,“余数”符号和左边操作数相同。 - 其它转换
int -> string : String.valueOf(var);
包装类
作用
基本数据类型有方便之处,简单、高效,但是Java 中的基本数据类型不是一个对象,我们在实际使用中经常需要将基本数据转化成对象,比如:集合的泛型。这时我们就需要将基本类型数据转化成对象!
基本类型传递参数时是按值传递,包装类是引用传递。
基本类型会在栈中创建,效率较高,但有内存泄漏的危险;对于包装类对象是在堆中创建,对象的引用在栈中。
对应关系
基本数据类型 | 包装类 |
byte | Byte |
boolean | Boolean |
short | Short |
char | Character |
int | Integer |
long | Long |
float | Float |
double | Double |
自动装箱和拆箱
JDK1.5提供了自动装箱(autoboxing)和自动拆箱(autounboxing)功能, 从而实现了包装类和基本数据类型之间的自动转换。
基本类型自动地封装到与它相同的类型的包装类。
包装类对象自动转换成基本类型数据。
IntegerCache
//IntegerCache中在-128到127之间做了缓存,其中最大边界可以通过-XX:AutoBoxCacheMax进行配置
Integer a = 127, b = 127, c = 128, d = 128;
System.out.println(a == b);//true
System.out.println(c == d);//false
继承关系
对象的转型
子类对象转换为父类,我们称这个过程为向上转型,属于自动类型转换。
父类转换为子类属于强制转换,我们称之为向下转型。
public class Father {
public void method(){
System.out.println("father");
}
public static void main(String[] args) {
Father father = new Father();
Son father1 = (Son) father;
father1.method();//编译通过,执行时报错
}
}
class Son extends Father{
public void method(){
System.out.println("son");
}
}
class Daughter extends Father{
public void method(){
System.out.println("daughter");
}
}
instanceof(对象是否属于这个类)
new Student() instanceof Student =true
new Student() instanceof Person =true
new Student() instanceof Object =true
new Person() instanceof Student =false