对象也有生命周期,我们得决定在何处创建对象,怎样创建对象,还要决定何时销毁对象,本章将针对上述内容进行介绍。
一、对象的生存空间——堆与栈
类由两大块组成:实例变量与方法,方法里可能会有局部变量。通过类可声明对象。
这里再重述一遍实例变量是声明在类中方法之外的地方,局部变量是声明在方法或方法的参数里。
堆:存放所有的对象,实例变量
栈:存放方法和局部变量,栈顶方法是正在执行的方法,执行完即弹栈
注:如果局部变量是一个引用变量,则引用变量本身依然存放于栈中,引用的对象还是存放在堆上。
总而言之,变量存放在哪个空间由到底是哪种变量决定,哪种变量不是指变量类型,而是指是局部变量还是实例变量。
二、构造函数
1、一旦新建一个对象,构造函数就会被执行
2、构造函数没有返回类型,且名字一定与类名相同
3、如果我们未编写构造函数,编译器会自动生成没有参数的构造函数;如果我们编写了构造函数,编译器就不会再生成。
例:编译器生成的构造函数:
public Duck(){
}
4、一个类可以有多个构造函数,但不能有相同的参数类型和顺序,这叫做重载过的构造函数
5、调用父类的构造函数:super()//调用无参数的父类构造函数
super(x)//调用带有参数的父类构造函数
注:如果我们未在子类中编写super语句,编译器会自动加上super()调用,即自动调用不带参数的父类构造函数!!如果有super语句,一定是第一句!!
假如:Dog继承了Animal,且都有构造函数:
Dog d=new Dog();//最早调用Dog的构造函数,但最后一个执行完毕,因为Dog的构造函数中第一句是调用Animal的构造函数。
6、使用this()来从某个构造函数调用同一个类的另一个构造函数;this()只能用于构造函数中,且必须是第一行语句;super()和this()不可兼得!!即每个构造函数中可选择调用this()或super(),但不能同时调用,因为都必须是第一行语句!!
例:
class Dog{
int size;
public Dog(){
this(5);
System.out.println("wang");
}
public Dog(int ss){
size=ss;
System.out.println(size);
}
}
如果调用语句:Dog d=new Dog();
输出:
5
wang
三、生活周期
1、局部变量:只存活在声明该变量的方法内,活到方法执行完毕
2、实例变量:寿命与对象相同,对象活多久,实例变量活多久
3、引用变量:三种方法释放对象的引用,若对象无法获得引用,会被垃圾收集器处理。
法1:void go{
Dog d=new Dog();
}//方法结束后即会消失
法2:Dog d=new Dog(); d=new Dog();//将引用赋值到其他对象
法3:Dog d=new Dog();d=null;//将引用设定为null
BY ZJQ