1.类的成员之属性
语法:[访问权限修饰符] [修饰符] 类型 属性名;
属性的访问权限修饰符:private、默认、protected、public
修饰符:static、final、transient,volatitle
属性的类型:
基本数据类型:
整型:byte,short,int long 默认为0;
浮点型:float double 没,默认0.0
字符型:char 默认:'\u0000'
布尔型:boolean 默认 false
引用数据类型:
类:默认值为null
数组:数组的默认值为null,数组的元素依据其基本数据类型而定
接口:默认值为null
代码示例:
class Demo{
int n;
byte b;
short s;
long l;
float f;
double d;
char c;
boolean bl;
public void show() {
System.out.println(n);
System.out.println(b);
System.out.println(s);
System.out.println(l);
System.out.println(f);
System.out.println(d);
System.out.println(c);
System.out.println(bl);
}
}
运行结果:
0
0
0
0
0.0
0.0
false
注意:这里的flase上面是空的,并不是因为char的默认值是空或空格,而是unicode编码的\u0000,unicode中的空格是\u0020
interface inter{
}
class Demo{
String str;
int[] arr;
inter i;
public void show() {
System.out.println(str);//null
System.out.println(arr);//null
System.out.println(i);//null
}
}
1.1.1数组的初始化
我们说的数组默认值,是指系统默认初始化值
数据的初始化和数组元素的初始化是两回事,看一下下面的例子
public void method() {
int[] arr=new int[5];
System.out.println(arr);
System.out.println(arr[0]);
}
[I@15db9742
0
分析整个method方法的执行过程:
1. 调用method(),此时会创建一个栈帧,用于存放method()
2. 执行new一个数组,此时会向堆空间申请一个连续的内存空间用于存放数组
* 此时会首先获取到这个数组的数据类型
* 例如上面的是int,那么在申请内存的时候就会将这段连续的内存空间全部初始化为int的默认值0
3. 申请后arr这个变量就会和申请的数组内存空间进行一个关联,这个关联也就是地址([I@15db9742)
4. 这个地址([I@15db9742)指向的只是这段内存空间的头,此时我们输出arr
5. arr输出的结果就是内存空间的地址
6. 输出arr[0],这就不得不解释一下数组索引是如何建立的?
* 数组寻址:arr[i]=address+i*typesize
* 例如int类型是4字节,address就会加上(i*4)个字节,就会指向下一个元素的位置
这样寻址也是为什么数组下标从0开始而不是1的原因,如果数组索引从1开始,那么寻址公式将会变成:
arr[i]=address+(i-1)*typesize
这样多一次运算
1.1.2变量
分类:
1.成员变量(实例变量)
2.局部变量
相同点:
1)声明方式相同:类型 变量名=初值;
注意:成员变量可以加访问权限修饰符;但是局部变量不能加访问权限修饰符,局部变量只能用final修饰
不同点:
1)声明位置不同:
成员位置:声明在类中方法外
局部位置:方法中,或者方法的参数
2)在内存中的存储位置不同
成员变量:内存在堆中,成员变量在创建对象之后会有默认值
局部变量:内存在栈中,必须初始化赋值,否则不可使用
3)初始值不同:
成员变量:在创建对象之后有初始值
局部变量:没有初始值
4)生命周期不同:
成员变量:随着对象的创建而创建,对象的销毁而销毁
局部变量:随着方法的调用而创建,方法的结束而销毁