一个新对象初始化的最终步骤是通过 new 关键字去调用对象的构造方法, 构造方法必须满足以下几个条件
方法
(1)方法名必须与类名称完全相匹配
(2)不要声明返回类型.
(3)不能被 static final synchronized abstract native 修饰, 且不能被 return 语句返回值
创建某类的对象要遵循如下语法:
类名 对象名 = new 类名();
使用 new 关键字创建对象时要注意以下 3 个方面:
为对象实例分配内存空间
调用构造
返回对象实例的引用
当一个对象被创建时, 会对其中各种类型的成员变量自动进行初始化赋值. 除了基本数据类型之外, 其余的变量类型都是引用类
创建对象在内存中的情况如图 5.16 所示
image.PNG
图 5.16 对象内存位置
Java 中, 所有对象的存储空间都是在堆中分配的, 但是这个对象的引用却是在栈中
分配. 也就是说, 在建立一个对象时, 从两个地方都分配内存: 在堆中分配的内存实际矩
立这个对象, 而在堆栈中分配的内存只是一个指向这个堆对象的指针 (引用) 而已
注意
构造方法和方法的类似之处在于它们都包含可执行代码. 然而, 它们的区别在于, 只
有当 JVM 实现在创建类的实例时才执行构造方法. 构造方法通常包含字段初始化代码. 严格来讲, 构造方法并不是方法, 因为它不会返回任何值
根据参数不同, 构造方法又可以分为以下 3 类.
1. 隐式无参构造方法(默认构造方法)
在定义类的时候, 如果没有给类定义一个构造方法, Java 编译器在编译时会默认提供
个隐式的构造方法, 它没有任何参数, 并且有一个空主体.
例如, Person 类中隐含一个无参构造方法, 在
main 方法中可以通过 new 关键字来调用此默认的构造方法, 代码如下:
- public class test5 {
- private String name;
- private boolean sex;
- private int age;
- public void speak(String Word){
- System.out.println(name+"shuo"+Word);
- }
- public void tread(){
- System.out.println("zou");
- }
- public static void main(String[] args) {
- Persion perison=new Persion();// 调用系统提供的一个隐式无参构造方法
- perison.tread();
- }
2. 显式无参构造方法
因为隐式无参构造方法的方法体为空, 而我们有时候需要在调用这个构造方法时输出
一些内容或执行一些操作, 要实现这个需求, 就需要为它定义一个显式无参构造方法. 我
们为 Persion 类添加一个显式的无参构造方法, 修改后的代码如下:
- public Person(){
- (// 显式定义一个无参的构造方法
- system.out.println("我是显式的无参构造方法")
- }
3 显式有参构造方法
构造并初始化对象是构造方法的作用, 所以有时需要给这个方法指定一些参数, 定义一
个显式的有参构造方法, 例如:
public Persion(int age){....}
下面为 Person 类中添加一个有 3 个参数的显式构造方法, 修改后的代码如下:
- public test5(String n,boolean b,int a){// 参数构造方你发
- name=n;
- sex=b;
- age=a;
- }
- //.. 省略 speak 和 tread 方法
- public static void main(String[] args) {
- test5 aa=new test5("这" ,
- true ,
- 18);
- System.out.println(aa.age);
- }
输出结果
image.PNG
可以为自定义的类添加多个构造方法, 比如在 Test1 类中定义一个显式无参构造方法和一个显式有参构造方法, 代码如下
- public class test5 {
- public test5(){};
- public test5(int i){};
注意
如果类中有一个自己编写的构造方法时, 编译器就不会再提供那个默认的构造方法来创建类的实例时, 就必须在类中明确添加这个默认
译报错
如果显式定义了一个有参的构造方法, 系统就不能调用无参的构造方法, 如果通过 new 关键字来调用无参的构造方法就会出错, 将 Person 的代码进行如下修改:
- private String name;
- private boolean sex;
- private int age;
- //.. 省略 name.sex 和 age 属性
- public test5(String n,boolean b,int a){// 参数构造方你发
- name=n;
- sex=b;
- age=a;
- }
- //.. 省略 speak 和 tread 方法
- public static void main(String[] args) {
- test5 aa=new test5();
- System.out.println(aa.age);
来源: http://www.jianshu.com/p/3b52bc8bb176