- 用构造器确保初始化
- 在Java中,通过提供构造器,类的设计者可确保每个对象都会得到初始化
-
构造器采用与类相同的名称
- new Rock();做了两个动作:
- 给对象分配存储空间
- 调用构造器,完成对象的初始化
- “每个方法首字母小写”的编码风格并不适用于构造器
- 默认构造器:指不接受任何参数的构造器
-
构造器可以带有形式参数,以便指定如何创建对象
- 在Java中,“初始化”和“创建”捆绑在一起,两者不能分离
- 构造器是一种特殊类型的方法,它没有返回值
- 为了让方法名相同而形式参数不同的构造器同时存在,必须用到方法重载
- 每个重载的方法都必须有一个独一无二的参数类型列表,甚至参数顺序的不同也足以区分两个方法(不推荐)
- 若传入的数据类型(实际参数类型)小于方法中声明的形式参数类型,实际数据类型会被提升
- 若无法找到恰好接受char参数的方法,则会把char直接提升到int
- 若传入的数据类型(实际参数类型)大于方法中声明的形式参数类型,则必须做窄化转换,否则会编译器报错
- 无法根据方法的返回值来识别该调用的方法
void f(){}
int f(){ return 1;}
f();//无法识别
- 默认构造器(即无参构造器)是没有形式参数的,作用:创建一个“默认对象”
- 若类中没有构造器,则编译器会自动帮你创建一个默认构造器
- 如果已经定义了一个构造器(无论是否有参数),编译器就不会再自动创建默认构造器
- 编译器会暗自把“所操作对象的引用”作为第一个参数传递给成员方法
Banana a = new Banana();
a.peel(1); 等价于 Banana.peel(a,1);
- this只能在方法内部使用,表示对“调用方法的那个对象”的引用
- this用于返回当前对象的引用,对于将当前对象传递给其他方法也很有用
-
this可以用于在构造器中调用构造器
- this调用构造器时,必须置于最起始处,否则编译器会报错
- 除构造器之外,编译器禁止在其他任何方法中调用构造器
- static方法就是没有this的方法
- 在static方法的内部不能调用非静态方法,反过来可以
- 在没有任何对象创建的前提下,可通过类本身来调用static方法
- 垃圾回收器只知道释放那些由new分配的内存;对于像c语言malloc分配的内存无法自动释放,需要借助finalize方法
- 无论是“垃圾回收”还是“终结”,都不保证一定会发生
- 如果JVM未面临内存耗尽的情形,则不会浪费时间去执行垃圾回收以恢复内存
- System.gc()用于强制进行终结动作
- finalize可以用于终结条件的校验
- 垃圾回收器对于提高对象的创建速度,具有明显的效果=》堆指针+垃圾回收器重新排列
- Java尽力保证:所有的变量在使用前都能得到恰当的初始化
-
对于方法的局部变量,以编译错误来提醒
- 类的每个基本数据类型成员保证都会有个初始值;而对于对象的引用,将会获得一个特殊值null
- 可以在定于类成员变量的地方为其赋值做初始化;包括:直接赋值、调用方法,但要注意初始化的顺序
- 可以用构造器来进行初始化
- 无法阻止自动初始化的进行,都是在构造器被调用前发生的
- 在类的内部,变量定义的先后顺序决定了初始化的顺序;即使变量定义散布于方法定义之间,仍旧会在任何方法(包括构造器)被调用之前得到初始化
- 无论创建多少个对象,静态数据都只占一份存储区域
-
static不能用于局部变量,只能作用于域
- 静态初始化只有在必要时刻才会进行:类的对象被创建 或 第一次访问静态数据
- 静态对象只会被初始化一次
- 初始化顺序:先静态对象,而后是非静态对象
- 对象的创建过程:
(1) 首次创建类的对象或类的静态方法或静态域首次被访问时,java解释器必须查找类的路径,以定位.class文件
(2) 载入.class,有关静态初始化的所有动作都会被执行
(3) new创建对象时,在堆上为对象分配足够的存储空间
(4) 存储空间被清零,自动将基本类型设置为默认值,引用设置为null
(5) 执行所有出现在字段定义处的初始化动作
(6) 执行构造器 - 允许将多个静态初始化动作组织成一个特殊的“静态子句”(或叫静态块)
-
实例初始化:用来初始化每个对象的非静态变量,在构造器之前调用
- 数组是相同类型的,用一个标识符名称封装在一起的一个对象序列或基本类型数据序列
- 数组通过方括号下标操作符[]来定义和使用
int[] a; 或 int a[];
- 编译器不允许指定数组的大小,拥有的是数组的引用
int[5] a;//错误
- 为了给数组创建相应的存储空间,必须写初始化表达式
int[] a1 = {1,2,3,4,5};
或
int[] a2;
a2 = a1;//赋值的是引用
![](https://img.haomeiwen.com/i2359939/3aabea12783db366.png)
- 所有数组都有一个固有成员length,可以通过它获知数组内包含多少个元素,但不能对其修改
- 数组的下标从0开始,最大下标数length-1;一旦访问下标过界,就会出现运行时错误
- 不能用new来创建单个的基本数据类型,但可以创建数组
- 数组元素中的基本数据类型会自动初始化为空值
- 可以用花括号括起来的列表初始化对象数组
注意:初始化列表的最后一个逗号都是可选的 - 可变参数列表用于参数个数或类型未知的场合
-
通过enum来创建枚举类型,编译器会自动添加一些有用的特性;比如:toString()显示某个enum实例的名字,ordinal()方法表示某个特定enum常量的声明顺序,static values()方法,用来按照enum常量的声明顺序,产生由这些常量值构成的数组
-
enum和switch结合使用,可以通过enum的名字表达出清晰的意图
网友评论