1 成员变量
成员变量和局部变量不一样,首先是作用域不同:成员变量的作用域在整个类里,而成员变量的作用域在定义它的代码块里;其次是局部变量没有显式初始化使用该局部变量,编译器会报错,但是成员变量在没有显式初始化的时候,编译器会为其初始化一个默认值。
2 引用
Java语言中除了基本数据类型(boolean, char, byte, short, int, long, float, double)外的变量类型成为引用类型。
3 对象(实例)创建涉及到的内存分配
Java在创建一个对象时,会分配两块内存,一块内存位于Stack内,而另一块内存位于Heap内。位于Stack内的那块内存的内容记录了Heap的位置信息,也即Stack那块内容指向对应的Heap里面的那块内存。
为什么对象(实例)的内存是位于Heap内?我们知道,内存里的Code区放置代码,Data区域放置静态变量和字符串常量,Stack放置局部变量,Heap放置动态分配的内存。由于new出来的对象实例,在编译的时候并不知道它需要多大的内存,只有在执行的时候才知道对象实例的内存大小,这种就是动态分配。一方面是因为Heap是放置动态分配的内存的,动态分配的对象实例固然是放置在其中,另一方面,也只有Heap才有足够的内存进行动态分配内存。
/* Person.java */
public class Person {
private int age;
private int weight;
Person(int age, int weight) {
this.age = age;
this.weight = weight;
}
public int getAge() {
return age;
}
public int getWeight() {
return weight;
}
public static void main(String[] args) {
Person p = new Person(25, 50);
System.out.println(p.getWeight());
System.out.println(p.getAge());
}
}
在上面这段代码里,代码放在内存的code内存区域里面,首先执行main方法,在Stack中申请了一块内存,名为p,此时p的内容为null,然后new触发Person的构造器(或者说调用构造方法),此时在Stack又申请了两块内存,一块名为age,值为25,一块名为weight,值为50。同时在Heap申请了一块内存,内存里面也有age和weight,这时把Stack的age和weight的值复制到对应的Heap中的age和weight,复制完成后,Stack的age和weight这两块内存就会清去(因为构造函数调用完,它们的生存期就结束),同时Stack的p指向Heap的Person实例内存,这样就完成了一个对象的创建。
4 Java的构造函数
在没有显式为Java类定义构造函数时,Java编译其会为Java类加上默认(无参数)的构造函数,但当你显式定义了构造函数时,Java则不会为您添加默认构造器,当您使用默认构造器进行创建对象实例时,编译器将报错。
/* Person.java */
public class Person {
private int age;
private int weight;
Person(int age, int weight) {
this.age = age;
this.weight = weight;
}
public int getAge() {
return age;
}
public int getWeight() {
return weight;
}
public static void main(String[] args) {
//显式定义了构造器不能再使用默认构造器
//除非在自己添加默认构造器
//Person person = new Person();
Person p = new Person(25, 50);
System.out.println(p.getWeight());
System.out.println(p.getAge());
}
}
修改后的版本:
/* Person.java */
public class Person {
private int age;
private int weight;
Person() {}
Person(int age, int weight) {
this.age = age;
this.weight = weight;
}
public int getAge() {
return age;
}
public int getWeight() {
return weight;
}
public static void main(String[] args) {
Person person = new Person();
System.out.println(person.getAge());
System.out.println(person.getWeight());
Person p = new Person(25, 50);
System.out.println(p.getWeight());
System.out.println(p.getAge());
}
}