初始化与清理

初始化指的是在使用某一元素之前要初始化,使用完之后记得要清理。否则会产生不安全或资源耗尽的问题

1. 构造器

用构造器确保初始化,构造器与类同名;
不接受任何参数的构造器叫做默认构造器(or无参构造器),构造器也可以有自己的参数。
构造器的作用是“初始化”对象,Java中“初始化”与“创建”是捆绑在一起的。
比如

new Rock();

这行代码,就是包括了“创建”(为对象分配存储空间)和“初始化”(调用相应的构造器);
自己不写构造器会有默认的无参构造器,若写了构造器那么构造器就是自己所写的构造器了。

2. 方法重载

当创建一个对象时也就是给此对象分配到的存储空间取了一个名字,所谓方法就是为某个动作取的名字
方法重载:值得是方法名称相同而形式参数不同的方法(注意只有参数列表不同才能区分方法重载,而返回值不同不能区分);
在方法重载时,基本类型可能会发生强制类型转换,例如一个int型的参数可能找不到所对应的方法,但是有float类型参数的方法,那么他会自动转为float型。

3. this关键字

this关键字指的是对当前对象的引用
一些重要的用法
(1)返回当前对象的引用

public class Dog {
	int i = 0;
	Dog incrment() {
		i++;
		return this;
	}
}

(2)将当前对象传递给其他方法

class Person{
	public void eat(Apple apple) {
		Apple peeled = apple.getpeeled(); //吃之前先剥皮
		System.out.println("Yummy");
	}
}
class Peeler{
	static Apple peel(Apple apple) {  //静态方法,实现剥皮
		return apple;                 
	}
}
class Apple{
	Apple getpeeled() {               //实现剥皮的方法
		return Peeler.peel(this);     //将当前对象传递给peel静态方法,实现剥皮
	}
}
public class PassingThis {
	
	public static void main(String[] args) {
		new Person().eat(new Apple());
	}

}

(3)在构造器中调用构造器
可能为一个类写了多个构造器,有时可能想在一个构造器中调用另一个构造器,以免重复代码。可用this关键字

public class Flower {
	int petalCount = 0;
	String name;
	Flower(){
		System.out.println("first Constructor");
	}
	Flower(int i){
		this();
		petalCount = i;
		System.out.println("int constructer petalCount ="+petalCount);
	}
	Flower(int i,String n){
		this(i);
		name = n;
		System.out.println("int String Constructor name ="+name);
	}
	public static void main(String[] args) {
		new Flower(1,"hh");

	}

}

在这里插入图片描述
(4)深入理解static
static方法就是没有this的方法,在static的内部不能调用非静态方法;反过来是可以的,而且可以在没有创建任何对象的前提下仅仅通过类本身来调用。这是实际上正式static方法的主要用途。

4. 清理:终结处理和垃圾回收

本小节看不懂啊!

5. 成员初始化

Java尽力保证:所有变量在使用前都能得到恰当的初始化;
对于局部变量Java以编译错误的形式保证;
对于基本类型的成员变量Java会自动初始化,每个变量有一个初始值;
对于对象的引用,Java会自动初始化为null;

6. 构造器的初始化

可以用构造器进行初始化,在运行时刻,可以调用方法或执行某些动作来确定初值;
但是:无法阻止自动初始化的执行

public class Counter {
	int i;
	public Counter() {
		i = 7;
	}
}

即这段代码i先被置为0,再被置为7
(1)初始化顺序
类的内部,变量定义的先后顺序决定了初始化的顺序。即使变量定义散布于方法定义之间,它们仍会在任何方法(包括构造器)被调用之前得到初始化。(数据成员先于构造器)
(2)静态数据的初始化
无论创建多少个对象,静态成员都只占用一份存储区域
static关键字不能应用于局部变量,因此它只能作用于域。如果一个域是静态的基本类型就会获得标准初值,若是对象的引用那么就是null。
只有在第一次访问静态数据时(or第一个对象被创建),它们才会被初始化。
初始化的顺序是先静态对象再“非静态”对象;
对象的创建过程:
有个名为Dog的类:
(1)即使没有显式地使用static关键字,构造器实际上也是静态方法。因此,当首次创建为Dog的对象时,或者Dog类的静态方法/静态域首次被访问时,Java解释器必须查找类路径,以定位Dog.class文件。
(2)载入Dog.class,有关静态初始化的所有操作都会执行;静态初始化只在Class对象首次加载的时候进行一次。
(3)当使用new Dog()创建对象的时候,首先在堆上为Dog对象分配足够的存储空间;
(4)这块存储空间会被清零,这就自动地将Dog对象中的所有基本类型数据都设置成了默认值,引用则是null
(5)执行所有出现于字段定义处的初始化动作。
(6)执行构造器。

(4)非静态实例的初始化:实例初始化子句是在两个构造器之前执行的。

7. 数组初始化

int[] a;这是一个创建数组的例子
数组初始化的几种方法:

import java.util.*;

public class ArrayInit {

	public static void main(String[] args) {
		Integer[] a = {
				new Integer(1),
				new Integer(2),
				3,
		};
		Integer[] b = new Integer[] {//数组a和数组b是两种创建数组的方式,数组a形式受限,只能在数组定义时创建;
				new Integer(1),
				new Integer(2),
				3,
		};
		System.out.println(Arrays.toString(a));//Arrays.toString()产生数组可以打印的版本
		System.out.println(Arrays.toString(b));
	}
}

8. 可变参数列表

public class Demo{
    static void printArrays(Object...args){
        for(Object obj : args){
            System.out.println(obj);
        }
    }
}

9. 枚举类型

enum关键字,使得我们在需要群组并使用枚举类型集时,可以很方便地处理。

public class EnumOrder {
	
	public static void main(String[] args) {
		for(Spiciness s : Spiciness.values()) {              //Spiciness.values()用来按照enum常量的声明顺序,产生由这些常量构成的数组
			System.out.println(s + ",ordinal" + s.ordinal());//s.ordinal()表示某个特定enum常量的生成顺序
		}

	}

}

enum类型就是
enum在switch中的用法

public class Burrito {
	Spiciness degree;
	public Burrito(Spiciness degree) {
		this.degree = degree;
	}
	public void describe() {
		System.out.print("This burrito is ");
		switch(degree) {
		case NOT:  System.out.println("not spicy at all");
		           break;
		case MILD: 
		case MEDIUM:  System.out.println("a little hot.");
		              break;
		case HOT:
		case FLAMING:
		default :     System.out.println("maybe too hot.");
		}
	}
	public static void main(String[] args) {
		Burrito 
		  plain = new Burrito(Spiciness.HOT),
		  greenChile = new Burrito(Spiciness.MEDIUM),
		  jalapeno = new Burrito(Spiciness.HOT);
		plain.describe();
		greenChile.describe();
		jalapeno.describe();
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值