博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
牛客网Java刷题知识点之构造函数是什么、一般函数和构造函数什么区别呢、构造函数的重载、构造函数的内存图解...
阅读量:6557 次
发布时间:2019-06-24

本文共 2545 字,大约阅读时间需要 8 分钟。

 

 

  不多说,直接上干货!

 

 

构造函数是什么?

  构建创造对象时调用的函数。 

  构造函数是一种特殊的函数,用来在对象实例化时初始化对象的成员变量。

注意:

  创建对象都必须要通过构造函数初始化。

 

 

 

构造函数的特点

    1)构造函数必须与类的名字相同,并且不能有返回值(返回值也不能为void)。

  2)每个类可以有多个构造函数。一个类中如果没有定义过构造函数,那么该类中会有一个默认的空参数构造函数。如果在类中定义了指定的构造函数,那么类中的默认构造函数就没有了。

  3)构造函数可以有0个、1个或1个以上的参数。

  4)构造函数总是伴随着new操作一起调用,切不能由程序与的编写者直接调用,必须要由系统调用。构造函数在对象实例化会被自动调用,且只运行一次;而普通的方法是在程序执行到它时被调用,且可以被该对象调用多次。

  5)构造函数的主要作用是完成对象的初始化工作。

  6)构造函数不能被继承,因为构造函数是属于一个类的,每个类都有自己的构造函数,所以构造函数不能被重写,即构造函数不能被继承。如果它想使用父类的构造函数,只能说去调用父类的构造函数,而不能说是去重写父类的构造函数。

   但是,构造函数能够被重载,即使用不同的参数个数或参数类型来定义多个构造函数。

  7)子类可以通过super关键字来显式地调用父类的构造函数。

 

 

 

构造函数的作用

  可以给对象进行初始化。

 

 

 

 

 

 

一般函数和构造函数什么区别呢?

第一个区别:

  构造函数:对象创建时,就会调用与之对应的构造函数,对对象进行初始化。

  一般函数:对象创建后,需要函数功能时,才调用函数。

  这也就是说创建对象时,构造函数一定被调用,而一般函数不一定被调用。

第二个区别:

  构造函数:对象创建时,会调用且只调用一次。

  一般函数:对象创建后,可以被调用多次。

 

 

什么时候定义构造函数呢?

  在描述事物时,该事物一存在就具备的一些内容,这些内容都定义在构造函数中。

  构造函数可以有多个,用于对不同的对象进行针对性的初始化。

  多个构造函数在类中是以重载的形式来体现的。

细节:
  1、构造函数如果完成了set功能。set方法是否需要。
  2、一般函数不能直接调用构造函数。
  3、构造函数如果前面加了void就变成了一般函数。
  4、构造函数中是有return语句的。

 

 

 

 

构造函数的重载

  不同的构造函数,来初始化不同的对象

  在描述事物时,该事物已存在就具备一些内容,这些内容都定义在构造函数中

 

 

 

 

 

构造函数进栈吗?

  答:必须进栈啊,不然怎么给对象初始化啊。

 

 

 

 

构造函数的内存图解(非常重要)

   这里注意,一个是默认初始化,一个是构造函数初始化。

  

 

package zhouls.bigdata.DataFeatureSelection;import java.util.Arrays;public class ConsDemo{    public static void main(String[] args) {        Person p = new Person();//        p.speak();        Person p1 = new Person("旺财");        p1.setName("旺旺");        p1.speak();        Person p2 = new Person("小强",10);        p2.speak();    }} class Person{    private String name;    private int age;    //定义一个Person类的构造函数。    Person(){
//构造函数,而且是空参数的。 name = "baby"; age = 1; System.out.println("person run"); } //如果有的孩子一出生就有名字。 Person(String n){ name = n; } public void setName(String n){ name = n; } Person(String n,int a){ name = n; age = a; } public void speak(){ System.out.println(name+":"+age); }}

 

  对于上面的测试,我们分析它的运行过程:

1、main方法进栈内存,main方法中有一个Person类类型变量p;

2、new创建Person对象,在堆内存中创建空间(假如地址为0x0045),该空间中有两个成员变量name和age;

3、对对象的两个成员变量进行初始化,此时会自动选择调用构造函数Person(String n,int a);

4、构造函数Person(String n,int a)进栈内存,并且有参数n="小强",a=0;

5、然后在堆内存中把参数n和a的数值初始化name和age变量,此时对象的初始化完成;

6、把地址0x0045赋给main方法中的变量p;

7、构造函数Person()出栈,释放参数n和a;

8、执行p.speak()语句,调用Person类中的speak()方法,则speak方法进栈;

9、执行打印语句,跳出speak方法,speak方法出栈;

10、跳出main方法,main方法出栈,程序运行结束。

 

  我们在上面通过对一个简单的对象创建过程进行了分析,简单的学习了构造函数在内存中的加载和运行过程,这里也就是突出了对象的初始化,如果类中没有定义构造函数,那么我们在创建对象时会调用默认的构造函数,而当我们定义了构造函数,则会通过参数类型选择不同的构造函数进行对象的初始化,而且我们知道对象都必须被初始化,初始化就会调用相应的构造函数,所以说,构造函数是必须会进栈内存的

转载地址:http://zaqco.baihongyu.com/

你可能感兴趣的文章
使用迭代器
查看>>
stm32模拟iic——引脚配置、代码
查看>>
027移除元素
查看>>
Linux下清理内存和Cache方法
查看>>
CodeVS 1018 单词接龙(DFS)
查看>>
我的博客园的CSS和html设置
查看>>
android launchmode(四种启动模式)应用场景及实例
查看>>
工作中简单的kettle使用
查看>>
spark shuffle:分区原理及相关的疑问
查看>>
C#匿名委托
查看>>
Laravel5.5 使用第三方Vendor添加注册验证码
查看>>
06- Linux下sublime下载与使用
查看>>
前端文摘:Web 开发模式演变历史和趋势
查看>>
将图片序列转化为视频文件
查看>>
jQuery的文档操作***
查看>>
CODING Pages 服务全面升级,更快更稳更可靠!
查看>>
关于DOM操作的案例
查看>>
js 小数取整,js 小数向上取整,js小数向下取整
查看>>
从头到尾彻底理解KMP
查看>>
mysql 自定义函数与自定义存储过程的调用方法
查看>>