Java中构造函数,set/get方法和toString方法使用及注意说明

 更新时间:2023年01月09日 10:05:38   作者:望穿秋水见伊人  
这篇文章主要介绍了Java中构造函数,set/get方法和toString方法的使用及注意说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

一、构造函数

构造函数的最大作用就是创建对象时完成初始化,当我们在new一个对象并传入参数的时候,会自动调用构造函数并完成参数的初始化。

如下:

public class Test01 {
    private String name;
    //有参构造函数
    public Test01(String name) {
        this.name = name;
    }
    public static void main(String[] args) {
        Test01 t=new Test01("Wade");
        System.out.println(t.name);
    }
}

运行结果是“Wade”

插一句,插入构造函数快捷键:alt+insert,Constructor(构造函数)

这就说明在我们创建Test01对象时,会自动调用构造函数完成初始化,这时程序中的name属性就成了Wade。

上面说到构造函数是为了在new对象传入参数后完成属性的初始化。

但是 ,为什么我程序中不写构造函数依然可以完成初始化。

1.如果不写构造函数,程序会自动生成一个无参数无操作的构造函数(默认的,隐藏)。

2.如果写了构造函数,则自定义构造函数会覆盖无参数构造函数。

3.如果只写了有参数的构造函数,且不存在无参数的构造函数,将不能以 new XXX(); 这样的方式实例化对象,在实例化对象代码中,new XXX("***"); 括号中的参数必须与构造函数的参数保持一致,否则报错。(当然你也可以生成对象后通过他们的set、get方法进行赋值。)

所以,比较稳妥也是较常用的方式是在java类中同时定义无参构造函数和有参构造函数,代码如下:

public class Test01 {
    private String name;
    //有参构造函数
    public Test01(String name) {
        this.name = name;
    }
    //无参构造函数
    public Test01() {
    }
    public static void main(String[] args) {
        //既可以调用有参构造函数实例化对象
        Test01 t=new Test01("Wade");
        //又可以调用有参构造函数实例化对象
        Test01 t1=new Test01();
        System.out.println(t.name+","+t1.name);
    }
}

运行结果是“Wade,null”

这样在实际使用中会非常方便的。

二、set()/get()方法

我们先来看看set和get这两个词的表面意思,set是设置的意思,而get是获取的意思,顾名思义,这两个方法是对数据进行设置和获取用的。

然后我们来了解一下JAVA面向对象编程中的封闭性和安全性。封闭性即对类中的域变量进行封闭操作,即用private来修饰他们,如此一来其他类则不能对该变量访问。

这样我们就将这些变量封闭在了类内部,这样就提高了数据的安全性,当我们想要操作这些域变量怎么办呢?

我们可以通过两种方法,第一中即通过public方式的构造器(或称构造函数),对象一实例化就对该变量赋值。

第二种就是通过上面提到的set和get方法,这里我举一个特定的例子,我定义一个Person类,该类中有name、age这两个私有域变量,然后我定义setname()、getname()、setage()、getage()这四个方法,通过这四个方法来实现对name和age的操作。

这样一来,我不用直接对Person类中的域变量操作,而是通过set和get方法间接地操作这些变量,这样就能提高域变量的安全性,同时又保证了域变量的封装型。

现在以上述代码为例,添加set/get方法

同样使用快捷键:alt+insert,Getter and Setter

public class Test01 {
    private String name;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    //有参构造函数
    public Test01(String name) {
        this.name = name;
    }
    //无参构造函数
    public Test01() {
    }
    public static void main(String[] args) {
        //既可以调用有参构造函数实例化对象
        Test01 t=new Test01("Wade");
        //又可以调用无参构造函数实例化对象
        Test01 t1=new Test01();
	//使用set()方法给属性赋值
        t.setName("CP3");
	//传统方式赋值
        t1.name="Rose";
	//使用get()方法获取属性值
        System.out.println("t:"+t.getName()+","+"t1:"+t1.name);
	//在同一个类中,t.getName()和t.name效果是一样的,但如果不是同一个类,属性是私有的,就只能使用t.getName(),set()方法也是一样的。
    }
}

运行结果是“t:CP3,t1:Rose”

这就是java编程语言的封装思想,希望大家好好理解。

三、toString()方法

Object类具有一个toString()方法,你创建的每个类都会继承该方法。

它返回对象的一个String表示,并且对于调试非常有帮助。

然而对于默认的toString()方法往往不能满足需求,需要覆盖这个方法。

toString()方法将对象转换为字符串。

将上述代码最后加上

System.out.println(t.toString());
System.out.println(t1.toString());

运行结果是

全限定名@地址首地址

Test01@6d6f6e28
Test01@135fbaa4

这是什么呢?是对象的地址值,但这不是我们需要的信息,我们想要对象的各种属性值,所以需要重写toString()方法。

同样使用快捷键:alt+insert,toString()

public class Test01 {
    private String name;
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
    //有参构造函数
    public Test01(String name) {
        this.name = name;
    }
    //无参构造函数
    public Test01() {
    }
    //重写toString()方法,可以自定义
    @Override
    public String toString() {
        return "Test01{" +
                "name='" + name + '\'' +
                '}';
    }
 
    public static void main(String[] args) {
        //既可以调用有参构造函数实例化对象
        Test01 t=new Test01("Wade");
        //又可以调用无参构造函数实例化对象
        Test01 t1=new Test01();
        //使用set()方法给属性赋值
        t.setName("CP3");
        //传统方式赋值
        t1.name="Rose";
        //使用get()方法获取属性值
        System.out.println("t:"+t.getName()+","+"t1:"+t1.name);
        //在同一个类中,t.getName()和t.name效果是一样的,但如果不是同一个类,属性是私有的,就只能使用t.getName(),set()方法也是一样的。
        System.out.println(t.toString());
        System.out.println(t1.toString());
    }
}

运行结果是

t:CP3,t1:Rose

Test01{name='CP3'}

Test01{name='Rose'}

这样就得到我们想要的信息了,这就是重写toString()在java类中的基本用法了。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java的Struts2框架中拦截器使用的实例教程

    Java的Struts2框架中拦截器使用的实例教程

    拦截器是Struts框架的重要特性,Struts中每一个Action请求都包装在一系列的拦截器的内部,这里我们就来看一下Java的Struts2框架中拦截器使用的实例教程
    2016-07-07
  • crawler4j抓取页面使用jsoup解析html时的解决方法

    crawler4j抓取页面使用jsoup解析html时的解决方法

    crawler4j对response没有指定编码的页面,解析成乱码,很让人烦恼,下面给出解决方法,需要的朋友可以参考下
    2014-04-04
  • SpringCloud Feign隔离与降级详细分析

    SpringCloud Feign隔离与降级详细分析

    Feign是Netflix公司开发的一个声明式的REST调用客户端; Ribbon负载均衡、 Hystrⅸ服务熔断是我们Spring Cloud中进行微服务开发非常基础的组件,在使用的过程中我们也发现它们一般都是同时出现的,而且配置也都非常相似
    2022-11-11
  • Java实现把文件压缩成zip文件的示例代码

    Java实现把文件压缩成zip文件的示例代码

    这篇文章主要为大家介绍了如何通过Java语言实现将文件压缩成zip文件,本文中示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-02-02
  • MyBatis Plus配置日志CRUD的使用详解

    MyBatis Plus配置日志CRUD的使用详解

    这篇文章主要介绍了MyBatis Plus配置日志,CRUD的使用,,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-08-08
  • Java抽象类和接口使用梳理

    Java抽象类和接口使用梳理

    对于面向对象编程来说,抽象是它的一大特征之一,在 Java 中可以通过两种形式来体现OOP的抽象:接口和抽象类,下面这篇文章主要给大家介绍了关于Java入门基础之抽象类与接口的相关资料,需要的朋友可以参考下
    2022-02-02
  • SpringBoot使用Thymeleaf模板引擎访问静态html的过程

    SpringBoot使用Thymeleaf模板引擎访问静态html的过程

    这篇文章主要介绍了SpringBoot使用Thymeleaf模板引擎访问静态html的过程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-10-10
  • JavaScript base64 与 File 之间的互转(操作方法)

    JavaScript base64 与 File 之间的互转(操作方法)

    在JavaScript 中,可以使用 Blob 对象将 base64 字符串转换为 File 对象,这篇文章主要介绍了JavaScript base64 与 File之间的互转,需要的朋友可以参考下
    2024-05-05
  • Intellij Idea插件开发之创建项目层级的右键菜单

    Intellij Idea插件开发之创建项目层级的右键菜单

    这篇文章主要介绍了Intellij Idea插件开发之创建项目层级的右键菜单,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-02-02
  • Java设计模式之迭代模式(Iterator模式)介绍

    Java设计模式之迭代模式(Iterator模式)介绍

    这篇文章主要介绍了Java设计模式之迭代模式(Iterator模式)介绍,本文用一个老师点名的现象描述了迭代模式的使用,需要的朋友可以参考下
    2015-03-03

最新评论