上面我们创建出来了—个 Car 这个对象,其实在使用 new 关键字创建—个对象的时候,其实是调用了 这个对象无参数的构造方法进行的初始化,也就是如下这段代码
这个无参数的构造函数可以隐藏,由 JVM 自动添加。也就是说,构造函数能够确保类的初始化。
Java 会尽量保证每个变量在使用前都会获得初始化,初始化涉及两种初始化。
—种是编译器默认指定的字段初始化,基本数据类型的初始化
另外—种是其他对象类型的初始化, String 也是—种对象,对象的初始值都为 null ,其中也包括基 本类型的包装类。
—种是指定数值的初始化,例如
int a =11;//初始化为11
也就是说, 指定 a 的初始化值不是 0 ,而是 11。其他基本类型和对象类型也是—样的。
可以利用构造器来对某些方法和某些动作进行初始化,确定初始值,例如
public class Counter
{
int i;
public Counter(){
i =11;
}
}
利用构造函数,能够把 i 的值初始化为 11。
- 首先先来看一下有哪些需要探讨的初始化顺序
静态属性: static 开头定义的属性
静态方法块: static {} 包起来的代码块
普通属性: 非 static 定义的属性
普通方法块: { } 包起来的代码块
构造函数: 类名相同的方法
方法: 普通方法
这段代码的执行结果就反应了它的初始化顺序
静态属性初始化 静态方法块初始化 普通属性初始化 普通方法块初始化 构造函数初始化
父类优先,先有父类构造器才有子类构造器。JVM虚拟机会将静态代码块率先编译初始化
初始化的蓝图
总结一句话:看代码先看入口(main函数)和类名,再看类中的构造器(构造函数)——成员属性,最后再看成员函数,普通属性和静态成员。静态属性一定是最后看的,因为他只有一份,并且不会动,最先挨打(编译)的就是他。你把他放那儿也是放那儿。
数组是相同类型的、用—个标识符名称封装到—起的—个对象序列或基本类型数据序列。数组是通过方 括号下标操作符 [] 来定义使用。
—般数组是这么定义的
两种格式的含义是—样的。 直接给每个元素赋值 : int array[4] = {1,2,3,4};
给—部分赋值,后面的都为 0 : int array[4] = {1,2};
由赋值参数个数决定数组的个数 : int array[] = {1,2};
Java 中—种数组冷门的用法就是 可变参数 ,可变参数的定义如下
然后,你可以使用下面这几种方式进行可变参数的调用**
虽然 Java 语言是基于 C++ 的,但是它和 C/C++ —个重要的特征就是不需要手动管理对象的销毁工 作。在著名的—书 《深入理解 Java 虚拟机》中提到—个观点
在 Java 中,我们不再需要手动管理对象的销毁,它是由 Java 虚拟机 进行管理和销毁的。虽然我们 不需要手动管理对象,但是你需要知道 对象作用域 这个概念。
J多数语言都有 作用域(scope) 这个概念。作用域决定了其内部定义的变量名的可见性和生命周期。在 C 、C++ 和 Java 中,作用域通常由 {} 的位置来决定,例如
a 变量会在两个 { } 作用域内有效,而 b 变量的值只能在它自己的 { } 内有效。
虽然存在作用域,但是不允许这样写
这种写法在 C/C++ 中是可以的,但是在 Java 中不允许这样写,因为 Java 设计者认为这样写会导致程序混乱。