强哥说Java--Java 类和对象(二)

简介: 强哥说Java--Java 类和对象(二)

4. 构造方法



4.1 概述


在类中,可定义一个构造方法,也称为构造函数或构造器。它用于一些初始化操作,构造方法的语法为:


public 构造方法名(参数) {    // 代码块}


需要注意的是,与普通的自定义方法不同,构造方法没有返回类型,并且方法名要与类名同名。


另外,如果我们没有定义构造方法,系统会有一个默认的构造方法。换句话说:任何一个类都会有一个构造方法。


构造方法只能在对象的实例化时使用,也就是说,构造方法只能配合 new 关键字使用。


根据参数的有无,构造方法可分为两种:


无参构造方法


有参构造方法


4.2 无参构造方法


在 csdnUser 类中,我们可以定义一个无参构造方法:
package com.caq.method;//无参构造方法public class TestDemo {    public TestDemo(){        System.out.println("我是构造方法,我被调用了");    }    public static void main(String[] args) {        TestDemo test = new TestDemo();    }}
使用 new 关键字调用构造方法:
TestDemo test = new TestDemo();
运行结果:
我是构造方法,我被调用了


4.3 有参构造方法


当创建实例对象时,我们经常需要同时初始化这个实例的成员属性,例如:


csdnUser student = new csdnUser();student.nickname = "刘亦菲";student.position = "前端开放";


虽然这样能够给我们的成员属性进行赋值,但每次需要编写 2 行这样的代码。能不能在创建对象时,就对这些属性进行赋值呢?有参构造方法解决了这样的问题,我们可以在 csdnUser 类内部定义一个有参构造方法:


// 有参构造方法public csdnUser(String studentNickname, String studentPosition) {    // 将参数变量赋值给实例变量    nickname = studentNickname;    position = studentPosition;}


构造函数中,我们将参数变量的值赋值给实例变量。使用 new 关键字调用构造方法:


csdnUser student1 = new csdnUser("刘亦菲", "前端开放");System.out.println("昵称为:" + student1.nickname);System.out.println("职位为:" + student1.position);


运行结果:


昵称为:刘亦菲职位为:前端开放


你也可以增加构造函数的参数数量,以用来给更多的实例属性赋值:


// 有参构造方法public csdnUser(String studentNickname, String studentPosition, String studentCity, String studentSex) {    nickname = studentNickname;    position = studentPosition;    city = studentCity;    sex = studentSex;}


构造方法与普通方法相同,也会重载,因此类中允许定义多个参数列表不同构造方法。


需要特别注意的是,我们在上面两个有参构造方法中,成员属性的命名和参数变量的命名是不同的,**如果参数列表中参数变量的命名和实例属性相同。**将无法完成对实例属性的赋值,也就是说,下面的写法是错误的:


public csdnUser(String nickname) {    nickname = nickname;}


这是因为构造方法在参数的赋值过程中,会优先到同一个作用范围内的 nickname 进行赋值操作,这就是所谓的就近原则。这时我们可以使用 this 关键字。

5. this 关键字



为了解决上面无法使用与成员属性同名称的参数对成员属性进行赋值的问题,我们可以使用 this 关键字:


public csdnUser(String nickname) {    this.nickname = nickname;}


在方法内部,this 关键字是当前对象的默认引用,简单说,谁调用了它谁就是 this。因此,通过 this.field 就可以访问当前实例的字段,解决实例变量和参数变量名称冲突的问题。


实例演示


public class csdnUser {    // 定义属性(特征)    String nickname;  // 昵称    String position;  // 职位    String city;      // 城市    String sex;       // 男 | 女    // 无参构造方法    public csdnUser() {        // 执行输出语句        System.out.println("无参构造方法执行了...");    }    // 有参构造方法    public csdnUser(String nickname, String position) {        // 将参数变量赋值给实例变量        this.nickname = nickname;        this.position = position;    }    // 有参构造方法    public csdnUser(String nickname, String position, String city, String sex) {        this.nickname = nickname;        this.position = position;        this.city = city;        this.sex = sex;    }    // 定义方法(行为)    public void studyCourse() {        System.out.println("学习课程");    }    public void postComment() {        System.out.println("发表评论");    }    public void postArticle() {        System.out.println("发表手记");    }    public static void main(String[] args) {        // 实例化学生对象        csdnUser student = new csdnUser();        // 给成员属性赋值        student.nickname = "Colorful";        student.position = "服务端工程师";        student.city = "北京";        student.sex = "男";        // 调用成员属性        System.out.println("昵称:" + student.nickname);//        System.out.println("职位:" + student.position);        System.out.println("城市:" + student.city);        System.out.println("性别:" + student.sex);        csdnUser student1 = new csdnUser("刘亦非", "UI设计师");        System.out.println("昵称为:" + student1.nickname);        System.out.println("职位为:" + student1.position);    }}


无参构造方法执行了...昵称:Colorful职位:服务端工程师城市:北京性别:男昵称为:刘亦非职位为:UI设计师


看完实例还不懂的话,去看看这个


https://blog.csdn.net/qq_45714272/article/details/119615181


保熟!!!


6. 小结



重点知识:


在面向对象中,类和对象是 “模板” 和 “实例” 的关系。


类中的实例变量是每个实例独自拥有的,它们互不干扰。


关于对象的实例化,我们是使用 new 关键字 + 构造方法名 () 来实现的。


当类内部我们没有显示定义构造方法时,系统会自动添加无参的构造方法;当在类内部显示定义了构造方法,系统不会自动添加无参构造方法。

相关文章
|
9天前
|
设计模式 网络协议 数据可视化
Java 设计模式之状态模式:让对象的行为随状态优雅变化
状态模式通过封装对象的状态,使行为随状态变化而改变。以订单为例,将待支付、已支付等状态独立成类,消除冗长条件判断,提升代码可维护性与扩展性,适用于状态多、转换复杂的场景。
94 0
|
2月前
|
安全 Java 数据建模
Java记录类:简化数据载体的新选择
Java记录类:简化数据载体的新选择
183 101
|
2月前
|
安全 Java 开发者
Java记录类:简化数据载体的新方式
Java记录类:简化数据载体的新方式
239 100
|
3月前
|
安全 IDE Java
Java记录类型(Record):简化数据载体类
Java记录类型(Record):简化数据载体类
337 120
|
15天前
|
存储 Java 索引
用Java语言实现一个自定义的ArrayList类
自定义MyArrayList类模拟Java ArrayList核心功能,支持泛型、动态扩容(1.5倍)、增删改查及越界检查,底层用Object数组实现,适合学习动态数组原理。
69 4
|
20天前
|
IDE JavaScript Java
在Java 11中,如何处理被弃用的类或接口?
在Java 11中,如何处理被弃用的类或接口?
117 5
|
23天前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
88 1
|
23天前
|
Java Go 开发工具
【Java】(8)正则表达式的使用与常用类分享
正则表达式定义了字符串的模式。正则表达式并不仅限于某一种语言,但是在每种语言中有细微的差别。
149 1
|
23天前
|
存储 Java 程序员
【Java】(6)全方面带你了解Java里的日期与时间内容,介绍 Calendar、GregorianCalendar、Date类
java.util 包提供了 Date 类来封装当前的日期和时间。Date 类提供两个构造函数来实例化 Date 对象。第一个构造函数使用当前日期和时间来初始化对象。Date( )第二个构造函数接收一个参数,该参数是从1970年1月1日起的毫秒数。
101 1
|
23天前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
92 2
下一篇
开通oss服务