Java中构造函数,set/get方法和toString方法使用及注意说明
作者:望穿秋水见伊人 发布时间:2021-07-15 13:01:39
一、构造函数
构造函数的最大作用就是创建对象时完成初始化,当我们在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类中的基本用法了。
来源:https://blog.csdn.net/peng86788/article/details/80567548


猜你喜欢
- Purpose开发人员在合作的时候经常遇到以下场景:1.开发人员A在自己的本地数据库做了一些表结构的改动,并根据这些改动调整了DAO层的代码
- 项目需求为APP的使用单位有很多部门,各个部分的业务也是独立的,所以开发的APP中如果把所有的模块都显示出来然后再做权限分配,会显得屏幕全是
- Java 是一门面向对象的编程语言,面向对象的编程语言有四大特征:抽象、封装、继承和多态。而本文介绍的接口和抽象类就是面向对象编程中“抽象”
- using System;using System.Collections.Generic;using System.Linq;using
- 本文实例为大家分享了Android自定义View之组合控件,仿电商app顶部栏的相关代码,供大家参考,具体内容如下效果图:分析:左右两边可以
- 本文实例讲述了Java单例模式。分享给大家供大家参考,具体如下:在实际开发的时候会有一些需求,在某个类中只能允许同时存在一个对象。这时就需要
- 前言假设项目打包后,项目结构为:此时如果需要再windows环境中进行项目的启动或关闭,需要频繁的手敲命令,很不方便。此时可以编写.bat脚
- 1. java 执行shelljava 通过 Runtime.getRuntime().exec() 方法执行 shell 的命令或 脚本,
- JLabel 对象可以显示文本、图像或同时显示二者。可以通过设置垂直和水平对齐方式,指定标签显示区中标签内容在何处对齐。默认情况下,标签在其
- Kotlin是一门基于JVM的编程语言,它正成长为Android开发中用于替代Java语言的继承者。Java是世界上使用最多的编程语言之一,
- Java基础编写猜数游戏,供大家参考,具体内容如下设计内容及要求产生一个100以内的随机数,游戏者进行猜数,猜中即胜,猜不中,提示是大了还是
- C# 中可以将类、结构或接口的定义拆分到两个或多个源文件中,在类声明前添加partial关键字即可。1. 什么是局部类型?C# 2.0 引入
- 什么是自动装箱,拆箱先抛出定义,Java中基础数据类型与它们的包装类进行运算时,编译器会自动帮我们进行转换,转换过程对程序员是透明的,这就是
- 开始 在本文中,我将展示如何使用各种不同的 Java 技术构建一些简单的 Comet 风格的 Web 应
- BigDecimal 和 0 比较大小调用BigDecimal中的compareTo方法, 如:int i = bigDecimal.com
- Maven热部署,顾名思义就是可以不影响项目在服务器中的运行情况,可以实现项目代码的更新,减少启动,编译时间,达到快速开发的目的,也不需要手
- 在.net4.0以后异步操作,并行计算变得异常简单,但是由于公司项目开发基于.net3.5所以无法用到4.0的并行计算以及Task等异步编程
- 对大部分系统来说都需要权限管理来决定不同用户可以看到哪些内容,那么如何在Spring MVC中实现权限验证呢?当然我们可以继续使用servl
- JDK8中有双冒号的用法,就是把方法当做参数传到stream内部,使stream的每个元素都传入到该方法里面执行一下。代码其实很简单:以前的
- 序列化和反序列化Java是面向对象的语言,与其他语言进行交互(比如与前端js进行http通信),需要把对象转化成一种通用的格式比如json(