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;//null
	private String job;//null
	private double salary;//0.0
	private  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;//null
	private String job;//null
	private double salary;//0.0
	private  int level;//0
    //构造代码块
    {
        this.name="匿名";
        this.job="暂未分配岗位";
        this.salary=0.1;
		this.level=1;  
    }  
    //构造方法(无参)
    public Employee(){
		
    }
    //有参构造方法1
    public Employee(String name) {
        this.name=name;
    }
    public String toString() {
		return String.format("姓名:%s,岗位:%s,薪资:%f,等级:%d"                            
             ,this.getName(),this.getJob(),this.getSalary()
             ,this.getLevel());
	}
    //有参构造方法2
    public 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

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


 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MATLAB环境下脑电信号EEG的谱分析

脑电信号一直伴随着人类的生命,脑电波是脑神经细胞发生新陈代谢、离子交换时细胞群兴奋突触电位总和,脑电信号的节律性则和丘脑相关,含有丰富的大脑活动信息。通常我们所接触的脑电图都是头皮脑电图,在有些特殊场合还需要皮下部位…

ad18学习笔记十六:如何放置精准焊盘到特定位置,捕抓功能的讲解

网上倒是一堆相关的指导 AD软件熟练度提升,如何设置板框捕捉?_哔哩哔哩_bilibili 关于Altium Designer 20 的捕抓功能的讲解_ad捕捉设置-CSDN博客 AD软件捕捉进阶实例,如何精确的放置布局元器件?_哔哩哔哩_bilibili AD绘制PCB…

学习阶段单片机买esp32还是stm32?

学习阶段单片机买esp32还是stm32? 在开始前我有一些资料,是我根据网友给的问题精心整理了一份「stm32的资料从专业入门到高级教程」, 点个关注在评论区回复“888”之后私信回复“888”,全部无偿共享给大家!!&#xf…

【InternLM 实战营笔记】LMDeploy 的量化和部署

环境配置 vgpu-smi 查看显卡资源使用情况 新开一个终端执行下面的命令实时观察 GPU 资源的使用情况。 watch vgpu-smi复制环境到我们自己的 conda 环境 /root/share/install_conda_env_internlm_base.sh lmdeploy激活环境 conda activate lmdeploy安装依赖库 # 解决 Modu…

深度测试:指定DoC ID对ES写入性能的影响

在[[使用python批量写入ES索引数据]]中已经介绍了如何批量写入ES数据。基于该流程实际测试一下指定文档ID对ES性能的影响有多大。 一句话版 指定ID比不指定ID的性能下降了63%,且加剧趋势。 以下是测评验证的细节。 百万数据量 索引默认使用1分片和1副本。 指定…

JVM(3)

垃圾回收(GC)相关 在C/C中,当我们使用类似于malloc的内存开辟,还需要手动释放内存空间,这样的机制在使用时给我们造成了诸多不便,但在Java中,有垃圾回收这样的机制,这就是指:我们不再需要手动释放,程序会自动判定,某个内存空间是否可以继续使用,如果内存不使用了,就会自动释放…

Hack The Box-Fawn

目录 TASK 1 TASK 2 TASK 3 TASK 4 TASK 5 TASK 6 TASK 7 TASK 8 TASK 9 TASK 10 TASK 11 SUBMIT FLAG TASK 1 What does the 3-letter acronym FTP stand for?File Transfer Protocol (文件传输协议 FTP)TASK 2 Which port does the FTP service listen on usual…

腾讯云优惠券领取入口、云服务器优惠、领取方法及使用教程

腾讯云服务器多少钱一年?62元一年起,2核2G3M配置,腾讯云2核4G5M轻量应用服务器218元一年、756元3年,4核16G12M服务器32元1个月、312元一年,8核32G22M服务器115元1个月、345元3个月,腾讯云服务器网txyfwq.co…

国产新能源车确立全球领先地位 珠光材料等上游产业链亦乘风而起

农历新年伊始,中国新能源汽车的老大哥比亚迪率先开启了一波降价狂潮,比亚迪秦PLUS荣耀版、驱逐舰05荣耀版正式上市,相较于上一版本冠军版车型,两款新版本车型价格均下降了2万元至7.98 万元起售,堪称王炸出牌。当天&…

Python教程59:海龟画图turtle满屏飘字(飞雪连天射白鹿,笑书神侠倚碧鸳)

---------------turtle源码集合--------------- Python教程91:关于海龟画图,Turtle模块需要学习的知识点 Python教程51:海龟画图turtle画(三角形、正方形、五边形、六边形、圆、同心圆、边切圆,五角星,椭…

Java核心API-反射

反射 文章目录 反射前言一、反射概念二、反射与Class类获取Class对象方式 三、反射访问构造方法1、获取包名2、获取类名3、获取父类名称4、获取接口5、获取类中构造方法1)获取所有的构造方法2)获取public修饰的构造方法3)获取private修饰的构…

基于java SSM springboot动物检疫信息管理系统设计和实现

基于java SSM springboot动物检疫信息管理系统设计和实现 博主介绍:多年java开发经验,专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 央顺技术团队 Java毕设项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文末…

AI:145-智能监控系统下的行人安全预警与法律合规分析

🚀点击这里跳转到本专栏,可查阅专栏顶置最新的指南宝典~ 🎉🎊🎉 你的技术旅程将在这里启航! 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意义。 ✨✨✨ 每一个案例都附带关键代码,详细讲解供大家学习,希望…

milvus upsert流程源码分析

milvus版本:v2.3.2 整体架构: Upsert 的数据流向: 1.客户端sdk发出Upsert API请求。 import numpy as np from pymilvus import (connections,Collection, )num_entities, dim 4, 3print("start connecting to Milvus") connections.connect("default",…

代码随想录刷题训练营day25:LeetCode(216)组合总和III、LeetCode(17)电话号码的字母组合

代码随想录刷题训练营day25:LeetCode(40)组合总和 II、LeetCode(216)组合总和III、LeetCode(17)电话号码的字母组合 LeetCode(40)组合总和 II 题目 代码 import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util…

lv19 多态 4

1 虚函数 虚函数&#xff08; 基类指针可指向派生类对象&#xff0c; 动态联编&#xff09; 先看示例&#xff0c;不加virtual&#xff0c;不认对象认指针。 #include <iostream>using namespace std;class A{ public:A(){ }~A(){ }void show(){cout<<"AAA…

火灾安全护航:火灾监测报警摄像机助力建筑安全

火灾是建筑安全中最常见也最具破坏力的灾难之一&#xff0c;为了及时发现火灾、减少火灾造成的损失&#xff0c;火灾监测报警摄像机应运而生&#xff0c;成为建筑防火安全的重要技术装备。 火灾监测报警摄像机采用高清晰度摄像头和智能识别系统&#xff0c;能够全天候监测建筑内…

LeetCode #104 二叉树的最大深度

104. 二叉树的最大深度 题目 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;3 示例 2&#xff1a; 输入&#xff1a;root [1,null,2] 输出&#xff1a;2 分析 …

程序员缺乏经验的 7 种表现!

程序员缺乏经验的 7 种表现&#xff01; 一次性提交大量代码 代码写的很烂 同时开展多项工作 性格傲慢 不能从之前的错误中学到经验 工作时间处理私人事务 盲目追逐技术潮流 知道这些表现&#xff0c;你才能在自己的程序员职业生涯中不犯相同的错误。 软件行业的工作经…

Zookeeper基础入门-2【ZooKeeper 分布式锁案例】

Zookeeper基础入门-2【ZooKeeper 分布式锁案例】 四、ZooKeeper-IDEA环境搭建4.1.环境搭建4.1.1.创建maven工程&#xff1a;zookeeper4.1.2.在pom文件添加依赖4.1.3.在项目的src/main/resources 目录下&#xff0c;新建文件为“log4j.properties”4.1.4.创建包名com.orange.zk …