如何在类中定义构造方法?

news2024/12/28 23:13:08

在一个类中定义的方法如果同时满足以下三个条件,该方法称为构造方法,具体如下:

1、方法名与类名相同

2、在方法名的前面没有返回值类型的声明

3、在方法中不能使用return语句返回一个值接下来通过一个案例来演示如何在类中定义构造方法,如例程3-7所示。

例程3-7Example05.java

classPerson{// 下面是类的构造方法publicPerson(){System.out.println("无参的构造方法被调用了...");}}publicclassExample05{publicstaticvoidmain(String[] args){Person p =newPerson();// 实例化Person 对象}}

运行结果如图3-9所示。

在例程3-7的Person类中定义了一个无参的构造方法Person()。从运行结果可以看出,Person类中无参的构造方法被调用了。这是因为第9行代码在实例化Person对象时会自动调用类的构造方法,“new Person()”语句的作用除了会实例化Person对象,还会调用构造方法Person()。

在一个类中除了定义无参的构造方法,还可以定义有参的构造方法,通过有参的构造方法就可以实现对属性的赋值。接下来对例程3-7进行改写,改写后的代码如例程3-8所示。

例程3-8Example06.java

classPerson{int age;// 定义有参的构造方法publicPerson(int a){
        age = a;// 为age属性赋值}publicvoidspeak(){System.out.println("I am "+ age +" years old.!");}}publicclassExample06{publicstaticvoidmain(String[] args){Person p =newPerson(20);// 实例化Person 对象
        p.speak();}}

3-8的Person类中定义了有参的构造方法Person(int a)。第13行代码中的“new Person(20)”会在实例化对象的同时调用有参的构造方法,并传入了参数20。在构造方法Person(int a)中将20赋值给对象的age属性。通过运行结果可以看出,Person对象在调用speak()方法时,其age属性已经被赋值为20。

构造方法的重载

与普通方法一样,构造方法也可以重载,在一个类中可以定义多个构造方法,只要每个构造方法的参数类型或参数个数不同即可。在创建对象时,可以通过调用不同的构造方法来为不同的属性进行赋值。接下来通过一个案例来学习构造方法的重载,如例程3-9所示。

例程3-9Example07.java

/ 为name属性赋值
        age = con_age;// 为age属性赋值}// 定义一个参数的构造方法publicPerson(String con_name){
        name = con_name;// 为name属性赋值}publicvoidspeak(){// 打印name和age的值System.out.println("大家好,我叫"+ name +",我今年"+ age +"岁!");}}publicclassExample07{publicstaticvoidmain(String[] args){// 分别创建两个对象p1 和p2Person p1 =newPerson("陈杰");Person p2 =newPerson("李芳",18);// 通过对象p1 和p2 调用speak()方法
        p1.speak();
        p2.speak();}

运行结果如图3-11所示。

例程3-9的Person类中定义了两个构造方法,它们构成了重载。在创建p1对象和p2对象时,根据传入参数的不同,分别调用不同的构造方法。从程序的运行结果可以看出,两个构造方法对属性赋值的情况是不一样的,其中一个参数的构造方法只针对name属性进行赋值,这时age属性的值为默认值0。

注意:

1、在Java中的每个类都至少有一个构造方法,如果在一个类中没有定义构造方法,系统会自动为这个类创建一个默认的构造方法,这个默认的构造方法没有参数,在其方法体中没有任何代码,即什么也不做。

下面程序中Person类的两种写法效果是完全一样的。

第一种写法:

classPerson{}

第二种写法:

classPerson{publicPerson(){}}

对于第一种写法,类中虽然没有声明构造方法,但仍然可以用new Person()语句来创建Person类的实例对象。由于系统提供的构造方法往往不能满足需求,因此,我们可以自己在类中定义构造方法,一旦为该类定义了构造方法,系统就不再提供默认的构造方法了,具体代码如下所示。

classPerson{int age;publicPerson(int x){
        age = x;}}

上面的Person类中定义了一个对成员变量赋初值的构造方法,该构造方法有一个参数,这时系统就不再提供默认的构造方法,接下来再编写一个测试程序调用上面的Person类,如例程3-10所示。

例程3-10Example08.java

publicclassExample08{publicstaticvoidmain(String[] args){Person p =newPerson();// 实例化Person 对象}}

编译程序报错,结果如图3-12所示。

从图中可以看出程序在编译时报错,其原因是调用new Person()创建Person类的实例对象时,需要调用无参的构造方法,而我们并没有定义无参的构造方法,只是定义了一个有参的构造方法,系统将不再自动生成无参的构造方法。为了避免出现上面的错误,在一个类中如果定义了有参的构造方法,最好再定义一个无参的构造方法。

2、思考一下,声明构造方法时,可以使用private访问修饰符吗?下面就来运行一下例程3-11,看看会出现什么结果。

例程3-11Example09.java

classPerson{// 定义构造方法privatePerson(){System.out.println("调用无参的构造方法");}}publicclassExample09{publicstaticvoidmain(String[] args){Person p =newPerson();}}

图3-13运行结果

从图3-13中可以看出,程序在编译时出现了错误,错误提示为private关键字修饰的构造方法Person()只能在Person类中被访问。也就是说Person()构造方法是私有的,不可以被外界调用,也就无法在类的外部创建该类的实例对象。因此,为了方便实例化对象,构造方法通常会使用public来修饰。

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

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

相关文章

闪光桐人の实习日记(2023年2月20-27日)

前往闪闪の小窝以获得更好的阅读和评论体验 文章目录2023年2月20日(Vue入门)概念Vue基础Vue中的MVVMVue的体验Vue的生命周期Vue指令Vue组件VueRouter前后端路由的区别工作原理两种模式比较route跟router的区别路由属性导航守卫Vuex概述5种基本对象基本使…

C语言编程规范 第二部分

2、头文件对于C语言来说,头文件的设计体现了大部分的系统设计。不合理的头文件布局是编译时间过长的根因,不合理的头文件实际上反映了不合理的设计。 1、头文件中适合放置接口的声明,不适合放置实现头文件是模块(Module&#xff…

【数据结构】时间复杂度和空间复杂度

🌇个人主页:平凡的小苏 📚学习格言:别人可以拷贝我的模式,但不能拷贝我不断往前的激情 🛸C语言专栏:https://blog.csdn.net/vhhhbb/category_12174730.html 小苏希望大家能从这篇文章中收获到许…

苹果手机怎么设置闹钟铃声?更改为歌曲铃声,亲测有效

很不是有很多小伙伴每天早上都被苹果手机刺耳的“雷达”闹钟铃声给吵醒呢?想要更换一个舒缓的闹钟铃声,却发现自己鼓捣半天却无法更换喜欢的歌曲闹钟铃声。苹果手机怎么设置闹钟铃声?下面小编就来分享如何将苹果手机的闹钟铃声设置成歌曲铃声…

【docker】拉取镜像环境报错解决#ERROR: Get https://registry-1.docker.io/v2/

🍁博主简介   🏅云计算领域优质创作者   🏅华为云开发者社区专家博主   🏅阿里云开发者社区专家博主 💊交流社区:运维交流社区 欢迎大家的加入! 文章目录问题报错原因解决方法问题 ERROR…

简单的认识 Vue(vue-cli安装、node安装、开发者工具)

Vue1、Vue 与其他框架的对比及特点1.1 Vue.js 是什么1.2 作者1.3 作用1.4 Vue 与其他框架的对比2、安装 Vue 的方法2.1 CDN 引入2.2 脚手架工具2.3 vue 开发者工具安装3、创建第一个实例4、理解 Vue 的 MVVM 模式5、数据双向绑定5.1 感受响应式实验总结1、Vue 与其他框架的对比…

Flutter WebView 如何与 h5 同步登录状态

大家好,我是 17。 Flutter WebView 一共三篇文章 在 Flutter 中使用 webview_flutter 4.0 | js 交互Flutter WebView 性能优化,让 h5 像原生页面一样优秀Flutter WebView 如何与 h5 同步登录状态 本篇是第 3 篇,讲下 Flutter WebView 与 h…

Python|每日一练|动态规划|图算法|散列表|数组|双指针|单选记录:不同路径|求两个给定正整数的最大公约数和最小公倍数|删除有序数组中的重复项

1、不同路径(数学,动态规划) 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish”…

【大数据基础】Linux常用命令

参考资料: https://www.runoob.com/w3cnote/linux-common-command-2.html 1、ls命令 就是 list 的缩写,通过 ls 命令不仅可以查看 linux 文件夹包含的文件,而且可以查看文件权限(包括目录、文件夹、文件权限)查看目录信息等等。 ls -a 列…

LockSupport常用方法源码分析

前言:本文将介绍LockSupport类中的方法和部分源码,以及面试常问到的一个小问题,感兴趣的大佬可以指点下。 希望能够加深自己的印象以及帮助到其他的小伙伴儿们😉😉。 如果文章有什么需要改进的地方还请大佬不吝赐教&am…

uniapp项目引入vant2遇到报错Uncaught ReferenceError: require is not defined完美解决方案

一、问题描述 我用的是Vue2版本的uniapp项目,以下是Vant官方提供的安装方法,使用npm安装到uniapp项目中。 Vant官网:https://vant-contrib.gitee.io/vant/v2/#/zh-CN/quickstart 安装完成得到以下模块 官方提供的引入单个组件的方案 我需要引…

Vision Transformer(ViT) 2: 应用及代码讲解

文章目录1. 代码讲解1.1 PatchEmbed类1)__init__ 函数2) forward 过程1.2 Attention类1)__init__ 函数2)forward 过程1.3 MLP类1)__init__ 函数2)forward函数1.4 Block类1)__init__ 函数2)forwa…

MATLAB曲线拟合工具箱

MATLAB曲线拟合工具箱一、MATLAB曲线拟合工具箱1.导出拟合后的曲线数据2.调用m文件中的函数3.显示5位有效数字二、参考链接一、MATLAB曲线拟合工具箱 1.导出拟合后的曲线数据 生成代码后,默认函数名为createFit,可以自行修改,直接保存&#…

Allegro如何重命名光绘操作指导

Allegro如何重命名光绘操作指导 在做PCB设计的时候,光绘设置是输出生产文件必要的流程,设置好光绘之后,如何对光绘重新命名,如下图 如何把L1改成TOP,L6改成BOTTOM,具体操作步骤如下 点击Manufacture选择Artwork

每天一道大厂SQL题【Day11】微众银行真题实战(一)

每天一道大厂SQL题【Day11】微众银行真题实战(一) 大家好,我是Maynor。相信大家和我一样,都有一个大厂梦,作为一名资深大数据选手,深知SQL重要性,接下来我准备用100天时间,基于大数据岗面试中的经典SQL题&…

【C++修炼之路】21.红黑树封装map和set

每一个不曾起舞的日子都是对生命的辜负 红黑树封装map和set前言一.改良红黑树的数据域结构1.1 改良后的结点1.2 改良后的类二. 封装的set和map2.1 set.h2.2 map.h三. 迭代器3.1 迭代器封装3.2 const迭代器四.完整代码实现4.1 RBTree.h4.2 set.h4.3 map.h4.4 Test.cpp前言 上一节…

epoll 笔记

maxevents 参数大小一般不超过64必须够了 maxevents 个事件,才会传到用户空间吗?可见,只要有事件就可以传到用户空间。一台服务器可以支撑多少个链接https://blog.csdn.net/mijichui2153/article/details/81331345 0、两台虚拟机的初始状态如…

数据库必知必会:TiDB(12)TiDB连接管理

数据库必知必会:TiDB(12)TiDB连接管理TiDB连接管理TiDB的连接特性连接TiDBMySQL命令行客户端图形界面客户端连接其他连接方式写在后面TiDB连接管理 TiDB的连接特性 TiDB Server主要负责接收用户的会话请求,接收SQL并负责SQL语句…

【2021/推荐/社交网络】Socially-Aware Self-Supervised Tri-Training for Recommendation

部分公式、图表和排版等显示可能异常,可在个人公众号(码农的科研笔记)进行全文免费阅读。 【2021/推荐/社交网络】Socially-Aware Self-Supervised Tri-Training for Recommendation 原文:https://dl.acm.org/doi/10.1145/3447548.3467340 源码:[伯乐 SEPT]、https://git…

Keychron K3 Pro键盘测评

目录 0.开箱 1.Keychron K3 Pro介绍 2.产品特点 2.1轻薄机身轴体解锁多场景办公 2.2 支持QMK/VIA开源改键蓝牙/有线双模客制化机械键盘 ​2.3支持MacOS/Windows系统秒切换不卡顿 2.4同时适配3台设备可快速切换 ​2.5支持QMK/VIA改键 2.6 超轻薄佳达隆矮轴,触感新体验 …