Java构造函数的深入理解

我们人出生的时候,有些人一出生之后再起名字的,但是有些人一旦出生就已经起好名字的。那么我们在 java 里面怎么在对象一旦创建就赋值呢?

public class Person {String name; //    姓名int age; //    年龄public static void main(String[] args) {Person p = new Person(); //    创建了Person类型的p对象System.out.println("姓名: " + p.name + " 年龄: " + p.age); //    name = null, age = 0;//这个小孩刚出生的时候没有姓名和年龄}

 

public class Person {String name; //    姓名int age; //    年龄//    构造方法Person(String name,int age){this.name = name; //     给对象赋予name值this.age = age; //    给对象赋予age值
    }public static void main(String[] args) {Person p = new Person("张三",1); //    创建了Person类型的p对象,并且调用构造方法赋予该对象属性值System.out.println("姓名: " + p.name + " 年龄: " + p.age); //    name = 张三, age = 1;//这个小孩刚出生的时候已经有了姓名和年龄}

 

1. 构造方法的作用:

构造方法作用:

1).创建对象,凡是必须和new一起使用.

2).对对象进行初始化.

public class Person {String name; //    姓名int age; //    年龄//    全参构造方法Person(String name,int age){this.name = name; //     给对象赋予name值this.age = age; //    给对象赋予age值
    }//    无参构造方法
    Person(){}public static void main(String[] args) {Person p = new Person("张三",1); /*根据创建对象的实参个数,jvm回去寻找合适的构造方法,两个实参所有会调用含有两个参数的构造方法.Person(String name,int age)*/System.out.println("姓名: " + p.name + " 年龄: " + p.age); //    name = 张三, age = 1;//这个对象创建出来的时候已经有了自己的姓名和年龄}

 

2. 构造函数与普通函数的区别:

 

(1). 一般函数是用于定义对象应该具备的功能。而构造函数定义的是,对象在调用功能之前,在建立时,应该具备的一些内容。也就是对象的初始化内容。

(2). 构造函数是在对象建立时由 jvm 调用, 给对象初始化。一般函数是对象建立后,当对象调用该功能时才会执行。

(3). 普通函数可以使用对象多次调用,构造函数就在创建对象时调用。

(4). 构造函数的函数名要与类名一样,而普通的函数只要符合标识符的命名规则即可。

(5). 构造函数没有返回值类型。

 

3. 构造函数要注意的细节:

(1). 当类中没有定义构造函数时,系统会指定给该类加上一个空参数的构造函数。这个是类中默认的构造函数。当类中如果自定义了构造函数,这时默认的构造函数就没有了。

备注:可以通过 javap 命令验证。

(2). 在一个类中可以定义多个构造函数,以进行不同的初始化。多个构造函数存在于类中,是以重载的形式体现的。因为构造函数的名称都相同。

class Perosn{private int id;private String name;private int age;public Perosn(){cry();}public Perosn(int id, String name, int age) {this.id = id;this.name = name;this.age = age;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public void cry(){System.out.println("哇哇哇....");}}

问题:要求每个小孩出生都会哭,这份代码有两个构造函数,如果需要每个小孩出生都要哭的话,那么就需要在不同的构造函数中都调用 cry() 函数,但是这样子的话造成了代码重复问题,那么怎么解决呢?构造代码块。

4. 构造代码块:

构造代码块作用:给所有的对象进行统一的初始化。

class Perosn{private int id;private String name;private int age;{cry();// 每个Person对象创建出来都会执行这里的代码
    }public Perosn(){cry();}public Perosn(int id, String name, int age) {this.id = id;this.name = name;this.age = age;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public void cry(){System.out.println("哇哇哇....");}}

具体作用:

  1:给对象进行初始化。对象一建立就运行并且优先于构造函数。

  2:与构造函数区别

    1:构造代码块和构造函数的区别,构造代码块是给所有对象进行统一初始化, 构造函数给对应的对象初始化。

    2:构造代码块的作用:它的作用就是将所有构造方法中公共的信息进行抽取。

例如孩子一出生统一哭

代码如下:

class Boy {String name;int age;String gender;// 构造代码块,给所有对象进行初始化。
    {System.out.println("哭。。。");}Boy() {System.out.println("无参构造");}Boy(String n, int a, String g) {name = n;age = a;gender = g;System.out.println("有参构造");}void run() {System.out.println("跑...");}}class Demo9 {public static void main(String[] args) {System.out.println();Boy b = new Boy();Boy b2 = new Boy("jack", 1, "男");}
}

 

转载于:https://www.cnblogs.com/huxins/p/9017212.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/389689.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

1967. 作为子字符串出现在单词中的字符串数目

1967. 作为子字符串出现在单词中的字符串数目 给你一个字符串数组 patterns 和一个字符串 word ,统计 patterns 中有多少个字符串是 word 的子字符串。返回字符串数目。 子字符串 是字符串中的一个连续字符序列。 示例 1:输入:patterns [&…

判断IE版本与各浏览器的语句

---恢复内容开始--- 一.IE下判断IE版本的语句 <!--[if lte IE 6]><![endif]-->IE6及其以下版本可见<!--[if lte IE 7]><![endif]-->IE7及其以下版本可见<!--[if IE 6]><![endif]-->只有IE6版本可见<![if !IE]><![endif]>除了I…

各类软件马斯洛需求层次分析_需求的分析层次

各类软件马斯洛需求层次分析When I joined Square, I was embedded on a product that had been in-market for a year but didn’t have dedicated analytics support.当我加入Square时&#xff0c;我被嵌入了已经上市一年但没有专门的分析支持的产品。 As you might expect,…

384. 打乱数组

384. 打乱数组 给你一个整数数组 nums &#xff0c;设计算法来打乱一个没有重复元素的数组。 实现 Solution class: Solution(int[] nums) 使用整数数组 nums 初始化对象int[] reset() 重设数组到它的初始状态并返回int[] shuffle() 返回数组随机打乱后的结果 示例&#xf…

HTTP/2 学习笔记

创建连接TCP三次握手:包括客户端想服务端发起一个SYN包,接着服务端返回对应SYN的ACK响应以及新的SYN包,然后客户端返回对应的ACK.如果客户端发起HTTPS连接,它还需要进行传输层安全协议(TLS)协商;TLS用来取代安全套接层.HTTP1的问题1.队头阻塞:允许一次发送一组请求,但是只能按照…

MySQL的变量分类总结

在MySQL中&#xff0c;my.cnf是参数文件&#xff08;Option Files&#xff09;&#xff0c;类似于ORACLE数据库中的spfile、pfile参数文件&#xff0c;照理说&#xff0c;参数文件my.cnf中的都是系统参数&#xff08;这种称呼比较符合思维习惯&#xff09;&#xff0c;但是官方…

859. 亲密字符串

859. 亲密字符串 给你两个字符串 s 和 goal &#xff0c;只要我们可以通过交换 s 中的两个字母得到与 goal 相等的结果&#xff0c;就返回 true &#xff1b;否则返回 false 。 交换字母的定义是&#xff1a;取两个下标 i 和 j &#xff08;下标从 0 开始&#xff09;且满足 …

python函数不同类型参数顺序

python函数的参数定义顺序必须为&#xff1a; 必须参数&#xff08;位置参数&#xff09;&#xff0c;默认参数&#xff0c;可变参数&#xff0c;命名关键字参数&#xff0c;关键字参数 如以下定义&#xff1a; def f1(a, b, c0, *args, d, **kw): print(a , a, b , b, c , c, …

亚洲国家互联网渗透率_发展中亚洲国家如何回应covid 19

亚洲国家互联网渗透率The COVID-19 pandemic has severely hit various economies across the world, with global impact estimated between USD 6.1 trillion and USD 9.1 trillion, equivalent to a loss of 7.1% to 10.5% of global gross domestic product (GDP).[1] More…

create-react-app项目使用假数据

做新项目的时候&#xff0c;前端每次要等后端接口准备好再开始&#xff0c;就会延期&#xff0c;等后端接口准备好了&#xff0c;前端这边的项目又会相互紧张&#xff0c;如果前端跟后端同时进行&#xff0c;前期将框架&#xff0c;基础做好&#xff0c;定好接口文档&#xff0…

1854. 人口最多的年份

1854. 人口最多的年份 给你一个二维整数数组 logs &#xff0c;其中每个 logs[i] [birthi, deathi] 表示第 i 个人的出生和死亡年份。 年份 x 的 人口 定义为这一年期间活着的人的数目。第 i 个人被计入年份 x 的人口需要满足&#xff1a;x 在闭区间 [birthi, deathi - 1] 内…

snake4444勒索病毒成功处理教程方法工具达康解密金蝶/用友数据库sql后缀snake4444...

*snake4444勒索病毒成功处理教程方法 案例&#xff1a;笔者负责一个政务系统的第三方公司的运维&#xff0c;上班后发现服务器的所有文件都打不开了&#xff0c;而且每个文件后面都有一个snake4444的后缀&#xff0c;通过网络我了解到这是一种勒索病毒。因为各个文件不能正常打…

有史以来最漂亮的游戏机

The recent reveal of the PlayStation 5’s design has divided the gaming world. There are those who appreciate its bold, daring industrial design and those who would have preferred something a little less outlandish; perhaps a little more traditional.吨 他最…

springboot-添加拦截器

在我们日常开发的过程中&#xff0c;经常会遇到这一类问题&#xff0c;要求需要用户登录以后才能够访问其他的内容&#xff0c;否则不行&#xff0c;那么解决这一问题最好的办法就是运用拦截器&#xff0c;拦截器可以和多种处理请求的web框架结合&#xff0c;今天所讲的就是与s…

1945. 字符串转化后的各位数字之和

1945. 字符串转化后的各位数字之和 给你一个由小写字母组成的字符串 s &#xff0c;以及一个整数 k 。 首先&#xff0c;用字母在字母表中的位置替换该字母&#xff0c;将 s 转化 为一个整数&#xff08;也就是&#xff0c;‘a’ 用 1 替换&#xff0c;‘b’ 用 2 替换&#…

墨刀原型制作 位置选择_原型制作不再是可选的

墨刀原型制作 位置选择The ‘role’ of a designer has been a topic of discussion several many years now. In the past decade, the role of a Designer got split into several different roles like — Graphic Designer, User Experience Designer, Interaction Designe…

eclipse maven 构建简单springmvc项目

环境&#xff1a;eclipse Version: Oxygen.3a Release (4.7.3a) 创建maven Project项目&#xff0c;目录结构 修改工程的相关编译属性 修改pop.xml&#xff0c;引入springmvc相关包 <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.…

1859. 将句子排序

1859. 将句子排序 一个 句子 指的是一个序列的单词用单个空格连接起来&#xff0c;且开头和结尾没有任何空格。每个单词都只包含小写或大写英文字母。 我们可以给一个句子添加 从 1 开始的单词位置索引 &#xff0c;并且将句子中所有单词 打乱顺序 。 比方说&#xff0c;句子…

医动力Android基于CC组件化框架的探索与实践

为什么要组件化? 医动力App作为公司的核心产品已经有多年历史了,随着版本的不断迭代,功能越来越多,代码量越来越大,不可避免的会产生一下问题: 业务越来越复杂&#xff0c;维护成本高;业务耦合度高&#xff0c;代码越来越臃肿&#xff0c;团队内部多人协作开发困难;编译时间长…

使用协同过滤推荐电影

ALSO, ARE RECOMMENDER SYSTEMS INFLUENCING OUR TASTE??此外&#xff0c;推荐系统是否影响我们的口味&#xff1f; An excerpt on creating a movie recommender system similar to the OTT platforms.有关创建类似于OTT平台的电影推荐系统的摘录。 INTRODUCTION介绍 For…