常用类第26天(匿名内部类,Object类,getClass(),hashCode(),toString())

匿名内部类

  • 没有类名的局部内部类(一切特征都与局部内部类相同)
  • 必须继承一个父类或者实现一个接口
  • 定义类,实现类,创建对象的语法合并,只能创建一个该类的对象
  • 优点:减少代码量
  • 缺点:可读性差
    例:
  1. 创建一个Usb接口,里面有个server()方法
    image
  2. 创建一个Mouse类,继承USB接口,重写server()方法
    image
  3. 使用
  • 创建接口类型的变量,调用service()方法
	Usb usb=new Mouse();
        usb.service();

image

  • 使用局部内部类继承接口重写方法,然后使用局部内部类创建对象调用方法
//局部内部类
        class Fan implements Usb{
            @Override
            public void service() {
                System.out.println("连接电脑成功,风扇开始工作!");
            }
        }
        //使用局部变量创建对象
        Usb usb = new Fan();
        usb.service();

image

  • 使用匿名内部类优化(相当于创建了一个局部内部类)
Usb usb= new Usb() {
            @Override
            public void service() {
                System.out.println("连接电脑成功,风扇开始工作!");
            }
        };
        usb.service();

image

Object类

  1. 超类,基类,所有类的直接或间接父类,位于继承树的最顶层
  2. 任何没有写extends显示继承某个类的,都默认直接继承Object类
  3. Object类中所定义的方法,是所有对象都具备的方法
  4. Object类型可以存储任何对象
  • 作为参数,可以接受任何对象
  • 作为返回值,可以返回任何对象

getClass()方法

public final Class<?> getClass(){}

返回引用中存储的实际对象类型.
注意:返回值是一个Class类型的
应用:通常用于判断两个引用中实际存储对象类型是否一致.
例:创建一个Student类,实例化两个对象,通过getClass()方法判断

Student s1 = new Student("张三",15);
        Student s2 = new Student("张三",15);

        //通过getClass判断s1和s2是不是同一个类型
        Class class1= s1.getClass();
        Class class2= s2.getClass();
        if(class1==class2)
        {
            System.out.println("s1和s2是同一个类型");
        }
        else {
            System.out.println("s1和s2是不同一个类型");
        }

image

hashCode()方法

public int hashCode(){}

返回该对象的哈希码值.
哈希值根据对象的地址或字符串或数字使用hash算法计算出来的int类型的数值
一般情况下相同对象返回相同哈希码

	Student s1 = new Student("张三",15);
        Student s2 = new Student("张三",15);
        Student s3=s2;
        System.out.println(s1.hashCode());
        System.out.println(s2.hashCode());
        System.out.println(s3.hashCode());

在栈里定义了两个变量s2和s3,然后这两个变量都指向了堆里的同一个对象
image

toString()方法

public String toString(){}

返回该对象的字符串表示(表现形式)
可以根据程序需求覆盖该方法(也就是重写),如:展示对象的各个属性值
例:

	Student s1 = new Student("张三",23);
        Student s2 = new Student("李四",21);
        System.out.println(s1.toString());
        System.out.println(s2.toString());

如果不重写toString方法,将会返回该对象的地址及十六进制的哈希值,以下为toString源码
image
以下为运行结果:
image
使用Alt+Insert将toString重写之后的代码及运行结果

@Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

image

posted @   不再犹豫27  阅读(17)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示