Constructor构造方法

        在我们创建实例时,我们经常需要同时初始化这个实例,例如:

Person ming =new Person();
ming.setName("卫什么");
ming.setAge("18");

          这样需要三行代码,实际上,在我们创建实例时,是通过构造方法来初始化实例的,我们可以自己定义一个构造方法,使在创建Person实例时,一次性传入name和age,完成初始化:

public class Main{    public static void main(String[] args){Person p=new Person("卫什么",18);System.out.println(p.getName());System.out.println(p.getAge());}
}
class Person{private String name;private int age;//构造方法public Person(String name,int age){this.name=name;this.age=age;}public String getName(){return this.name;}public int getAge(){return this.age;}
}

构造方法相比其他方法比较特殊,表现在以下几个方面:

①构造方法的方法名必须和类名相同,但是参数没有限制,可以没有也可以有

②构造方法没有返回值,也不需要void

调用构造方法,必须使用new 关键字

④在类中如果没有定义构造方法,会存一个默认无参的构造方法

默认的构造方法

        任何类都有构造方法,在上一篇文章中,我们并没有为Person类编写构造方法,那为什么我们依然可以调用new Person()呢?是因为如果在一个类中没有定义构造方法,那么编译器会自动生成一个默认的构造方法,他没有参数,也没有执行语句,类似于这样:

class Person{public Person(){}
}

        当我们自定义了一个构造方法后,编译器就不会在生成默认的无参构造方法,例如:

public class Main{    public static void main(String[] args){Person p=new Person();//编译错误}
}
class Person{private String name;private int age;//构造方法public Person(String name,int age){this.name=name;this.age=age;}public String getName(){return this.name;}public int getAge(){return this.age;}
}

此时会发生编译错误,因为没有Person()这个构造方法。

多个构造方法

在一个类中,可以定义多个构造方法,在通过new关键字调用时,编译器会自动通过构造方法的:参数数量、类型、顺序来匹配不同的构造方法,例如:

public class Order_test{public static void main(String [] args){//创建一个订单对象//通过无参构造方法创建Order o1=new Order();o1.setPay(187.9);//保存金额//通过有参构造方法创建Order o2=new Order(157.92);//打印订单System.out.println("订单1:"+o1);System.out.println("订单2:"+o2);}
class Order {//成员变量private String orderNo;private double pay;//无参构造方法public Order(){//获取当前日期String now=LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"));//流水号String trace=UUID.randmUUID().toString.subtring(0,5);//订单编号this.orderNo=now+trace;}//有参构造方法public Order(double pay){//调用无参构造方法,自动生成订单编号//构造方法的调用应当是当前构造方法的第一句this();//存入金额this.pay=pay;}//set和get方法public void setordreNo(String ordreNo) {this.orderNo=ordreNo;}public String getordreNo() {return orderNo;}public double getPay() {return pay;}public void setPay(double pay) {this.pay = pay;}}

此时,运行出的结果为:

         为什么打印出的是订单的地址呢?因为Order对象是我们自己创建的,它没有自己的toString()方法,所以会默认使用父类Object的toString方法,如下:

 所以我们要自己重写toString()方法,使其按照我们想输出的格式输出:

public class Order_test{public static void main(String [] args){//创建一个订单对象//通过无参构造方法创建Order o1=new Order();o1.setPay(187.9);//保存金额//通过有参构造方法创建Order o2=new Order(157.92);//打印订单System.out.println("订单1:"+o1);System.out.println("订单2:"+o2);}
class Order {//成员变量private String orderNo;private double pay;//无参构造方法public Order(){//获取当前日期String now=LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"));//流水号String trace=UUID.randmUUID().toString.subtring(0,5);//订单编号this.orderNo=now+trace;}//有参构造方法public Order(double pay){//调用无参构造方法,自动生成订单编号//构造方法的调用应当是当前构造方法的第一句this();//存入金额this.pay=pay;}//toString()方法public String toString(){return String.format("订单编号:%s,订单金额:%f",this.getOrderNo(),this.getPay());//set和get方法public void setordreNo(String ordreNo) {this.orderNo=ordreNo;}public String getordreNo() {return orderNo;}public double getPay() {return pay;}public void setPay(double pay) {this.pay = pay;}}

输出结果:

 构造代码块

语法特征:在每个构造方法执行前,自动调用,每次创建对象都会调用构造代码块一次,但是优先于构造方法,但是,如果不实例化对象,构造代码块是不会执行的,例如:

public class Employee_text{public static void main(String[] args){//调用无参的构造方法   Employee emp1=new Employee ();System.out.println(emp1); }}
class Employee{//成员变量(按照数据类型自动初始化)private String name;//nullprivate String job;//nullprivate double salary;//0.0private  int level;//0//构造代码块{this.name="匿名";this.job="暂未分配岗位";this.salary=0.1;this.level=1;  }  //构造方法(无参)public Employee(){}public String toString() {return String.format("姓名:%s,岗位:%s,薪资:%f,等级:%d"                            ,this.getName(),this.getJob(),this.getSalary(),this.getLevel());}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getJob() {return job;}public void setJob(String job) {this.job = job;}public double getSalary() {return salary;}public void setSalary(double salary) {this.salary = salary;}public int getLevel() {return level;}public void setLevel(int level) {this.level = level;}

        此时,无参构造方法中并未有任何语句,但是,构造代码块会在调用构造方法时在构造方法前执行,所以输出为:

当构造方法为有参构造方法时,传入的数据会将构造代码块中的数据覆盖:

public class Employee_text{public static void main(String[] args){//调用无参的构造方法   Employee emp1=new Employee ();System.out.println(emp1); //调用有参的构造方法Employee emp3=new Employee("jack");System.out.println(emp3);Employee emp2=new Employee("小佳","女明星",100000,10);System.out.println(emp2);}}
class Employee{//成员变量(按照数据类型自动初始化)private String name;//nullprivate String job;//nullprivate double salary;//0.0private  int level;//0//构造代码块{this.name="匿名";this.job="暂未分配岗位";this.salary=0.1;this.level=1;  }  //构造方法(无参)public Employee(){}//有参构造方法1public Employee(String name) {this.name=name;}public String toString() {return String.format("姓名:%s,岗位:%s,薪资:%f,等级:%d"                            ,this.getName(),this.getJob(),this.getSalary(),this.getLevel());}//有参构造方法2public Employee(String name,String job,double salary,int level) {this.name=name;this.job=job;this.salary=salary;this.level=level;}        public String getName() {return name;}public void setName(String name) {this.name = name;}public String getJob() {return job;}public void setJob(String job) {this.job = job;}public double getSalary() {return salary;}public void setSalary(double salary) {this.salary = salary;}public int getLevel() {return level;}public void setLevel(int level) {this.level = level;}

输出结果为:

姓名:匿名,岗位:暂未分配岗位,薪资:0.100000,等级:1
姓名:jack,岗位:暂未分配岗位,薪资:0.100000,等级:1
姓名:小佳,岗位:女明星,薪资:100000.000000,等级:10

注意:如果存在多个构造代码块,则按照书写顺序执行


 

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

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

相关文章

网络热门项目:任务悬赏。了解任务悬赏系统的功能,支持搭建同款系统运营项目。

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、pandas是什么?二、使用步骤 1.引入库2.读入数据总结 前言 任务悬赏项目:我们在刷短视频的时候就会发现很多博主去推广那些小游戏&a…

Carla自动驾驶仿真八:两种查找CARLA地图坐标点的方法

文章目录 前言一、通过Spectator获取坐标二、通过道路ID获取坐标总结 前言 CARLA没有直接的方法给使用者查找地图坐标点来生成车辆,这里推荐两种实用的方法在特定的地方生成车辆。 一、通过Spectator获取坐标 1、Spectator(观察者)&#xf…

金三银四面试必问:Redis真的是单线程吗?

文章目录 01 Redis中的多线程1)redis-server:2)jemalloc_bg_thd3)bio_xxx: 02 I/O多线程03 Redis中的多进程04 结论▼延伸阅读 由面试题“Redis是否为单线程”引发的思考 作者:李乐 来源:IT阅读…

groovy:XmlParser 读 Freeplane.mm文件,生成测试案例.csv文件

Freeplane 是一款基于 Java 的开源软件,继承 Freemind 的思维导图工具软件,它扩展了知识管理功能,在 Freemind 上增加了一些额外的功能,比如数学公式、节点属性面板等。 强大的节点功能,不仅仅节点的种类很多&#xff…

Jmeter 安装

JMeter是Java的框架,因此在安装Jmeter前需要先安装JDK,此处安装以Windows版为例 1. 安装jdk:Java Downloads | Oracle 安装完成后设置环境变量 将环境变量JAVA_HOME设置为 C:\Program Files\Java\jdk1.7.0_25 在系统变量Path中添加 C:\Pro…

部署PhotoMaker通过堆叠 ID 嵌入自定义逼真的人物照片

PhotoMaker只需要一张人脸照片就可以生成不同风格的人物照片,可以快速出图,无需额外的LoRA培训。 安装环境 python 3.10gitVisual Studio 2022 安装依赖库 git clone https://github.com/bmaltais/PhotoMaker.git cd PhotoMaker python -m venv venv…

面试笔记系列五之MySql+Mybaits基础知识点整理及常见面试题

myibatis执行过程 1读取MyBatis的配置文件。 mybatis-config.xml为MyBatis的全局配置文件,用于配置数据库连接信息。 2加载映射文件。映射文件即SQL映射文件,该文件中配置了操作数据库的SQL语句,需要在MyBatis配置文件mybatis-config.xml中…

【HDFS】Decommision(退役) EC数据节点剩最后几个块卡住的问题

一、背景 近期操作退役EC集群的节点。在退役的过程中,遇到了一些问题。特此总结一下。 本文描述的问题现象是: 每一批次退役10个节点,完全退役成功后开始操作下一批。 但是,中间有一批次有2台节点的Under Replicated Blocks一直是1,不往下降。 处于Decommissioning状态卡…

React入门之react_jsx入门

简单语法写法 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><script s…

【appium】Hybrid应用自动化|微信小程序自动化

目录 一、Hybrid&#xff08;nativewebview&#xff09;应用自动化 1、webview 2、Hybrid应用自动化实现 2.1准备工作 Step1&#xff1a;准备android 4.4版本以上的手机/模拟器 Step2&#xff1a;在app源码中将webview调试模式打开 Step3&#xff1a;安装UC开发者工具 U…

密码学在 Web3 钱包中的应用:私钥是什么?bitget钱包为例

在非对称加密演算法中&#xff0c;私钥是一串随机生成的数字&#xff0c;通常以十六进制数表示&#xff08;也就是由0、1、2、3、4、5、6、7、8、9、a、b、c、d、e和f组成&#xff09;。私钥生成后&#xff0c;这串数字被作为一个单向数学函数中的输入值&#xff0c;计算产生的…

前端css、js、bootstrap、vue2.x、ajax查漏补缺(1)

学到的总是忘&#xff0c;遇到了就随手过来补一下 1.【JS】innerHTML innerHTML属性允许更改HTML元素的内容可以解析HTML标签 2.【CSS】display: none 设置元素不可见&#xff0c;不占空间&#xff0c;约等于将元素删除一样&#xff0c;只是源代码还存在 3.【CSS】行内样式 4.【…