thinkinginjava学习笔记04_初始化与清理

java沿用了c++的构造器,使用一个和类名彻底同样的方法做为类的构造器,能够有多个构造器来经过不一样的参数进行构造,称为重载;不只是构造器能够重载,其余方法也同样经过不一样的形参以及不一样的返回值来实现重载;java

当建立一个新的对象的时候,java就须要对该对象进行初始化(若是没有建立构造器,java会自动建立一个无参构造器,也称默认构造器,并对对象进行初始化),构造器函数只对对象进行初始化操做,并无任何返回值(也不是返回void);python

java中区分两个方法时,使用每一个方法的参数列表(包括参数的顺序),参数列表的不一样就会造成重载,方法的返回值不一样一样会造成重载;c++

当重载涉及到基本类型的时候,若是传入的参数大小较小,则将自动转成形参中较大的类型;优先使用相同基本类型形参的方法进行调用,若是找不到,则会使用比较大的形参方法进行调用,而且自动将传入参数作相应的放大类型转换;若是只能找到较小的形参方法时,必须进行参数类型转换(窄化转换),不然编译器将报错;数组

若是类中没有构造器,则java会自动建立一个默认构造器,若是定义了构造器,则java再也不建立默认构造器;函数

概念比较多,举个重载方法的例子:学习

class Human{this

 

}spa

 

class Host extends Human{对象

 

}开发

 

class Stranger extends Human{

 

}

 

class Dog{

    void bark(Host h){

        System.out.println("She is wagging...");

    }

    void bark(Dog d){

        System.out.println("She is harking!");

    }

    void bark(Stranger s){

        System.out.println("She is howling!");

    }

}

 

public class TestInit {

    public static void main(String[] argv){

        Dog dog1 = new Dog();

        Dog dog2 = new Dog();

        Host h = new Host();

        Stranger s = new Stranger();

        dog1.bark(dog2);

        dog1.bark(h);

        dog1.bark(s);

    }

}/* output:

She is harking!

She is wagging...

She is howling!

*/

this关键字:如学习的感觉,java中方法不须要显示的self(或者this)形参,this会再方法调用的时候自动传入,所以,java的类中,若是没有作其余处理(好比加static等),都是对象方法;而且在java的类中,调用当前对象的其余方法不须要显示指定this.method(),(而且最好不要添加)编译器会自动完成该工做,this的做用更可能是在对象传递的时候使用,好比返回当前对象以及将当前对象传递给其余的方法;也能够经过this在构造器中调用比较简单的构造器来实现代码复用;

this的使用总结起来就是,在只能经过this进行明确表示传入该对象时才使用,不然都不要使用this;

经过static指定静态方法,静态方法不会传入this;关于书上说静态方法不“面向对象”,我认为Ruby已经给出了答案,类自己也是对象,能够将静态对象看作是类的一个单件方法,该单件方法能够被类调用,一样也在该类实例化对象的祖先链中存在;惟一的不一样可能就是不会传入this了;

java中支持一个名为finalize()的方法,该方法能够在对象被回收前自动调用,至关于PHP中的__destructor(),一样的,该方法并非析构方法,可是却能够经过该方法来检查对象被回收时的状态;

java中的垃圾回收并不是经过引用计数的方式(以前的猜想有误),java具备多种回收机制,可是不包括引用计数的方式;具体方式有些复杂,之后有兴趣再深究;

java中的局部变量必须初始化,不然将会以报错的形式通知开发者,而类中的数据成员则会自动进行初始化;

数据成员初始化能够直接指定,也能够经过方法返回值,或者构造器来进行初始化;当二者同时进行时,变量会在方法(包括构造器)调用以前获得初始化;

初始化顺序:

静态数据成员->数据成员->构造器;可是,静态方法只在必要的时候才会被初始化;

经过一个花括号,能够对数据成员进行显示的初始化,如:

static int i;
static{
    i = 47;
}

int j;
{
    j = 34;

数组初始化:

java中经过一个方括号定义基本类型数组,如:

int[] a1;

int a1[];

上面两种形式具备相同的含义,数组经过一个花括号的列表进行初始化 ,如:

int a1[] = {1,2,3,4,5};

基本类型数组存在于栈中,和基本类型同样,引用数组经过一个包装器类型来定义:

Integer a2[] = new Integer[5];

引用数组并不是对象自己是一个引用,而是数组中的元素都是引用(对象),引用数组的定义相似:

Integer a2[] = {
    new Integer(1),
    new Integer(2),
    3,
};

在引用数组中,若是有基本数据类型,则会自动调用包装器类型进行包装,如上例的3;

不管是基本类型数组仍是引用数组,都有一个成员:length,显示该数组的长度,当数组下标越界时,java会报错;

经过设置一个数组参数,能够实现方法的可变参数列表,而在Jave SE5以后,可变参数列表做为特性使用,具体方式为:

void aMethod(Object… args){

}

先指定可变参数列表的类型,而后紧跟三个点,接着是参数名称;

有了该特性的支持,就不须要再显式编写数组语法来传递参数,然而当指定了可变参数列表时,java会自动地填充数组,而且若是传入的是一个数组,java变不会继续填充,而是直接使用该数组;(这样的操做不知道是多余仍是简洁。。。)

因为以上不太能理解的方式,因此可变列表的引用使得重载的过程变得复杂,必要时须要经过添加非可变参数来解决问题;(有点怀念python简洁的语法了,尽管是数组,仍然会当成一个单一对象传入,这样更加容易理解而且避免不少问题,虽然python没有java的重载)

这章归纳性有点强,彷佛力求将全部的初始化都说起了,因此应该之后还会返回来再看的吧。

相关文章
相关标签/搜索