初始化与清理之一 (初始化)

来源:互联网 发布:蛊术 知乎 编辑:程序博客网 时间:2024/05/28 03:03

1. 构造器

在使用程序库的时候往往有可能出现用户不知道如何初始化构件的问题;为了解决这个问题,C++引入了构造器这个概念,在Java中也引用构造器,以供用户完成初始化操作。为了保证构造器与其他成员标识符上不重复,则采用与类名完全一致的标识符作为构造器标识符;在类开发程序员未编写构造器方法时,编译器会自动为其创建一个无参构造器;程序员也可以自己编写构造器,完成指定初始化内容;这样便引入了一个问题:当我们需要多种初始化方式时,我们应该怎么办?

2. 方法重载

在类中需要多种初始化方式,就需要用到重载。重载的定义是,多个方法方法名一样,通过参数类型列表(有序)加以区分;同样的,普通方法也可以重载,这时需要注意的是,当较小类型的实参,放到较大类型形参时,往往是寻找最小化的适合参数,例如:基本数据类型:byte,short,char → int → long → float → double这样一个关系,当较小类型的形参无法找到时,将会自动转换为上一级,接着进行寻找。

class A{    //基本数据类型转换    public void f1(float i) {        System.out.println("f1(float)");    }    public void f1(double i) {        System.out.println("f1(double)");    }    //对象向上转型    public void f2(B b) {        System.out.println("f2(B)");    }}class B{}class C extends B{}public class chongzai {    public static void main(String[] args) {        A a = new A();        System.out.print("int:");        a.f1((int)5);        System.out.print("double:");        double d = 4.0;        a.f1(d);        System.out.print("char:");        a.f1('c');        System.out.print("toUp:");        C c = new C();        a.f2(c);    }}

输出:
int:f1(float)
double:f1(double)
char:f1(float)
toUp:f2(B)

3. this关键字

为了能方便的在对象方法内部引用该对象,特别在调用方法时,隐式地见调用方法的对象本身作为第一个参数传入,在方法内部可以用this关键字引用该对象。

两个注意事项:一是在方法内部调用其他成员方法或成员变量时,this关键字通常省略。二是当方法参数变量名与类成员变量名重复时,这时如果使用变量名引用,将只能引用传入的参数变量,若想引用成员变量,则应该用this.变量名的形式,this关键字不可省略。

4. 构造器内调用其他构造器

只能在构造器方法第一行调用其它构造器,否则无法通过编译。普通成员方法无法直接调用其它任何构造器,除非利用new一个对象的方法。

构造器调用分为两种,一是调用自身其他重载的构造器,二是调用父类构造器。

对于调用自身构造器,就需要用到this()这样一种形式来调用其它构造器。

对于调用父类构造器,利用super()形式来调用,当然super关键字也跟this类似,可以用来调用父类成员变量和方法;值得注意的是,在子类构造器中,默认会调用父类的默认无参构造器,如果父类中没有定义无参构造器(没有定义任何构造器不在此列),子类中将不得不显式利用super()调用父类的其他有参构造器,否则无法通过编译。

class A{    public A() {        this(1);        System.out.println("A()");    }    public A(int i) {        System.out.println("A(int)");    }}class B extends A {    public B() {    }    public B(int i) {        super(1);//调用父方法的构造器    }}public class init {    public static void main(String[] args) {        System.out.print("B():");new B();        System.out.print("B(1):");new B(1);    }}

输出:
B():A(int)
A()
B(1):A(int)

5.数据成员初始化

对于数据成员,为了不造成初始化问题,java采用对所有类数据成员进行默认初始化,基本数据类型做如下初始化:byte、int、float、short、long、double这些数值类型的被初始化为0,char被初始化为空字符,boolean被初始化为false;所有对象被初始化为null。

自定义初始化有两种方式,一是在定义数据成员的地方进行初始化,二是在构造器中初始化数据成员。

静态成员将会在类加载时,进行初始化

6.java类初始化过程

1.首次访问该类的行为发生,包括new对象、调用静态方法或者访问静态域
2.类加载并且完成静态初始化的所有动作
3.new对象时,开辟内存空间,对内存进行清零操作,这就自动的将所有非静态成员进行默认初始化操作
4.进行所有非静态成员字段定义初始化
5.执行构造器

0 0
原创粉丝点击