java就业--------03

java就业--------03

一、内部类

  • 什么是内部类?

    • 在类的内部即为内部类
  • 内部类的格式?

    public class Outer{

    ​ public class Inner{

    ​ }

    ​ }

  • 内部类成员的访问特点是什么?

    • 内部类访问外部类:直接使用即可,包括被private修饰的
    • 外部类访问内部类:先创建对象 -> 通过对象调用内部类方法
  • 内部类分为哪两种?

    • 成员内部类
    • 局部内部类
  • 成员内部类在类中的什么位置?

    • 类中方法外
  • 外界使用成员内部类的格式?

    • Outer .Innter oi = new Outer().new Inter();
      • 内部类为了隐藏,不让外界直接访问,间接访问
        • 在外部类的方法中 --> 创建内部类对象(可以直接访问)
        • 在外部类方法中 – > 使用创建好的内部类对象调用内部类的方法
  • 局部内部类

    • 局部内部类定义在类中什么位置?
      • 外部类的成员方法中的位置
  • 外界如何使用局部内部类?

    • 在定义的方法中创建内部类对象
    • 通过内部类对象调用内部类的方法
    • 创建外部类对象,通过外部类调用方法
  • 匿名内部类

    • 匿名内部类的使用前提是什么?

      • 有具体类/抽象类
    • 格式?

      • new 类名/接口名(){

        ​ //重写方法;

        }

  • 匿名内部类的本质是什么? 匿名内部类不是接口,抽象类实例化了

    • 抽象类 --> 子类的匿名对象
    • 接口 --> 实现类的匿名对象
  • 什么情况下我们推荐使用匿名内部类?

    • 单次使用
    • 当接口/抽象类的需要重写的方法只有一个的时候

二、Object类

2.1toString()方法

  • Object类是什么类?

    • Object为什么有个参方法呢? - > 所有类直接或者间接集成Object类,所以说每个类的无参构造都会more调用Object父类的无参构造方法
  • 我们直接打印对象,打印出来的是对象的全限定类名+@+地址值,执行流程是什么?

    Student s = new Student(); -> Student类默认没有重写toString()方法.
    System.out.println(s);
    
    public void println(Object x) {
    		//Object x -> Student对象s.
            String s = String.valueOf(s);
            //s = 全限定类名+@+虚拟机根据情况生成一段代码.
            print(s);
        }
        
    public static String valueOf(Student s) {
    	//判断Student对象s是不是为null,如果不是调用了s对象的toString方法.
        return (s == null) ? "null" : s.toString();
    }
    Student没有重写toString()-> 所以说默认调用父类Object类的toString方法.
    public String toString() {
    		//全限定类名+@+虚拟机根据情况生成一段代码.
            return getClass().getName() + "@" + Integer.toHexString(hashCode());
        }
    
  • 我们为什么要重写toString方法

    • 重写toString方法,可以让我们直接打印对象之后,获取到对象的属性值。
      • 推荐每个类都去重写toString方法

2.2equals()方法

  • 我们对比两个引用类型的值是否相同为什么不用==来比较?

    • ==比较引用类型的时候 ==> 比较的是地址值
  • String类可以使用equals进行值的比较,为什么我们自己写的类,创建完对象之后,可以调用equals方法,但是即便属性值相同,比较出来的也是false?

    • 自己写的类,没有重写equals()方法,默认调用了是Object;类的equals() Object类的equals方法默认还是比较的是地址值
    • String重写了equals方法可以比较内容。
  • 重写equals方法完成后,equals方法的执行流程是什么?

    @Override
        public boolean equals(Object o) {
            //1.比地址值 -> 如果不同,向下比较,如果相同,返回true.
            if (this == o) return true;
            //2.比较是不是一个类并且判断参数o是不是为null -> 如果以上两种满足任意一种,则返回false.
            if (o == null || getClass() != o.getClass()) return false;
    		//3.向下转型 -> 转成什么型? 谁调用就转为谁.
            Student student = (Student) o;
    		
            //4.比较各个属性是否一样.
            if (age != student.age) return false;
            if (name != null ? !name.equals(student.name) : student.name != null) return false;
            return school != null ? school.equals(student.school) : student.school == null;
    
        }
    
  • 为什么同时要重写hashCode方法?不重写是否可以?–> 可以更高效

  • equals方法的等价关系了解 --> 面试题

      • 自反性
        • x.equals(x) -> true.
      • 对称性
        • x.equals(y) y.equals(x) -> 结果需要一样.
      • 传递性
        • x.equals(z) y.equals(z) -> 结果如果都为true,x.equals(y) -> 也为true.
      • 一致性
        • x.equals(y) -> 在不改变二者的属性的前提下,调动多少次这个方法结果都一样.
      • 非空型
        • x.equals(null) -> false
    • 推荐每个类都重写equals和hashCode.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值