1.构造器的自动初始化
构造器为了让每个类都可以正确的得到初始化。当用户创建一个类的对象时候,java自动调用构造器完成初始化的工作。因此提供了构造器这个特殊方法;
命名时采用与类名同名的方式原因如下:如果使用其他名字都有可能会和该类中的某个方法名字冲突;其次就是编译器的责任是调用编译器因此他需要知道他调用哪个方法。同名会使得整个过程简单易于处理。
一旦new Rock()一个对象后,会自动的分配相应的存储空间并且调用构造器,保证我们在使用的时候,已经是正确的初始化了。同时,构造器也是可以使用自变量的,例如new Rock(i);
注:所有方法首字母小写的编码规则不适用于构造器。同时该函数也没有返回值
---------------------------------------------------------------------------------------------------------------------------------
2.方法过载
2.1 区分方法过载:每个过载的方法都必须采取独一无二的自变量类型列表
问题:除了根据自变量的类型,程序员还可以怎么样区分两个同名方法的差异呢?
当然自变量的顺序也可以区分两个方法,但是通常不采用这种方式因为难以维护:
2.2主类型的过载
主(数据)能从一个较小的类型自动转变成一个较大的类型。
当我们的数据类型“小于”方法中的使用的自变量,就会对我们传入的数据进行自动转型处理;当时当我们的数据类型大于方法中的自变量时,就需要在传参给构造函数的时候显示转型;
2.3.返回值过载
当有人疑惑为什么不用返回值作为区分,
比如:void f() 和 int f();
编译器可以根据语境去明确判断int x = f();是调用什么;但是很多时候调用一个方法会同时忽略他的返回值;因为很多时候我们关心的不是返回值而是方法调用的其他效果;
2.4默认构造器
默认构造器是没有自变量的,他的作用是创建一个空对象;
如果我们没有显示的创建构造器,那么编译的时候会自动为我们创建一个默认的构造器;但是一旦显示声明构造器,就算是带自变量的,编译也不会自动为我们创建空的构造函数了;
----------------------------------------------------------------------------------------------------------------------------------
2.5 this 关键字
----------------------------------------------------------------------------------------------------------------------------------
2.6 static
static意味着一个特定的方法没有this;
不可以从一个static方法内部发出对非static方法的调用,反过来可以
当时我们可以对类本身发出对static方法的调用
相当于一个全局变量的等价物;
下面有讲解static初始化的顺序问题
----------------------------------------------------------------------------------------------------------------------------------
3.清除:收尾和垃圾收集
一般的new出的对象,当不再使用的时候,java会自动的释放资源;
但是针对一些非new出的对象,有特殊内存的变量的空间,需要finalize();
finalize()的原理:一旦准备好释放对象占用的存储空间,他首先调用finalize(),并且在下一次垃圾收集的过程中才会真正回收对象的内存。因此使用的时候可以在垃圾收集期间进行一次重要的清楚或清扫工作。
---------------------------------------------------------------------------------------
4.初始化
输出结果是:
4.2静态数据的初始化
static修饰的数据何时初始化?
1.调用某个类里的静态函数,这个类的所有静态数据依据在类里面出现的次序初始化
2.实例化的时候,如果类里面的静态成员没有初始化,那么这个类的所有静态数据变量依据类里面出现的次序初始化
分析:main中执行static时,先实行table对象的创建,因此会去执行table类中的两个static(bow1、bow2)的生成。然后调用构造函数。同理static 的cupboard一样。
输出结果:
----------------------------------------------------------------------------------------------------------------------------------
4.3 明确的静态初始化
----------------------------------------------------------------------------------------------------------------------------------
4.4 非静态实例的初始化
在匿名内部类中应用
----------------------------------------------------------------------------------------------------------------------------------
5.数组初始化
----------------------------------------------------------------------------------------------------------------------------------
5.1数组
----------------------------------------------------------------------------------------------------------------------------------
5.2 一维数组初始化
----------------------------------------------------------------------------------------------------------------------------------
5.2.1 基本类型初始化
----------------------------------------------------------------------------------------------------------------------------------
5.2.2 非基本数据类型初始化
但是当我们创建于一个非基本类型的对象数组的时候,必须使用new
如果没有a[i] = new Integer(pRand(500)); 那么这个数组就是声明了大小,不可以使用,因为是空数组,他不会给默认值0,null这种,因为是integer这种非基本数据类型。不new就访问会报错。
----------------------------------------------------------------------------------------------------------------------------------
5.2.3 两种初始化非基本类型的方法
方法一:
方法二:
----------------------------------------------------------------------------------------------------------------------------------
5.3 多维数组初始化
非基本数据类型:
最后一个例子要注意:就是当你定义了一个integer类型的数组,那么你的数组中元素必须都是integer类型。
肯定有人有疑问:是否可以定义一个数组,行是int,列是String,就是类型不一样。
答案是不可以。因为数组的定义是:相同元素的集合。
如果要定义不一样的类型,用class。