1.用构造器确保初始化。
由于构造器的名称必须与类名完全相同,所以“每个方法的首字母小写”的编码风格不适用于构造器。而且我们又知道,构造器,分为有参构造和无参构造。
构造器没有返回值,这与返回值为void明显不同,构造器不会返回任何东西,尽管new表达式确实返回了对新建对象的引用,但构造器本身没有返回任何值。
用代码来了解一下吧;
2.方法重载、
简单点说,重载就是当我们想做一件事时,要想给他不同的条件,去执行不同的情况。比如呢,我让你写代码,这时我什么都没有给你,你想怎么写怎么写。然后呢,我对另一个人呢,他水平比较高,我想让他给我写出有用的代码,ok,我给他一个编辑器,eclipse,这时,我给他了编辑器。又来一个人,他水平和第二个人一样,但是他提出了要求,我不仅要编辑器,他还要一个分屏,ok,条件能给。用代码写出来是这样的。
每个重载的方法都有自己独一无二的参数类型列表,甚至参数顺序的不同也可以区分两个方法,不过一般没人这么做。
涉及基本类型的重载会怎么样呢?我们先来看一下代码
由于代码较长,分了四个图,可以从图中看出,常数5经常被当做int值处理,所以当有方法接受int参数时,就会被调用。如果传入的数据类型小于方法中声明的参数类型,实际数据类型就会被提升。char类型不同,如果没有找到接受char类型的方法,会被直接提升为int。但是当我们传入的参数类型大于重载方法声明的形式参数,该怎么办呢?来看下代码吧。
可以看到,只有进行窄化转换才能运行。
3、默认构造器
对于默认构造器,当你的类中没有定义构造器的话,编译器会帮你提供一个默认构造器。但是当你创建了有参构造,但是又没写无参构造时,去用new无参构造就是错的。来看代码
4.this关键字的用法。
this关键字只能在方法内部调用,表示对“调用方法的那个对象”的引用。
可以从输出的代码中可以看出,this和f的引用相同。同时,this关键字对于将当前对象传递给其他方法调用也很有用。
一样的结果。为了将自身传递给外部方法,Apple必须使用this关键字。
5、在构造器中调用构造器。
当我们在一个类中写了多个构造器,想在其中一个构造器中调用另一个构造器时,就会用到this方法,以避免重复代码。下面通过代码来看一下怎么使用的吧。
从图中可以看出,可以通过this来调用另一个构造器。并且,除了构造器之外的其它方法都不可以这么做。
代码解释了注释中的话,就是一个构造器只能调用一次构造器,并且,必须将调用置于方法的最起始处。
在this的最终提一次,static方法中不能使用this关键字(至于原因,之后会做出一个关于关键字详细解释)。
6. 成员初始化
在java中,所有变量在使用前都得到恰当的初始化,对于方法的局部变量,java以编译时错误的形式来提醒程序员进行初始化。对于类的数据成员来说,如果是基本数据类型,就会有初始值。
通过上面的输出结果可以看出每个成员变量都有初始值,对于对象成员变量时,没有初始化使用会默认为null。但是对于最后一个图片的局部变量,没初始化使用时不可行的。
7.指定初始化
在对某个变量进行初始化时,我们可以直接为其赋值,也可以调用方法为其赋值。example:
上面f,j 的初始化是通过调用方法来实现的初始化,但是有个限制是Dog的每个对象都有相同的初始值。
8.构造器初始化
可以使用构造器来进行初始化,在运行期间,可以调用方法或者执行某些动作来确定初值,但是无法阻止自动初始化的执行,在构造器调用前会执行一次自动初始化,因此编译器不会强制你在构造器之前对变量进行初始化。在类的内部,变量定义的先后顺序决定了初始化的顺序,即使变量散布于方法定义之间,仍会在任何方法被调用之前得到初始化。
可以从控制台看到,在构造方法调用之前,w1,w2,w3已经进行了初始化。
9.静态数据的初始化
无论创建多少个对象,静态数据只会占用一份存储区域,因此static关键字不能作用于局部变量,只能作用于成员变量。如果一个成员变量是静态的基本类型,且没有对它进行初始化,那马它就会获得基本数据类型的标准初值。如果是一个对象引用,那么默认初始值为null;
下面来了解一下静态存储区域是什么时候初始化的。
从输出结果来看,b1,b2,b4,b5只进行一次初始化,并且,可以看出在定义了b3之后才定义了b4,b5,但是先初始化了b4,b5。由此来看,静态对象只会在必要时刻进行初始化,并且只初始化一次。初始化的顺序是先静态对象,而后是非静态对象。
现在来看一下静态代码块。
当首次生成Cups的对象时候,或者首次访问属于Cups的静态数据时,会执行代码块进行初始化。
非静态代码块:
对于非静态代码块,每次调用构造器时都会执行一次初始化。