Constructor构造方法

news2024/11/15 23:47:29

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

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

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


 

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

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

相关文章

高校物品捐赠管理系统|基于springboot高校物品捐赠管理系统设计与实现(源码+数据库+文档)

高校物品捐赠管理系统目录 目录 基于springboot高校物品捐赠管理系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、用户信息管理 2、捐赠信息管理 3、论坛信息管理 4、公告信息管理 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 七、最新计算…

端智能:面向手机计算环境的端云协同AI技术创新

近年来,随着移动端设备软硬件能力的进步,移动端的算力有了很大提升,同时面向移动端的机器学习框架和模型轻量化技术越来越成熟,端上的AI能力逐渐进入大众视野,端智能在电商领域也开始逐步走向规模化应用。通过持续探索…

【X806开发板试用】文章一 ubuntu开发环境搭建

一、环境配置 官方链接: 环境配置 1.安装必要的库和软件 sudo apt-get install build-essential gcc g make zlib* libffi-dev e2fsprogs pkg-config flex bison perl bc openssl libssl-dev libelf-dev libc6-dev-amd64 binutils binutils-dev libdwarf-dev u-b…

幻兽帕鲁(1.5.0)可视化管理工具(0.5.7 docker版)安装教程

文章目录 局域网帕鲁服务器部署教程帕鲁服务可视化工具安装配置服务器地址(可跳过)使用工具管理面板 1.5.0服务端RCON错误1.5.0服务端无法启动RCON端口 解决方法第一步:PalWorldSettings.ini配置第二步:修改PalServer.sh配置 局域…

Zookeeper基础入门-1【集群搭建】

Zookeeper基础入门-1【集群搭建】 一、Zookeeper 入门1.1.概述1.2.Zookeeper工作机制1.3.Zookeeper特点1.4.数据结构1.5.应用场景1.5.1.统一命名服务1.5.2.统一配置管理1.5.3.统一集群管理1.5.4.服务器动态上下线1.5.5.软负载均衡 1.6.Zookeeper官网1.6.1.Zookeeper下载1.6.2.历…

【MySQL探索之旅】数据库的基本操作

📚博客主页:爱敲代码的小杨. ✨专栏:《Java SE语法》 | 《数据结构与算法》 | 《C生万物》 |《MySQL探索之旅》 ❤️感谢大家点赞👍🏻收藏⭐评论✍🏻,您的三连就是我持续更新的动力❤️ &…

python脚本实现全景站点欧拉角转矩阵

效果 脚本 import numpy as np import math import csv import os from settings import *def euler_to_rotation_matrix(roll, pitch, yaw):# 计算旋转矩阵# Z-Y-X转换顺序Rz

手撕Java集合之简易版Deque(LinkedList)

在目前,许多互联网公司的面试已经要求能手撕集合源码,集合源码本身算是源码里比较简单的一部分,但是要在面试极短的10来分钟内快速写出一个简易版的源码还是比较麻烦的,很容易出现各种小问题。所以在平时就要注重这方面的联系。 以…

腾讯云优惠购买政策大全:新老用户都来瞧瞧!

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

智能双星:遥测终端机与柳林“巡检机器人“,助力智能运维新升级!

随着科技的不断发展,智能化、自动化的运维管理已经成为企业追求高效、稳定运营的重要方向。柳林遥测终端机、柳林e拍云平台以及巡检机器人的组合,为企业带来了一种全新的、前置的、无感的智能运维体验。 柳林遥测终端机,以其强大的数据采集和…

MySQL-MHA搭建、故障测试

一、架构说明 MHA(Master High Availability)是一个用于 MySQL 主从复制管理和自动故障转移的开源工具集。MHA 的主要目的是提供 MySQL 环境的高可用性和自动故障转移功能,确保在主库发生故障时能够快速切换到备库,降低业务中断时…

【Leetcode 2583】二叉树中的第K大层和 —— 优先队列 + BFS

2583. 二叉树中的第K大层和 给你一棵二叉树的根节点root和一个正整数k。 树中的 层和 是指 同一层 上节点值的总和。 返回树中第k大的层和(不一定不同)。如果树少于k层,则返回-1。 注意,如果两个节点与根节点的距离相同&#…

Python中检查一个数字是否是科技数的完整指南

目录 前言 什么是科技数? 如何判断一个数字是否是科技数? 分割数字并计算平方 Python实现科技数检测的示例代码 科技数的应用场景 1. 数字游戏 2. 数据处理 3. 算法优化 4. 数据结构设计 总结 前言 科技数(Tech Number)是一…

VXLAN

VXLAN简介 定义 RFC定义了VLAN扩展方案VXLAN(Virtual eXtensible Local Area Network,虚拟扩展局域网)。VXLAN采用MAC in UDP(User Datagram Protocol)封装方式,是NVO3(Network Virtualizatio…

强化学习_06_pytorch-PPO实践(Hopper-v4)

一、PPO优化 PPO的简介和实践可以看笔者之前的文章 强化学习_06_pytorch-PPO实践(Pendulum-v1) 针对之前的PPO做了主要以下优化: batch_normalize: 在mini_batch 函数中进行adv的normalize, 加速模型对adv的学习policyNet采用beta分布(0~1): 同时增加MaxMinScale …

【中国善网ESG周报】企业ESG报告分析之“华大”

引言: ESG(环境、社会和治理)是一个越来越受到关注的话题,它涉及到企业在经营过程中如何平衡利润、人们和地球的利益。随着全球气候变化加剧、社会不平等问题日益突出,以及公司治理和道德标准的日益重要,E…

ISO_IEC_18598-2016自动化基础设施管理(AIM)系统国际标准解读(一)

██ ISO_IEC_18598-2016是什么标准? ISO/IEC 18598国际标准是由ISO(国际标准化组织)/IEC(国际电工委员会)联合技术委员会1-信息技术的第25分委员会-信息技术设备互连小组制定的关于信息基础设施自动化管理的国际标准&…

微信小程序固定头部-CSS实现

效果图 代码逻辑:设置头部的高度,浮动固定后,再加个这个高度的大小的外边距 .weui-navigation-bar {position: fixed;top: 0px;left: 0px;right: 0px;height:90px; } .weui-navigation-bar_bottom{height:90px; }

Chapter 8 - 19. Congestion Management in TCP Storage Networks

Queue Depth Monitoring and Microburst Detection Queue depth monitoring and microburst detection capture the events that may cause congestion at a lower granularity but are unnoticed by other means due to long polling intervals. 队列深度监控和微爆检测可捕捉…

人工智能到深度学习:药物发现的机器智能方法(综述学习)

Artificial intelligence to deep learning: machine intelligence approach for drug discovery - PubMed (nih.gov) 人工神经网络、深度神经网络、支持向量机、分类和回归、生成对抗网络、符号学习和元学习是应用于药物设计和发现过程的算法的例子。人工智能已应用于药物设计…