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



目录
相关文章
|
6天前
|
存储 安全 Java
java.util的Collections类
Collections 类位于 java.util 包下,提供了许多有用的对象和方法,来简化java中集合的创建、处理和多线程管理。掌握此类将非常有助于提升开发效率和维护代码的简洁性,同时对于程序的稳定性和安全性有大有帮助。
33 17
|
1天前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
19 4
|
2天前
|
Java 编译器 开发者
Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面
本文探讨了Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面,帮助开发者提高代码质量和程序的健壮性。
9 2
|
7天前
|
存储 安全 Java
如何保证 Java 类文件的安全性?
Java类文件的安全性可以通过多种方式保障,如使用数字签名验证类文件的完整性和来源,利用安全管理器和安全策略限制类文件的权限,以及通过加密技术保护类文件在传输过程中的安全。
|
6天前
|
Java 测试技术 Maven
Java一分钟之-PowerMock:静态方法与私有方法测试
通过本文的详细介绍,您可以使用PowerMock轻松地测试Java代码中的静态方法和私有方法。PowerMock通过扩展Mockito,提供了强大的功能,帮助开发者在复杂的测试场景中保持高效和准确的单元测试。希望本文对您的Java单元测试有所帮助。
10 2
|
2月前
|
存储 Java
Java编程中的对象和类
【8月更文挑战第55天】在Java的世界中,“对象”与“类”是构建一切的基础。就像乐高积木一样,类定义了形状和结构,而对象则是根据这些设计拼装出来的具体作品。本篇文章将通过一个简单的例子,展示如何从零开始创建一个类,并利用它来制作我们的第一个Java对象。准备好让你的编程之旅起飞了吗?让我们一起来探索这个神奇的过程!
30 10
|
2月前
|
存储 Java
Java的对象和类的相同之处和不同之处
在 Java 中,对象和类是面向对象编程的核心。
|
2月前
|
Java
Java 对象和类
在Java中,**类**(Class)和**对象**(Object)是面向对象编程的基础。类是创建对象的模板,定义了属性和方法;对象是类的实例,通过`new`关键字创建,具有类定义的属性和行为。例如,`Animal`类定义了`name`和`age`属性及`eat()`、`sleep()`方法;通过`new Animal()`创建的`myAnimal`对象即可调用这些方法。面向对象编程通过类和对象模拟现实世界的实体及其关系,实现问题的结构化解决。
|
3月前
|
机器学习/深度学习 人工智能 算法
探索人工智能在医疗诊断中的应用与挑战Java编程中的对象和类:基础与实践
【8月更文挑战第27天】随着人工智能(AI)技术的飞速发展,其在医疗领域的应用日益广泛。本文深入探讨了AI技术在医疗诊断中的具体应用案例,包括图像识别、疾病预测和药物研发等方面,并分析了当前面临的主要挑战,如数据隐私、算法偏见和法规限制等。文章旨在为读者提供一个全面的视角,理解AI在改善医疗服务质量方面的潜力及其局限性。
|
2月前
|
Java 程序员
Java编程中的对象和类: 初学者指南
【9月更文挑战第9天】在Java的世界中,对象和类构成了编程的基石。本文将引导你理解这两个概念的本质,并展示如何通过它们来构建你的程序。我们将一起探索类的定义,对象的创建,以及它们如何互动。准备好了吗?让我们开始这段Java的旅程吧!