一、存储位置
栈:基本类型:boolean,char,byte,short,int,long,float,double,void;
堆:除了以上,所有对象存储与堆。
二、包装器类型
1、为何有?
基本类型不是面向对象的,因此为每一个基本类型设计了一个类,成为包装类。
2、目的?
将基本类型包装到对象中,容器类都不支持存储基本类型。
3、装箱与拆箱?
Integer i = 10; //装箱,调用了valueOf(int)方法
int index = i; //拆箱,调用了i.intValue()方法
4、面试常见考点
{
//2个Integer比较,如果在-128~127之间会返回true
Integer i1 = 100, i2 = 100;
Integer i3 = 200, i4 = 200;
System.out.println(i1 == i2);//true
System.out.println(i3 == i4);//false
//有表达式的情况下,直接比较数值
System.out.println(i3 == (i1 + i2)); //true
//两个Double比较的情况
Double i1 = 100.0, i2 = 100.0;
Double i3 = 200.0, i4 = 200.0;
System.out.println(i1 == i2);//false
System.out.println(i3 == i4);//false
//两个Boolean比较的情况
Boolean i1 = false, i2 = false;
Boolean i3 = true, i4 = true;
System.out.println(i1 == i2);//true
System.out.println(i3 == i4);//true
//包装器类型的equals方法首先比较类型是否相同,再比较数值是否相同
Integer a = 1, b = 2;
Long g = 3L, h = 2L;
System.out.println(g.equals(a + b)); //false,先拆箱相加,再装箱为Integer
System.out.println(g.equals(a + h)); //true,先拆箱相加,类型自动转换为long,再装箱为Long
}
三、作用域
- 不允许通过作用域来区分变量
{
int x = 12;
{
int x = 96; //编译器报告变量x已定义;
}
}
- java中的基本变量只在作用于范围内有效,而其他非基本类型对象在作用域外仍有效。如下例所示,在{}之外,引用s已失效,而“abcd”仍继续占用内存。
{
String s = new String("abcd");
}
四、类
1、字段
- 按照类型分: 可以分为基本类型和对象引用。基本类型在作为类的字段时,如果没有初始化,编译器会自动设置默认值(默认值如下表),而在作为类范围之外定义的局部变量时,如果没有初始化,编译器则会报错。对象引用则都必须初始化。
- 按照是否静态分: 可以分为对象字段和类字段。
类型 | 默认值 | 类型 | 默认值 |
---|---|---|---|
boolean | false | char | '\u0000'(null) |
byte | (byte)0 | short | (short)0 |
int | 0 | long | 0L |
float | 0.0f | double | 0.0d |
2、方法
- 对象方法: 只能通过实例化的对象引用。
- 类方法: 由static关键字定义,不依赖对象的存在,是针对类的调用。