前言:对象有生有死。要为对象的生命循环周期负责,要决定何时创建,怎么创建,何时销毁对象(声明要放弃对象,GC垃圾收集器将回收其所占的内存空间)。
内存中的两种区域:对象的生存空间堆和方法调用及局部变量的生存空间栈。当JVM启动时,从底层的操作系统取得一块内存,并以此区段执行程序。局部变量也叫栈变量。
实例变量声明在类中而方法之外,代表每个独立对象(实例)的字段,即实例变量存在于所属的对象中。
局部变量和方法的参数都是声明在方法中或方法参数里,生命周期是暂时的,只限于方法调用至执行完毕为止。
方法会被堆在一起,当你调用某个方法时,该方法会放在调用栈的栈顶(实际是带有方法的状态【执行到哪行程序及所有的局部变量值】的堆栈块)。
栈顶上的方法是正在执行的方法,若A方法调用B方法,则B方法放在A方法之上。方法执行完毕则释放掉。
总结:所有局部变量生存在栈上
关于对象局部变量
非primitive的变量保存的只是对象的引用,若局部变量是对对象的引用,则只有变量本身会放在栈上,而对象只是存在于堆上。
而主数据类型变量则是保存在栈中。
实例变量存在于对象所属的堆空间上,即:当新建一个phone(),JAVA在堆上开辟足以存放该对象所有实例变量的空间,换句话说,实例变量的值存放在其所在对象中,如若为int型留下32位,以此类推。
但若实例变量是对象,如phone对象带有honor对象的引用变量,则JAVA会留下空间给引用变量的值,而不是honor对象本身。此外,若只是声明了引用变量,则只是留下引用变量空间(堆上只有引用变量),但若赋值,则不仅留下引用变量空间,还会在堆上为所引用的对象开辟空间(堆上有引用变量和被引用的对象)。
重新回顾创建对象的过程
1.声明引用变量
2.创建对象
3.连接对象和引用
如Duck myduck =new Duck();
实质是调用Duck的构造函数
构造函数
调用时间:
构造函数是带有new的时候会执行的程序代码,即创建类时,默认调用了构造函数
与方法区别:
构造函数有参数,但没有返回类型
关键特征:
构造函数会在对象赋值给引用之前执行
基本作用:
初始化对象状态
注意点:
默认的构造函数没有参数
编译器只会在你完全没有设定构造函数时才会帮你写没有参数的构造函数。
上面那句话意味着若已经写了一个有参数的构造函数,并且你需要一个没有参数的构造函数,则必须自己写。
如果类有一个以上的构造函数,则参数一定要不一样,不一样包括参数的顺序和类型。
重载构造函数
代表有一个以上的构造函数且参数都不相同
写法注意点:
编译器看的是参数的类型和顺序而不是参数的名字
可以写成相同类型但顺序不同的参数
书海拾荒:
实例变量有默认值(0/0.0/false/null)
Java可以有与类同名的方法而不会变成构造函数
构造函数不会被继承
一个类有一个以上参数代表其也是重载的。
总结:
1.构造函数是在新建类时会执行的程序
2.构造函数必须与类的名字一样,且没有返回类型
3.若没有写构造函数,编译器会自动生成没有参数的构造函数
4.一个类可以有多个构造函数,但不能有相同的参数类型和顺序