超类 与 内部类

本文详细介绍了Java中的Object类及其常用方法,如getClass、hashCode、toString和equals,强调了它们在实际开发中的应用。同时,探讨了内部类的四种类型,包括成员内部类、静态内部类、局部内部类和匿名内部类,阐述了它们的特点和使用场景。通过实例展示了如何判断对象类型、比较对象内容以及自定义对象的字符串表示。此外,还提及了垃圾回收器与finalize方法的关系。
摘要由CSDN通过智能技术生成

源码之超类常用的一些方法

     基于面向对象的思想,想把万物皆作为对象,统一管理,最小的数据类型往下诞生了包装类,而往上则是全部类的父类,根类object类,称为超类,并默认他是所有的类的父类。

  一、想记住他的方法和属性先要了解比较基础的内部类有以下几种:

  ①:成员内部类:位置:类以内,方法以外。
     成员内部类类比于实例变量。创建成员内部类的对象,需要依赖于外部类的对象进行创建,成员内部类可以直接访问外部类的私有成员,外部类类名.this :指向外部类的当前对象
     外部类类名.this.属性:访问外部类的属性

  ②:静态内部类,被static修饰后的成员内部类,不再依赖对象存在,便成为静态内部类,我们在编程时,可能会有以下bug,写了个调用函数,没加静态修饰,在主函数调用编译会报错,这是因为,没有被static修饰的方法,是基于对象存在,要么建个对象,要么加上静态修饰,就可以无障碍使用。
     创建静态内部类的对象,需要依赖于外部类的类名:Outer.Inner   i = new  Outer.Inner();当然静态内部类只能直接访问外部类的静态成员(静态属性和静态方法,这也是因为没被static修饰的属性是基于对象而存在,所以没加的当然不可使用。

  ③:局部内部类,局部内部类类似方法的局部变量,所以在类外或者类的其他方法中不能访问这个内部类,但这并不代表局部内部类的实例和定义了它的方法中的局部变量具有相同的生命周期。
     局部内部类可以访问所在方法内部的局部变量, 但是局部变量必须被final修饰,jdk8.0开始自动将 局部内部类访问的局部变量加final修饰,此语法称为 语法糖(编程语言中可以更容易的表达一个操作的语法)
     只能在方法内部,类(局部内部类)定义之后使用,不存在外部可见性问题,因此没有访问修饰符,可以使用final 与 abstract修饰。
     可以访问外围类的成员变量。如果是static方法,则只能访问static修饰的成员变量。

  ④:匿名内部类,可以看作是特殊的局部内部类,名气比较大而已,比匿名内部类更简洁的语法叫lambda表达式,不过使用场景却有限制,只能用于只有一个方法的(接口或者抽象类)因为Lambda表达式通过invokedynamic指令实现,不会产生新的类。
     不同点:匿名内部类可以为任意接口创建实例——不管接口包含多少个抽象方法,只要匿名内部类实现所有的抽象方法即可。
     但Lambda表达式只能为函数式接口创建实例。
     匿名内部类可以为抽象类、甚至普通类创建实例,但Lambda表达式只能为函数式接口创建实例。
     匿名内部类实现的抽象方法的方法体允许调用接口中定义的默认方法;但Lambda表达式的代码块不允许调用接口中定义的默认方法。

  ⑤:总结:他们的共同特点是编译之后可分别生成独立的字节码文件,匿名内部类仍然是一个类,只是不需要程序员显示指定类名,编译器会自动为该类取名。内部类可直接访问外部类的私有成员,而不破坏封装。 可为外部类提供必要的内部功能组件。

  二、了解完基础的类之后,就可以开始熟悉他的方法了:

  1.要知道的是Object类中的方法是每个类都默认的功能方法
  2. 常用方法:
     (1) getClass():被final修饰,允许子类继承, 不允许覆盖
       a. 作用:获取引用中实际存储的对象类型
       b. 实际开发应用:通常用于判断两个引用中存储 的实际对象类型是否一致,一致-true;不一致- false
       c.案例: Animal a1 = new Dog(); Animal a2 = new Cat(); Animal a3 = new Cat();
          System.out.println(a1.getClass());// Dog
          System.out.println(a2.getClass());// Cat
          System.out.println(a1.getClass() = = a2.getClass()); //false
          System.out.println(a2.getClass() = = a3.get Class()); //true 与instanceof不同,父类子类也是false
       d. instanceof:引用名 instanceof 类 型,用于判断前面引用中存储的实际对象类型是否为后 面类型一种

     (2) int hashCode():没有被final修饰,允许覆盖
       a. 作用:返回对象的哈希码值
       b. Object类中hashCode获取的哈希码值:将 对象在内存中十六进制的地址转换为十进制的结果
       c. 注意:由于不同对象在内存中地址不同,所以 不同的对象会有不同的哈希码值
hashCode:对象的内存地址转换的十进制的结果;
     (3) String toString():没有被final修饰,允 许覆盖
       a. 作用:返回对象的字符串表现形式 ,该字符串由类名(对象是该类的一个实例)、at 标记符“@”和此对象哈希码的无符号十六进制表示组成。换句话说,该方法返回一个字符串,它的值等于:
       getClass().getName() + ‘@’ + Integer.toHexString(hashCode())
       举个例子:当前位置包名.类名@1540e19d

       b. 实际开发:实际开发中通常需要覆盖 toString方法,将所有的属性值拼接为一个字符串类 型的结果作为返回值进行返回
       c. 案例: public String toString(){ return “name=”+name+“,age=”+age; }
       d. toString方法:为了方便开发人员做对象信 息展示 get方法:获取单个属性值,而且不改变属性 的数据类型
       e. 总结:Student、Worker等实体类的常规写 法 class 类名{ // 属性-private // 提供无参数、有参数的构造方法 // 提供get/set // 覆盖toString方法(为了展示对象 信息方便)}

toString方法:以字符串的形式展示用户的属性信息 建议类覆盖toString,为了开发人员方便 equals:用于判断对象的内容是否相同,需要覆盖

     (4) boolean equals(Object obj):没有被 final修饰,允许覆盖
       a. 作用:判断两个对象的内容是否相同,相同- true;不相同-false
       b. = = 的应用:如果 = = 两端是基本数据类型,比较数值是 否相等;如果双等号两端是引用类型,比较引用中存 储的地址是否相同。
       c. = = 在实际开发中作用:通常利用 = = 判断两个 引用是否指向同一个对象,true代表存储同一个对象,false代表 存储不同的对象
       d. Object类中提供的equals方法的源码如下: public boolean equals(Object obj) { return (this = = obj);//地址 }结论:Object中equals比较对象的地址,如 果想比较对象的内容是否相等,需要覆盖equals方法
       e. equals方法覆盖的步骤: // 覆盖equals方法 public boolean equals(Object obj){ // 将 this 和 obj进行比较 // 1. 自反性:判断两个引用是否指向同 一个对象 if(this= =obj){ return true; }// 2. 判断 obj 是否为 null if(obj = = null){ return false; }// 3. 判断两个引用存储的实际对象类型 是否相同 if(this.getClass() != obj.getClass()){ return false; }// 4. 强制类型转换:为下步准备 Student s= (Student)obj; // 5. 将两个对象的所有属性进行一一比 较
// 基本- = = 引用-equals if(this.age = = s.age && this.score = = s.score && this.name.equals(s.name)){ return true; }else{return false; } }

     (5) void finalize():没有被final修饰,允许 覆盖
       a. 作用:垃圾回收器进行回收垃圾对象时,jvm 自动调用方法
       b. 垃圾对象:如果没有任何引用指向的对象 c. 垃圾回收器:简称GC/gc,jvm用于回收垃圾 对象 d. 回收垃圾对象的目的:清除垃圾对象,提高空 间的利用率
       c. 垃圾回收器回收垃圾对象的时机:
         I. 自动回收机制:当jvm内存被占用满时, jvm启动gc 对垃圾对象进行清理回收,gc在进行垃圾 对象回收时,jvm自动finalize方法 ,jvm自动调用的方 法
         II. 手动回收机制:利用System.gc()通知 垃圾回收器进行回收垃圾对象,如果GC空闲-进行垃圾 回收;如果GC繁忙-暂不回收

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值