a.使用new关键字产生对象会调用构造方法_Java构造方法(零基础学习)

一个新对象初始化的最终步骤是通过new关键字去调用对象的构造方法,构造方法必须满足以下几个条件

方法

(1)方法名必须与类名称完全相匹配

(2)不要声明返回类型。

(3)不能被static final synchronized abstract native 修饰,且不能被return语句返回值

创建某类的对象要遵循如下语法:

类名 对象名=new 类名();

使用new关键字创建对象时要注意以下3个方面:

为对象实例分配内存空间

调用构造

返回对象实例的引用

当一个对象被创建时,会对其中各种类型的成员变量自动进行初始化赋值。除了基本数据类型之外,其余的变量类型都是引用类

创建对象在内存中的情况如图5.16所示

图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); }

输出结果

可以为自定义的类添加多个构造方法,比如在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);
一个新对象初始化的最终步骤是通过new关键字去调用对象的构造方法,构造方法必须满足以下几个条件 方法 (1)方法名必须与类名称完全相匹配 (2)不要声明返回类型。 (3)不能被static final synchronized abstract native 修饰,且不能被return语句返回值 创建某类的对象要遵循如下语法: 类名 对象名=new 类名(); 使用new关键字创建对象时要注意以下3个方面: 为对象实例分配内存空间 调用构造 返回对象实例的引用 当一个对象被创建时,会对其中各种类型的成员变量自动进行初始化赋值。除了基本数据类型之外,其余的变量类型都是引用类 创建对象在内存中的情况如图5.16所示 图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); } 输出结果 可以为自定义的类添加多个构造方法,比如在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);
经验分享 程序员 微信小程序 职场和发展