1. 堆与栈
//对象生存空间堆——堆
//方法调用及变量的生存空间——栈;调用某一方法时,该方法会被放在调用栈的栈顶
Duck d =new Duck(24)//对象引用变量d在栈上,对象Duck始终在堆上
//实例变量——声明在类中方法之外的地方——堆上,存在于对象所属的堆空间上
//局部变量——声明在方法或方法的参数上——栈上,随方法消失
//对象引用变量——在初始化对象时——栈上
2. 构造函数
public Duck(){//构造代码}//构造方法没有返回类型,且与类名相同
//在new时会调用构造函数
//构造函数不能被继承
//构造函数可以是公有、私有或不指定
//在创建新对象时,所有继承下来的构造函数都会被执行
//调用父类构造函数的唯一方法是调用super()
3.实例变量赋值初始化相关问题
3.1 一般通过构造函数对实例变量赋值
public Duck(){
size=34;
}
3.2 但是无法被使用Duck的程序员来决定大小,因此可以使用setSize()来设定大小
public class Duck{
int size;
public Duck(){
System.out.println("Quack");
}
public void setSize(int newSize)
size =newSize;
}
}
public class UseADuck{
public static void main(string[] args){
Duck d=new Duck();
d.setSize(42);
}
}
3.3 如果某类对象不应该在状态初始化之前就使用,就别让任何人能够在没有初始化的情况下取得该对象,如果用户构造出Duck对象,但是忘记执行setSize(),因此需要将初始化的程序代码写到构造函数中,同时要设置多个构造函数,以应对不同的情况,如参数类型,或者没有参数等。(注:如果已经写了带参数的构造函数,则必须写一个不带参数的,因为编译器不再执行默认构造参数)——构造函数重载
public class Duck{
int size;
public Duck(){
System.out.println("Quack");
size=duckSize;
System.out.println("size is"+size);
}
}
public class UseADuck{
public static void main(string[] args){
Duck d=new Duck(42);
}
4. 调用父类构造函数
不能直接调用父类的构造函数,要通过super()方法进行调用;
父类的构造函数必须要在子类的构造函数之前结束
super调用必须是构造函数第一个命令
public class Duck extends Animal{
int size;
public Duck(){
super();//通过此方法调用,此处不能用Animal()
size=dnewSize;
}
}
5. 有参数的构造函数
通过get方法和super方法获得
public abstract class Animal{
private String name;//每个Animal都有名字
public String getName(){//Hippo会继承这个getten
return name;
}
public Animal(String theName){//有参数的构造函数,用来设定name
name=theName;
}
}
public class Hippo extends Animal {
public Hippo(String name) {//这个构造函数会要求名字
super(name); //传给animal的构造函数
}
}
public class MakeHippo{
public static void main(String[] args) {
Hippo hippo=new Hippo("Buffy");//创建Hippo,传给名字然后再列出来看看
System.out.println(hippo.getName());
}
}
6. 从某个构造函数调用重载版的构造函数
使用this()进行调用
class Mini extends Car{
Color color;
public Mini() {
this (Color.Red);//无参数的构造函数以默认的颜色调用真正的构造函数
}
public Mini(Corlor c) {//真正的构造函数
super("Mini");
color=color;
}
public Mini(int size) {//有问题,不能同时调用this和super
this(Color.Red);
super(size);
}
}
7. 三种方法释放引用
①引用永久性的离开它的范围 void go(){Life z=new Life();}//z在方法结束时消失
②引用被复制到其他对象上 Life z=new Life();z =new Life();//第一个对象会在z赋值到别处时消失
③直接将引用设定为null。Life z=new Life();z=null;//第一个对象会在z赋为null时消失