java —— 克隆对象、枚举

一、克隆对象

(一)在基本数据类型中,直接将对象 A 的值赋给对象 B,当更改对象 B 的时候,对象 A 的值保持不变。例如:

java 复制代码
public static void main(String[] args)
{
    int a=5;
    int b=a;                      //将a的值赋给b
    b=6;                          //更改b的值
    System.out.println(b);        //b的值为6
    System.out.println(a);        //a的值仍然为5
}

(二)但是在对象引用的情况中,直接将对象 A 的值赋给对象 B,当更改对象 B 的时候,对象 A 的值也会随之改变。例如:

java 复制代码
public class Student
{
	String name;	
	public Student(String name) 
    {	
		this.name = name;                  //构造方法
	}

	public String getName() 
    {
		return name;                       //get方法
	}

	public void setName(String name)
    {
		this.name = name;                  //set方法
	}


    public static void main(String[] args)
    {
	Student st1=new Student("Tom");
	Student st2=st1;
	st2.setName("Jerry");
	System.out.println(st2.getName());     //st2的name变为jerry
	System.out.println(st1.getName());	   //st1的name随之变为jerry
    }
}

在本案例中,由于 Student 类不是基本类型,当把 st1 赋给 st2 的时候,st1 和 st2 实际指向同一个对象 Tom,此时不论更改 st1 还是 st2 中的任何一个,另一个都会随之更改。

(三)如果在对象引用的过程中,要实现更改 B 的时候,A 的值不随之改变,就要通过克隆。

方法:

① 该对象的类要实现 cloneable 接口;

② 在该对象的类中对父类 Object 的 clone() 方法进行重写。

java 复制代码
public class Student implements Cloneable
{
	String name;	
	public Student(String name) 
    {	
		this.name = name;                  //构造方法
	}

	public String getName() 
    {
		return name;                       //get方法
	}

	public void setName(String name)
    {
		this.name = name;                  //set方法
	}

    public Student clone() throws CloneNotSupportedException
	{
		Student stu=(Student)super.clone();         //重写父类的clone()方法
		return stu;
	}


    public static void main(String[] args)
    {
	Student st1=new Student("Tom");
	Student st2=st1.clone();
	st2.setName("Jerry");
	System.out.println(st2.getName());     //st2的name变为jerry
	System.out.println(st1.getName());	   //st1的name仍为tom
    }
}

在本案例中,使用 st2=st1.clone(),实质上等于 st1 和 st2 指向两个 Tom,此时不论更改其中任何一个,都不会影响另一个的值。

二、枚举

枚举实际上就是提前实例化好的对象,外部可以直接调用。并且枚举不支持在外部进行实例化创建,也就是说只有枚举的那几个常量。

java 复制代码
public enum Week
{
    Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday;
    public void run()
    {
       switch (this) 
        {
            case Monday:
            case Tuesday:
            case Wednesday:
            case Thursday:
            case Friday:
                            System.out.println("go to work");break;
            case Saturday:
            case Sunday:
                            System.out.println("have a break");break;
        }
    }
}

public class TT
{
    public static void main(String[] args)
    {
    Week.Monday.run();
    Week.Sunday.run();
    }
}
相关推荐
小酒窝.几秒前
【多线程】多线程打印1~100
java·多线程
君爱学习5 分钟前
基于SpringBoot的选课调查系统
java
APIshop16 分钟前
Java 实战:调用 item_search_tmall 按关键词搜索天猫商品
java·开发语言·数据库
血小板要健康27 分钟前
Java基础常见面试题复习合集1
java·开发语言·经验分享·笔记·面试·学习方法
淼淼76341 分钟前
安装jdk1.8
java·开发语言
毕设源码-朱学姐1 小时前
【开题答辩全过程】以 高校食堂餐饮管理系统的设计与实现为例,包含答辩的问题和答案
java
过期动态1 小时前
Java开发中的@EnableWebMvc注解和WebMvcConfigurer接口
java·开发语言·spring boot·spring·tomcat·maven·idea
摇滚侠1 小时前
IDEA 定义返回值快捷键
java·ide·intellij-idea
毕设源码-郭学长1 小时前
【开题答辩全过程】以 高校考勤管理系统为例,包含答辩的问题和答案
java·eclipse
A懿轩A2 小时前
【Maven 构建工具】从零到上手 Maven:安装配置 + IDEA 集成 + 第一个项目(保姆级教程)
java·maven·intellij-idea