资讯专栏INFORMATION COLUMN

构造方法详解

CocoaChina / 2464人阅读

摘要:而方法又分为了普通方法和构造方法。构造方法是在实例化对象的时候使用,主要功能是完成对象的属性初始化功能。构造方法的定义要求构造方法的名称要和类名一致。构造方法不允许有返回值类型声明。顺带一提,重载构造方法是最好按照参数由少到多规范排列。

文章目录:

何为构造方法?构造方法的作用?

构造方法的定义要求

构造方法的重载及重载作用

构造方法的特殊应用:匿名对象

构造方法与this关键字

构造方法与super关键字


何为构造方法?构造方法的作用?

类中存在属性与方法。而方法又分为了普通方法和构造方法。

构造方法是在实例化对象的时候使用,主要功能是完成对象的属性初始化功能。而普通方法则是在实例化对象后使用。

构造方法的定义要求

1.构造方法的名称要和类名一致。

2.构造方法不允许有返回值类型声明。

值得注意的是:

1.如果你未定义构造方法,则类会自动生成一个无参无返回值的构造方法,如下图。

2.如果你定义了构造方法,那么类将不会再提供无参的构造方法,这在子类继承方面很容易出错,下面介绍。

构造方法的重载及重载作用

构造方法也是方法,是方法就可以重载。

重载示例如下:

为什么要重载?

重载可以在实例化对象的同时为对象的属性赋值。

顺带一提,重载构造方法是最好按照参数由少到多规范排列。

构造方法的特殊应用:匿名对象

照例由代码来说明。

package test;//定义一个类public class Father {	private String name;	private int age;		//无参构造方法	public Father() {			}		//构造方法重载	public Father(String name) {		this.name = name;	}		//构造方法重载	public Father(String name,int age) {		this.name = name;		this.age = age;	}		//setter、getter方法略		//定义一个普通方法	public void tell() {		System.out.println("姓名:" + this.name + ",年龄" + this.age);	}}
package test;//主方法演示public class JavaDemo {	public static void main(String[] args) {				//存在栈内存引用指向的对象		Father firstFather = new Father("张三",18);		firstFather.tell();				//匿名对象		new Father("李四",19).tell();	}}

如代码所示,普通对象与匿名对象都使用了new关键字在堆内存中开辟了一块空间,但是匿名对象没有栈内存引用指向,所以只能使用这一次,并且使用完了后其堆内存空间成了垃圾空间,等待回收。

构造方法与this关键字

在当前类的构造方法中可以使用this()来调用本类中的其他构造方法也可以用this.方法()来调用本类中的普通方法,就像下图这样。

package test;public class Father {	private String name;	private int age;		public Father() {			}		public Father(String name) {		this();                            //看这里        this.name = name;	}	public Father(String name,int age) {		this(name);                        //还有这里		this.age = age;	}		//setter、getter方法略	public void tell() {		System.out.println("姓名:" + this.name + ",年龄" + this.age);	}}

为什么要使用this()来调用其他构造函数?

主要目的是提升构造方法中执行代码的可重用性。没错,就是懒,你要是想自己再写一遍也可以。

值得注意的是:

1.在使用this()时一定要放在方法的首句。

2.本类中未规定一定要使用this()调用其他构造函数。【为什么要专门提这一句,请对比下面的super()】

构造方法与super关键字

观察以下代码,看看有意思的地方。




我调用子类的构造方法来实例化一个儿子,但是父类的构造方法也被调用了!

什么意思呢?就是说子类对象实例化前一定会实例化父类对象,实际上就相当于子类的构造方法中都隐藏着一句super(),当然它也一定要在方法中的第一句(系统偷偷放的)。

所以重点来了!怎么解决这个问题?

1.父类中放一个无参的构造方法(结合上文所学,如果你自己写了有参的构造方法,一定别忘了留一个无参的构造方法。)。

2.如果父类中没有无参的构造方法,那么就咱们就主动点,自己把super()写了,按照你定义的构造方法来写,如super(参数...)。

3.用魔法来打败魔法,我们把第一行给占了,写上this()。但是实际上只不过是把矛盾转移了,本类中的其他构造方法还是得调用父类构造方法。所以啊,至少要保留一个构造方法作为出口,而这个出口一定要去调用父类构造方法。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/119644.html

相关文章

  • PHP之十六个魔术方法详解

    摘要:前言中把以两个下划线开头的方法称为魔术方法,这些方法在中充当了举足轻重的作用。析构方法的声明格式方法体注意析构函数不能带有任何参数。那么为了解决这个问题,我们可以使用魔术方法。如果该方法未返回任何内容,则被序列化,并产生一个级别的错误。 前言 PHP中把以两个下划线__开头的方法称为魔术方法(Magic methods),这些方法在PHP中充当了举足轻重的作用。 魔术方法包括: __...

    songze 评论0 收藏0
  • 详解js面向对象编程

    摘要:看下面一个例子优点使用构造器函数的好处在于,它可以在创建对象时接收一些参数。按照惯例,构造函数的函数名应始终以一个大写字母开头,以区分普通函数。返回该对象的源代码。使您有能力向对象添加属性和方法。 基本概念 ECMA关于对象的定义是:无序属性的集合,其属性可以包含基本值、对象或者函数。对象的每个属性或方法都有一个名字,而每个名字都映射到一个值。 类 在现实生活中,相似的对象之间往往都有...

    lolomaco 评论0 收藏0
  • JavaScript 中 this 的详解

    摘要:作为构造函数调用中没有类,但是可以从构造器中创建对象,并提供了运算符来进行调用该构造器。构造器的外表跟普通函数一样,大部分的函数都可以当做构造器使用。如果构造函数显式的返回一个对象,那么则会指向该对象。 this 的指向 this 是 js 中定义的关键字,它自动定义于每一个函数域内,但是它的指向却让人很迷惑。在实际应用中,this 的指向大致可以分为以下四种情况。 1.作为普通函数调...

    cyrils 评论0 收藏0
  • javaScript原型及原型链详解(二)

    摘要:当然这还没完,因为我们还有重要的一步没完成,没错就是上面的第行代码,如果没有这行代码实例中的指针是指向构造函数的,这样显然是不对的,因为正常情况下应该指向它的构造函数,因此我们需要手动更改使重新指向对象。 第一节内容:javaScript原型及原型链详解(二) 第一节中我们介绍了javascript中的原型和原型链,这一节我们来讲利用原型和原型链我们可以做些什么。 普通对象的继承 ...

    widuu 评论0 收藏0
  • (详解)你应该知道的new操作符

    摘要:使用指定的参数调用构造函数,并将绑定到新创建的对象。等同于,也就是没有指定参数列表,不带任何参数调用的情况。由构造函数返回的对象就是表达式的结果。 new 作为大家天天使用的操作符,想必大家都不陌生 创建一个对象的通用语法 let obj = new Object(); 那么在创建对象的过程中,new 到底做了什么? MDN 当代码 new Foo(...) 执行时,会发生以下事情:(...

    y1chuan 评论0 收藏0

发表评论

0条评论

CocoaChina

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<