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类中的基本用法了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Java通过PropertyDescriptor反射调用set和get方法

    本文实例为大家分享了PropertyDescriptor反射调用set和get方法,供大家参考,具体内容如下 第一段: package com.zhoushun; import java.lang.reflect.Method; import java.lang.reflect.Field; import java.beans.PropertyDescriptor; public class PropertyUtil { @SuppressWarnings("unchecked") p

  • Java中自动生成构造方法详解

    Java中自动生成构造方法详解 每个类在没有声明构造方法的前提下,会自动生成一个不带参数的构造方法,如果类一但声明有构造方法,就不会产生了.证明如下: 例1: class person { person(){System.out.println("父类-person");} person(int z){} } class student extends person { // student(int x ,int y){super(8);} } class Rt { public st

  • 详解Java使用Pipeline对Redis批量读写(hmset&hgetall)

    一般情况下,Redis Client端发出一个请求后,通常会阻塞并等待Redis服务端处理,Redis服务端处理完后请求命令后会将结果通过响应报文返回给Client. 感觉这有点类似于HBase的Scan,通常是Client端获取每一条记录都是一次RPC调用服务端. 在Redis中,有没有类似HBase Scanner Caching的东西呢,一次请求,返回多条记录呢? 有,这就是Pipline.官方介绍 http://redis.io/topics/pipelining 通过pipeline方

  • java中的静态代码块、构造代码块、构造方法详解

    运行下面这段代码,观察其结果: package com.test; public class HelloB extends HelloA { public HelloB() { } { System.out.println("I'm B class"); } static { System.out.println("static B"); } public static void main(String[] args) { new HelloB(); } } cla

  • 基于idea 的 Java中的get/set方法之优雅的写法

    曾几何时,我们写代码的时候,每次写Bean的时候都会使用快捷键生成get/set方法,有时候我经常会想,既然每一个Bean我们都会给其提供get/set方法,那么为什么还有会这个东西哪?(当然这只是一个问题,毕竟还是很有用的,这一点就是Java语言中的private.public等作用域) 今天说的当然不是这个,我们讨论的是希望有一种优雅的方式编写我们的get/set方法或者说是一种优雅的简化.那我们就说一下今天的主角吧! Lombok Java代码简化神器!就是如此美妙! Lombok是一个可

  • 使用Java构造和解析Json数据的两种方法(详解一)

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,是理想的数据交换格式.同时,JSON是 JavaScript 原生格式,这意味着在 JavaScript 中处理 JSON数据不须要任何特殊的 API 或工具包. 在www.json.org上公布了很多JAVA下的json构造和解析工具,其中org.json和json-lib比较简单,两者使用上差不多但还是有些区别.下面首先介绍用json-lib构造和解析Json数据的方法

  • Java编程构造方法与对象的创建详解

    java构造方法与对象的创建 可以用类来声明对象,声明对象后必须创建对象 1构造方法 首先,我们来谈谈什么叫构造方法,既然都说了这是一个构造方法,那么很显然,它本质上就是一个方法. 那么,既然作为一个方法,它应该有方法的样子吧.它除了回调一个Class();之后,也没见它有其他的定义方法的代码呀?这是因为,在未对类自定义构造方法的情况下,编译器会自动在编译期为其添加默认的构造方法 (1)程序用类创建对象时,需要使用该类的构造方法 (2)类中构造方法的名字必须和类名完全相同,而且没有类型 (3)允

  • 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"); Sy

  • java中构造方法及this关键字的用法实例详解(超详细)

    目录 初识构造方法 构造方法的使用 初识this this.xx的用法 this()用于构造函数的调用 总结 初识构造方法 我们上篇讲了java中类的创建,那么让我们来实战演练一下:创建一个学生类,里面有学生的基本信息,包括姓名.性别.年龄.学号,你可能会写出这样的代码: class Student { String name; String gender; int age; long studentID; } public class TestDemo2 { public static voi

  • java 中mongodb的各种操作查询的实例详解

    java 中mongodb的各种操作查询的实例详解 一. 常用查询: 1. 查询一条数据:(多用于保存时判断db中是否已有当前数据,这里 is  精确匹配,模糊匹配 使用regex...) public PageUrl getByUrl(String url) { return findOne(new Query(Criteria.where("url").is(url)),PageUrl.class); } 2. 查询多条数据:linkUrl.id 属于分级查询 public Lis

  • java 中基本算法之希尔排序的实例详解

    java 中基本算法之希尔排序的实例详解 希尔排序(Shell Sort)是插入排序的一种.也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本.希尔排序是非稳定排序算法.该方法因DL.Shell于1959年提出而得名. 希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序:随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止. 基本思想:算法先将要排序的一组数按某个增量d(n/2,n为要排序数的个数)分成若干组,每组中记录的下标相差

  • Java中的引用和动态代理的实现详解

    我们知道,动态代理(这里指JDK的动态代理)与静态代理的区别在于,其真实的代理类是动态生成的.但具体是怎么生成,生成的代理类包含了哪些内容,以什么形式存在,它为什么一定要以接口为基础? 如果去看动态代理的源代码(java.lang.reflect.Proxy),会发现其原理很简单(真正二进制类文件的生成是在本地方法中完成,源代码中没有),但其中用到了一个缓冲类java.lang.reflect.WeakCache<ClassLoader,Class<?>[],Class<?>

  • 基于Java中最常用的集合类框架之HashMap(详解)

    一.HashMap的概述 HashMap可以说是Java中最常用的集合类框架之一,是Java语言中非常典型的数据结构. HashMap是基于哈希表的Map接口实现的,此实现提供所有可选的映射操作.存储的是对的映射,允许多个null值和一个null键.但此类不保证映射的顺序,特别是它不保证该顺序恒久不变. 除了HashMap是非同步以及允许使用null外,HashMap 类与 Hashtable大致相同. 此实现假定哈希函数将元素适当地分布在各桶之间,可为基本操作(get 和 put)提供稳定的性

  • java中的抽象类和接口定义与用法详解

    目录 一.抽象类 1.什么叫抽象类? 2.抽象类的特点: 3.成员特点: 二.接口 1.接口是什么? 2.接口的特点 3.接口的组成成员 4.类与抽象的关系: 5.抽象类与接口的区别: 一.抽象类 1.什么叫抽象类? 例如在生活中我们都把狗和猫归为动物着一类中,但当只说动物时,我们是不知道是猫还是狗还是其他的.所以动物就是所谓的抽象类,猫和狗则是具体的类了.因此在Java中,一个没有方法体的方法应该定义为抽象类,而类中有抽象方法,则必须为抽象类. 2.抽象类的特点: 抽象类与抽象方法必须用abs

  • Java中文件的读写方法之IO流详解

    目录 1.File类 1.1File类概述和构造方法 1.2File类创建功能 1.3File类判断和获取功能 1.4File类删除功能 2.递归 2.1递归 2.2递归求阶乘 2.3递归遍历目录 3.IO流 3.1 IO流概述和分类 3.2字节流写数据 3.3字节流写数据的三种方式 3.4字节流写数据的两个小问题 3.5字节流写数据加异常处理 3.6字节流读数据(一次读一个字节数据) 3.7字节流复制文本文件 3.8字节流读数据(一次读一个字节数组数据) 3.9字节流复制图片 总结 1.Fil

  • java中 Set与Map排序输出到Writer详解及实例

     java中 Set与Map排序输出到Writer详解及实例 一般来说java.util.Set,java.util.Map输出的内容的顺序并不是按key的顺序排列的,但是java.util.TreeMap,java.util.TreeSet的实现却可以让Map/Set中元素内容以key的顺序排序,所以利用这个特性,可以将Map/Set转为TreeMap,TreeSet然后实现排序输出. 以下是实现的代码片段: /** * 对{@link Map}中元素以key排序后,每行以{key}={val

  • java 中同步方法和同步代码块的区别详解

    java 中同步方法和同步代码块的区别详解 在Java语言中,每一个对象有一把锁.线程可以使用synchronized关键字来获取对象上的锁.synchronized关键字可应用在方法级别(粗粒度锁)或者是代码块级别(细粒度锁). 问题的由来: 看到这样一个面试题: //下列两个方法有什么区别 public synchronized void method1(){} public void method2(){ synchronized (obj){} } synchronized用于解决同步问

随机推荐