Java-对对象的拷贝、抽象类和接口的区别、Object类、对象的比较方法和内部类(上)

简介: Java-对对象的拷贝、抽象类和接口的区别、Object类、对象的比较方法和内部类(上)

1.Clonable接口和深拷贝



       Java 中内置了一些很有用的接口, Clonable 就是其中之一,Object 类中存在一个 clone 方法,调用这个方法可以创建一个对象的 "拷贝". 但是要想合法调用 clone 方法, 必须要先实现 Clonable 接口, 否则就会抛出 CloneNotSupportedException 异常。

8dffa056e6384118b5f04c40412090d6.png


6ce156cc684d42bb80fc4d3159357d25.png

class Students  implements Cloneable {
    public String name;
    public int age;
    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
    public Students(String name, int age) {
        this.name = name;
        this.age = age;
    }
    @Override
    public String toString() {
        return "{" +
                "name=" + name +
                ", age=" + age +
                "}";
    }
}
public class text {
    public static void main(String[] args) throws CloneNotSupportedException {
        Students student1=new Students("张三",10);
        Students student2=(Students) student1.clone();//强制类型转化
        System.out.println(student1);
        System.out.println(student2);
    }
}


430ebc09ca8343ec9873b5112821fc7b.png


class Money{
    public double m=25.0;
}
class Students  implements Cloneable {
    public String name;
    public int age;
    public Money money=new Money();
    @Override              浅拷贝
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
    public Students(String name, int age) {
        this.name = name;
        this.age = age;
    }
    @Override
    public String toString() {
        return "{" +
                "name=" + name + " "+
                ", age=" + age +" "+
                ", money=" + money.m +
                '}';
    }
}
public class text {
    public static void main(String[] args) throws CloneNotSupportedException {
        Students student1=new Students("张三",10);
        Students student2=(Students) student1.clone();
        System.out.println(student1);
        System.out.println(student2);
        System.out.println("====");
        student1.money.m=15.0;
        System.out.println(student1);
        System.out.println(student2);
    }
}

bc9587a41b0a4d65befa7d9380c71580.png

e944109442c347fa8323b8d257481b8c.png


通过clone,我们只是拷贝了Students对象,但是Students对象中的Money对象,并没有拷贝,通过student1这个引用修改了m的值后,student2这个引用访问m的时候,值也发生了改变


class Money implements Cloneable{
    public double m=25.0;
    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}
class Students  implements Cloneable {
    public String name;
    public int age;
    public Money money=new Money();
    @Override  //深拷贝,将引用的对象(student1)中的对象也拷贝到目标对象中
    protected Object clone() throws CloneNotSupportedException {
        Students temp=(Students) super.clone();
        temp.money=(Money)this.money.clone();
        return temp;
    }
    public Students(String name, int age) {
        this.name = name;
        this.age = age;
    }
    @Override
    public String toString() {
        return "{" +
                "name=" + name + " "+
                ", age=" + age +" "+
                ", money=" + money.m +
                '}';
    }
}
public class text {
    public static void main(String[] args) throws CloneNotSupportedException {
        Students student1=new Students("张三",10);
        Students student2=(Students) student1.clone();
        System.out.println(student1);
        System.out.println(student2);
        System.out.println("====");
        student1.money.m=15.0;
        System.out.println(student1);
        System.out.println(student2);
    }
}

1cc304719f924c1a914fe5d83d9e046a.png


f8f4a77c56d244ebb2acc129eb5a367a.png


通过clone,我们拷贝Students对象,同时将Students对象中的Money对象也进行拷贝。通过student1这个引用修改了m的值后,student2这个引用访问m的时候,值不会发生改变


2.抽象类和接口的区别



抽象类和接口都是 Java 中多态的常见使用方式. 都需要重点掌握. 同时又要认清两者的区别,

       核心区别: 抽象类中可以包含普通方法和普通字段, 这样的普通方法和字段可以被子类直接使用(不必重写), 而接口中不能包含普通方法, 子类必须重写所有的抽象方法。


抽象类存在的意义是为了让编译器更好的校验, 像 Animal 这样的类我们并不会直接使用, 而是使用它的子类.万一不小心创建了 Animal 的实例, 编译器会及时提醒我们。

c2032ae1443a46f8840c6d81be5082cc.png


3.Object类



       Object是Java默认提供的一个类。Java里面除了Object类,所有的类都是存在继承关系的。默认会继承Object父类。即所有类的对象都可以使用Object的引用进行接收。



例如:使用Object接收所有类的对象。。


class Person{
}
class Student{
}
public class Test {
        public static void main(String[] args) {
        function(new Person());
        function(new Student());
        }
        public static void function(Object object) {
                System.out.println(object);
        }
}


84e81c3e35364a7bb3a2330b3166bd74.png


Object类中有以下方法


18a4a0b766074298a2d232825495b4dd.png



目录
相关文章
|
2天前
|
运维 Java 程序员
Java中的异常处理方法
本文深入剖析Java异常处理机制,介绍可检查异常、运行时异常和错误的区别与处理方式。通过最佳实践方法,如使用合适的异常类型、声明精确异常、try-with-resources语句块、记录异常信息等,帮助开发者提高代码的可靠性、可读性和可维护性。良好的异常处理能保证程序稳定运行,避免资源泄漏和潜在问题。
|
3天前
|
传感器 监控 Java
Java代码结构解析:类、方法、主函数(1分钟解剖室)
### Java代码结构简介 掌握Java代码结构如同拥有程序世界的建筑蓝图,类、方法和主函数构成“黄金三角”。类是独立的容器,承载成员变量和方法;方法实现特定功能,参数控制输入环境;主函数是程序入口。常见错误包括类名与文件名不匹配、忘记static修饰符和花括号未闭合。通过实战案例学习电商系统、游戏角色控制和物联网设备监控,理解类的作用、方法类型和主函数任务,避免典型错误,逐步提升编程能力。 **脑图速记法**:类如太空站,方法即舱段;main是发射台,static不能换;文件名对仗,括号要成双;参数是坐标,void不返航。
17 5
|
21天前
|
存储 安全 算法
Java容器及其常用方法汇总
Java Collections框架提供了丰富的接口和实现类,用于管理和操作集合数据。
Java容器及其常用方法汇总
|
23天前
|
存储 缓存 Java
java语言后台管理ruoyi后台管理框架-登录提示“无效的会话,或者会话已过期,请重新登录。”-扩展知识数据库中密码加密的方法-问题如何解决-以及如何重置若依后台管理框架admin密码-优雅草卓伊凡
java语言后台管理ruoyi后台管理框架-登录提示“无效的会话,或者会话已过期,请重新登录。”-扩展知识数据库中密码加密的方法-问题如何解决-以及如何重置若依后台管理框架admin密码-优雅草卓伊凡
82 3
java语言后台管理ruoyi后台管理框架-登录提示“无效的会话,或者会话已过期,请重新登录。”-扩展知识数据库中密码加密的方法-问题如何解决-以及如何重置若依后台管理框架admin密码-优雅草卓伊凡
|
21天前
|
Java API
java.time常用方法汇总
`java.time` API 是从 Java 8 开始引入的时间日期处理库,旨在替代老旧的 `java.util.Date` 和 `Calendar`。它提供了更简洁、强大和灵活的方式处理日期、时间、时区及时间间隔,支持全球化和时间计算需求。API 包含获取当前时间、创建指定时间、解析和格式化字符串、进行加减运算、比较时间、获取年月日时分秒、计算时间间隔、时区转换以及判断闰年等功能。示例代码展示了如何使用这些功能,极大简化了开发中的时间处理任务。
|
4月前
|
Java
Java基础(13)抽象类、接口
本文介绍了Java面向对象编程中的抽象类和接口两个核心概念。抽象类不能被实例化,通常用于定义子类的通用方法和属性;接口则是完全抽象的类,允许声明一组方法但不实现它们。文章通过代码示例详细解析了抽象类和接口的定义及实现,并讨论了它们的区别和使用场景。
|
6月前
|
Java
Java——抽象类和接口
抽象类是一种不能被实例化的类,至少包含一个抽象方法(无实现体的方法),常用于定义一组相关类的共同特征,并强制子类实现特定方法。抽象方法不能被 `static` 或 `final` 修饰,且必须被重写。 接口则是一个完全抽象的类,用于规范类的行为。接口使用 `interface` 关键字定义,不能实例化,并且类与接口之间是实现关系。 内部类是在一个类内定义的类,分为成员内部类、静态内部类、局部内部类和匿名内部类。成员内部类可被修饰符修饰,静态内部类只能访问外部类的静态成员,局部内部类定义在方法内,匿名内部类则隐藏了名字,直接通过 `new` 关键字定义并实现接口或继承类。
40 5
Java——抽象类和接口
|
5月前
|
安全 Java 数据安全/隐私保护
【一步一步了解Java系列】:探索抽象类与接口的秘密
【一步一步了解Java系列】:探索抽象类与接口的秘密
34 3
|
5月前
|
Java
Java中抽象类和接口有什么区别?
本文阐述了Java中抽象类和接口的区别,包括类型扩展、方法/属性访问控制符、方法实现、使用目的等方面的不同,并提供了抽象类和接口的使用示例,以及Java中其他类型的类(普通类、内部类等)的简介。
741 0
Java中抽象类和接口有什么区别?
|
5月前
|
Java 编译器
【Java】用一个动物王国的例子,讲清楚抽象类和接口
【Java】用一个动物王国的例子,讲清楚抽象类和接口
54 0

热门文章

最新文章