强哥说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 关键字 + 构造方法名 () 来实现的。


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

相关文章
|
28天前
|
存储 缓存 安全
java 中操作字符串都有哪些类,它们之间有什么区别
Java中操作字符串的类主要有String、StringBuilder和StringBuffer。String是不可变的,每次操作都会生成新对象;StringBuilder和StringBuffer都是可变的,但StringBuilder是非线程安全的,而StringBuffer是线程安全的,因此性能略低。
44 8
|
1月前
|
安全 Java 编译器
Java对象一定分配在堆上吗?
本文探讨了Java对象的内存分配问题,重点介绍了JVM的逃逸分析技术及其优化策略。逃逸分析能判断对象是否会在作用域外被访问,从而决定对象是否需要分配到堆上。文章详细讲解了栈上分配、标量替换和同步消除三种优化策略,并通过示例代码说明了这些技术的应用场景。
Java对象一定分配在堆上吗?
|
28天前
|
Java 开发者
在 Java 中,一个类可以实现多个接口吗?
这是 Java 面向对象编程的一个重要特性,它提供了极大的灵活性和扩展性。
61 1
|
1月前
|
存储 安全 Java
java.util的Collections类
Collections 类位于 java.util 包下,提供了许多有用的对象和方法,来简化java中集合的创建、处理和多线程管理。掌握此类将非常有助于提升开发效率和维护代码的简洁性,同时对于程序的稳定性和安全性有大有帮助。
63 17
|
1月前
|
安全 Java
Java多线程集合类
本文介绍了Java中线程安全的问题及解决方案。通过示例代码展示了使用`CopyOnWriteArrayList`、`CopyOnWriteArraySet`和`ConcurrentHashMap`来解决多线程环境下集合操作的线程安全问题。这些类通过不同的机制确保了线程安全,提高了并发性能。
|
2月前
|
Java API
Java 对象释放与 finalize 方法
关于 Java 对象释放的疑惑解答,以及 finalize 方法的相关知识。
51 17
|
1月前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
117 4
|
1月前
|
Java 编译器 开发者
Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面
本文探讨了Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面,帮助开发者提高代码质量和程序的健壮性。
62 2
|
1月前
|
存储 安全 Java
如何保证 Java 类文件的安全性?
Java类文件的安全性可以通过多种方式保障,如使用数字签名验证类文件的完整性和来源,利用安全管理器和安全策略限制类文件的权限,以及通过加密技术保护类文件在传输过程中的安全。
53 4
|
1月前
|
Java 数据格式 索引
使用 Java 字节码工具检查类文件完整性的原理是什么
Java字节码工具通过解析和分析类文件的字节码,检查其结构和内容是否符合Java虚拟机规范,确保类文件的完整性和合法性,防止恶意代码或损坏的类文件影响程序运行。
44 5
下一篇
DataWorks