初始化指的是在使用某一元素之前要初始化,使用完之后记得要清理。否则会产生不安全或资源耗尽的问题
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();
}
}