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时消失