Java第三课_堆栈

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

猜你喜欢

转载自blog.csdn.net/qq_28271733/article/details/80952854