当前位置: 首页 > news >正文

接口使用实例和Object类及内部类

 Comparable 接口

查看接口ctrl+鼠标

sort 要求传入的数组的每个对象都是“可比较”的,也就是说对象中的某个成员变量可以进行比较(比如姓名、年龄等)。这样通过重写 compareTo 方法就可以定义比较规则

Comparable接口是一个泛型(要比较什么类型,就把类名传入)接口,用于定义对象的排序规则。该接口中只有一个方法compareTo(),用于比较这个对象与另一个对象的大小关系。

compareTo()方法

 int compareTo(T obj)

用法:

compareTo()方法返回一个整数值,表示当前对象与参数对象的大小关系:

如果返回值小于0,表示当前对象小于参数对象;
如果返回值等于0,表示当前对象等于参数对象;
如果返回值大于0,表示当前对象大于参数对象。
Comparable接口需要实现类重写compareTo()方法,根据对象的某个属性或多个属性进行比较,从而确定对象的大小关系。

一般情况下自定义类型可以进行比较 

比较器Comparator接口

用于定义两个对象之间的比较规则。它通常用于排序算法中,使得对象可以按照自定义的规则进行排序。

比较器接口中只有一个方法:compare(Object o1, Object o2),该方法用于比较两个对象。返回一个负整数、零或正整数,表示o1小于、等于或大于o2。根据返回值的不同,可以确定两个对象的相对顺序。

比较器的使用可以实现灵活的排序规则,不依赖于对象的自然排序。它可以按照不同的属性、不同的顺序进行排序,同时也可以处理特定的比较需求,例如忽略大小写比较字符串等。

 

Clonable 接口

Object 类中存在一个 clone 方法,调用这个方法可以创建一个对象的拷贝,要调用 clone 方法,需要先实现 Clonable 接口,否则就会抛出 CloneNotSupportedException 异常(不支持克隆异常)

class Person implements  Cloneable{//当自己写的类型支持克隆时,一定要使用克隆接口
    public String  name;
    public int age;
    public Money money = new Money();

    public Person(String name, int age) {//提供构造方法
        this.name = name;
        this.age = age;


    }

浅拷贝 VS 深拷贝

Cloneable接口的clone方法可以实现浅拷贝,如果要实现深拷贝,那么让需要对对象中的引用类型进行拷贝

深浅拷贝与代码的实现有关

 
浅拷贝: 只有一份地址 

深拷贝:克隆出一份地址 相当于有两份地址

Object类

概念

Object类是Java中所有类的父类它定义了一些通用的方法,可以被其他类继承重写

    public static void func(Object obj) {
        System.out.println(obj);
    }

    

类中的方法, 开锁的可以直接使用被public修饰;锁起来被private修饰(间接调用)

Object类中也有一些定义好的方法

 获取对象信息toString方法

如果要打印对象中的内容,就需要重写Object类中的toString()方法,不然会打印出它的地址(内存地址的字符串表示形式)

// Object类中的toString()方法实现:
public String toString() {
	return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

对象比较equals方法

要比较对象的内容是否相等,那就要用到equals方法,但是需要进行重写,因为它默认按地址进行比较的

我们常见的==就可以实现比较,它在比较时:
如果它左右操作数是基本类型变量,比较的是变量中值是否相同
如果左右两侧是引用类型变量,则比较引用变量地址是否相同

如果不重写,默认为:

 比较person:

@Override//idea可以直接生成
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Person person = (Person) o;
        return age == person.age && name.equals(person.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }
}
public static void main(String[] args) {


        Person person = new Person("zs", 10);
        Person person1 = new Person("zs", 10);
       // System.out.println(person == person1);
        System.out.println(person.equals(person1));
    }


内部类

概念

在 Java 中, 可以将一个类定义在另一个类或者一个方法的内部,前者称为内部类,后者称为外部类。内部类也是封装的一种体现.
public class OutClass {
class InnerClass{
}
}
// OutClass是外部类
// InnerClass是内部类
【注意事项】
1. 定义在 class 类名 {} 花括号外部的,即使是在一个文件里,都不能称为内部类
2. 内部类和外部类共用同一个 java 源文件,但是经过编译之后, 内部类会形成单独的字节码文件

分类

实例内部类

内部类生成的字节码文件--通过外部类引出

必须要静态的时候添加final--让时间更早

1. 外部类中的任何成员都可以在实例内部类方法中直接访问
 
2. 实例内部类所处的位置与外部类成员位置相同,因此也受public、private等访问限定符的约束
 
3. 在实例内部类方法中访问同名的成员时,优先访问自己的,如果要访问外部类同名的成员,必须:外部类名称.this.同名成员 来访问
 
4. 实例内部类对象必须在先有外部类对象前提下才能创建
 
5. 实例内部类的非静态方法中包含了一个指向外部类对象的引用
 
6. 外部类中,不能直接访问实例内部类中的成员,如果要访问必须先要创建建内部类的对象

静态内部类 

static修饰的内部成员类称为静态内部类。
注意事项
 
1. 在静态内部类中只能访问外部类中的静态成员
确实想访问:
2. 创建静态内部类对象时,不需要先创建外部类对象

 局部内部类

定义在外部类的方法体或者{}中,该种内部类只能在其定义的位置使用,一般使用的非常少。
 
注意事项
 
1. 局部内部类只能在所定义的方法体内部使用
2. 不能被public、static等修饰符修饰
3. 编译器也有自己独立的字节码文件,命名格式:外部类名字$数字内部类名字.class
4. 几乎不会使用

匿名内部类

  interface  IA {
            void test();
        }
public class test {
           // new IA();接口不能实例化
           public static void main(String[] args) {


            IA a=new IA() {
        @Override
        public void test () {
            System.out.println("重写接口的方法!");
        }
    };
            a.test();

 

 

相关文章:

  • 本地部署 DeepSeek R1 的几种常见方法
  • 在 UniApp 开发的网站中使图片能够缓存,不一直刷新
  • 委外订单不能删除提示领料未发量不能小于零
  • 【 PyQt】事件的触发:信号与槽
  • GitHub 项目版本管理与 Release 发布流程记录
  • HTTPS工作原理与安全机制详解(仅供参考)
  • 【RabbitMQ】事务
  • 查看端口被占用命令
  • FX-函数重载、重写(覆盖)、隐藏
  • Rust与Cargo版本关系(Rust版本、rustc、rustup)
  • 信息安全意识之安全组织架构图
  • ubuntu 24.04通过Flatpak安装迅雷
  • Dom详解
  • 02 | 快速部署 fastgo 项目
  • 在 Spring Boot 中实现基于 TraceId 的日志链路追踪
  • vue3-element-admin 前后端本地启动联调
  • IntelliJ IDEA v2024.3.4.1 Windows Java开发工具安装
  • 瑞芯微RK3576(2)-调试过程中遇到的问题
  • 如何用AI制作我们记忆中的乡村夜景
  • 获取URL字段的方法
  • 被前男友泼汽油致残后,一个女孩经历的双重灼烧
  • 汤加附近海域发生6.4级地震
  • 中国-拉共体论坛第四届部长级会议北京宣言
  • 著名连环画家庞邦本逝世
  • 外国游客“在华扫货”热:“带空箱子到中国!”
  • 沙县小吃中东首店在沙特首都利雅得开业,首天营业额5万元