牛客网Java刷题知识点之构造函数是什么、一般函数和构造函数什么区别呢、构造函数的重载、构造函数的内存图解
不多说,直接上干货!
构造函数是什么?
构建创造对象时调用的函数。
构造函数是一种特殊的函数,用来在对象实例化时初始化对象的成员变量。
注意:
创建对象都必须要通过构造函数初始化。
构造函数的特点
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("小强",);
p2.speak();
}
}
class Person{
private String name;
private int age;
//定义一个Person类的构造函数。
Person(){//构造函数,而且是空参数的。
name = "baby";
age = ;
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方法出栈,程序运行结束。
我们在上面通过对一个简单的对象创建过程进行了分析,简单的学习了构造函数在内存中的加载和运行过程,这里也就是突出了对象的初始化,如果类中没有定义构造函数,那么我们在创建对象时会调用默认的构造函数,而当我们定义了构造函数,则会通过参数类型选择不同的构造函数进行对象的初始化,而且我们知道对象都必须被初始化,初始化就会调用相应的构造函数,所以说,构造函数是必须会进栈内存的。
牛客网Java刷题知识点之构造函数是什么、一般函数和构造函数什么区别呢、构造函数的重载、构造函数的内存图解的更多相关文章
- 牛客网Java刷题知识点之TCP、UDP、TCP和UDP的区别、socket、TCP编程的客户端一般步骤、TCP编程的服务器端一般步骤、UDP编程的客户端一般步骤、UDP编程的服务器端一般步骤
福利 => 每天都推送 欢迎大家,关注微信扫码并加入我的4个微信公众号: 大数据躺过的坑 Java从入门到架构师 人工智能躺过的坑 Java全栈大联盟 ...
- 牛客网Java刷题知识点之UDP协议是否支持HTTP和HTTPS协议?为什么?TCP协议支持吗?
不多说,直接上干货! 福利 => 每天都推送 欢迎大家,关注微信扫码并加入我的4个微信公众号: 大数据躺过的坑 Java从入门到架构师 人工智能躺过的坑 ...
- 牛客网Java刷题知识点之为什么HashMap和HashSet区别
不多说,直接上干货! HashMap 和 HashSet的区别是Java面试中最常被问到的问题.如果没有涉及到Collection框架以及多线程的面试,可以说是不完整.而Collection框架的 ...
- 牛客网Java刷题知识点之为什么HashMap不支持线程的同步,不是线程安全的?如何实现HashMap的同步?
不多说,直接上干货! 这篇我是从整体出发去写的. 牛客网Java刷题知识点之Java 集合框架的构成.集合框架中的迭代器Iterator.集合框架中的集合接口Collection(List和Set). ...
- 牛客网Java刷题知识点之Map的两种取值方式keySet和entrySet、HashMap 、Hashtable、TreeMap、LinkedHashMap、ConcurrentHashMap 、WeakHashMap
不多说,直接上干货! 这篇我是从整体出发去写的. 牛客网Java刷题知识点之Java 集合框架的构成.集合框架中的迭代器Iterator.集合框架中的集合接口Collection(List和Set). ...
- 牛客网Java刷题知识点之ArrayList 、LinkedList 、Vector 的底层实现和区别
不多说,直接上干货! 这篇我是从整体出发去写的. 牛客网Java刷题知识点之Java 集合框架的构成.集合框架中的迭代器Iterator.集合框架中的集合接口Collection(List和Set). ...
- 牛客网Java刷题知识点之垃圾回收算法过程、哪些内存需要回收、被标记需要清除对象的自我救赎、对象将根据存活的时间被分为:年轻代、年老代(Old Generation)、永久代、垃圾回收器的分类
不多说,直接上干货! 首先,大家要搞清楚,java里的内存是怎么分配的.详细见 牛客网Java刷题知识点之内存的划分(寄存器.本地方法区.方法区.栈内存和堆内存) 哪些内存需要回收 其实,一般是对堆内 ...
- 牛客网Java刷题知识点之HashMap的实现原理、HashMap的存储结构、HashMap在JDK1.6、JDK1.7、JDK1.8之间的差异以及带来的性能影响
不多说,直接上干货! 福利 => 每天都推送 欢迎大家,关注微信扫码并加入我的4个微信公众号: 大数据躺过的坑 Java从入门到架构师 人工智能躺过的坑 ...
- 牛客网Java刷题知识点之Java 集合框架的构成、集合框架中的迭代器Iterator、集合框架中的集合接口Collection(List和Set)、集合框架中的Map集合
不多说,直接上干货! 集合框架中包含了大量集合接口.这些接口的实现类和操作它们的算法. 集合容器因为内部的数据结构不同,有多种具体容器. 不断的向上抽取,就形成了集合框架. Map是一次添加一对元素. ...
- 牛客网Java刷题知识点之泛型概念的提出、什么是泛型、泛型在集合中的应用、泛型类、泛型方法、泛型接口、泛型限定上限、泛型限定下限、 什么时候使用上限?泛型限定通配符的体现
不多说,直接上干货! 先来看个泛型概念提出的背景的例子. GenericDemo.java package zhouls.bigdata.DataFeatureSelection; import ja ...
随机推荐
- Ubuntu下安装软件
在ubuntu当中,安装应用程序有三种方法,分别是:apt-get,dpkg安装deb和make install安装源码包三种. apt-get方法 使用apt-get install来安装应用程序算 ...
- hdu 1506 单调栈问题
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1506 题目的意思其实就是要找到一个尽可能大的矩形来完全覆盖这个矩形下的所有柱子,只能覆盖柱子,不能留空 ...
- 线程中t.setdaemon(), t.jion(), t.start的使用
import threading import time def f0(): pass def f1(a1,a2): time.sleep(10) f0() ") t1 = threadin ...
- 实现Unity对Dictionary的序列化
若有尝试过想在unity的inspector检视面板中像List或者数组那样可以编辑Dictionary变量的童鞋应该知道,Dictionary变量不会出现在inspector中,unity并不会直接 ...
- Centos6.8下yum安装python2.7
下载 ius-release.rpm包 wget https://centos6.iuscommunity.org/ius-release.rpm 安装ius-release.rpm包 rpm -Uv ...
- 使用IDEA编译netty4
本来计划一天一篇博文的,结果周末加班加的不亦乐乎,对整个项目重构添加国际化的功能,不停的使用native2ascii工具 使用IDEA编译原有的netty4要报错,我修改了下pom.xml,编译成功了 ...
- 【Qt官方例程学习笔记】Address Book Example(代理模型)
地址簿示例展示了如何使用代理模型在单个模型的数据上显示不同的视图. 本例提供了一个地址簿,允许按字母顺序将联系人分组为9组:ABC.DEF.GHI.…,VW,…XYZ.这是通过在同一个模型上使用多个视 ...
- 【TMF eTOM】eTOM的概念和术语
eTOM的概念 为了有效地理解和使用eTOM业务流程框架,我们首先要理解构成eTOM的关键概念.这些概念使eTOM成为集成业务流程设计/评估与传统过程的一个非常有效的工具.在这些概念中使用了在本文中详 ...
- 用js正则判断输入的两位字符,第一位是数字16进制的,第二位是I、O、Q、U除外的字母(A到Z)
项目中遇到客户的需求变化,要验证某个数据的正确性,判断输入的两位字符,第一位是数字16进制的,第二位是I.O.Q.U除外的字母(A到Z). 本来对js不熟练,网上参考了一下js正则验证的规则,使用正则 ...
- 洛谷P5048 [Ynoi2019模拟赛]Yuno loves sqrt technology III(分块)
传送门 众所周知lxl是个毒瘤,Ynoi道道都是神仙题 用蒲公英那个分块的方法做结果两天没卡过去→_→ 首先我们分块,预处理块与块之间的答案,然后每次询问的时候拆成整块和两边剩下的元素 整块的答案很简 ...