美文网首页
常见的面向对象的问题

常见的面向对象的问题

作者: coder_斛律光 | 来源:发表于2018-05-11 00:38 被阅读36次

    一. 面向对象都有什么特征

    • 封装

    扩展问题1 private protected 默认的 public 修饰的时候 作用域

    private 类内部可以访问(类内部可以访问任意这个类对象的私有域)
    protected 和默认的 包内部可以访问 protected子类也可以访问
    public 可以被任意类使用

    • 继承

    类的继承
    接口的继承
    final 关键字修饰类 修饰方法

    • 多态
    1. 子类重写父类的方法 当父类作为引用 引用子类的对象的时候 调用这个重写的方法就会执行子类的方法
    2. 方法的执行过程
    1. 方法签名是根据 方法名和参数类型决定的 返回值不算
    2. 编译器根据方法名 参数来找到符合的方法
    3. private static final 三个关键词任意一个修饰方法的 编译器可以确定该执行哪个方法 (静态绑定)
    4. 程序运行时 动态绑定的方式 根据自己和父类的方法表 来找到实际类型的方法执行

    二. 抽象类和接口的区别
    https://www.cnblogs.com/dolphin0520/p/3811437.html
    三. Object的方法

    线程同步相关的 wait notify notifyAll

    问题 notify和notifyAll的区别
    notify等待队列中的一个 notifyAll 全部唤醒 都有了锁的争夺权

    gc 或者声明周期相关的 finalize
    对象比较 equals hashcode

    问题重写equals的时候 为什么重写hashcode (或者两个对象的equals 是true 那么他们的hashcode相同吗 )(hashcode相同 equals是true吗)

    1. hash算法 可以看下边的这个文章 hash算法的几个特点里 其中有一项就是避免冲突 所以冲突肯定有的
      https://blog.csdn.net/asdzheng/article/details/70226007
    2. java里hashcode 是native方法 看不了源码 但是我们可以推理
      1 首先string 重写了hashcode方法
      2 现在我定义一个类A 里面有一个String成员name
      3 重写A的hashcode方法 返回值就是name.hashcode()
      4 那么 "abc"和name是"abc"的A类型对象 hashcode相同 不重写equals方法 equals返回值肯定就是false了 即使你重写的话 你也要判断类型吧 类型都不同 肯定也是false
      5 结论 hashcode相同 equals 不一定true
    3. 不重写hashcode方法 那默认用的就是native的 java的hashcode算法为了避免冲突 他俩基本不一样 但是 我们equals是比较的某一个值 所以equals true的时候 hashcode也可以不一样
    4. 为什么重写equals的时候要重写hashcode 我觉一个例子
      1 假设String只重写了equals 那在使用hashmap的存放一个"abc" 做为key 然后又存了一个new String("abc");做为key 这时候他俩的hashcode不相等
      2 hashmap存放的时候 首先会计算一个hash值 算法是 拿出key的hashcode 然后用hashcode和 hashcode无符号右移16位 进行异或 这时候上述两个key的到的hash很可能不一样
      3 把2中的到的hash值和hashmap的数组长度进行&操作
      然后找到数组下标 然后判空 如果非空 在通过equals比较 。。。。这时候即使两个key他们equals返回为true 也会因为hashcode不同 而导致存了两个这样的key 显然不是想要的结果

    类相关的 getClass
    toString

    四 内部类 静态内部类 匿名内部类

    • 内部类
    1. 可以访问外部类的所有成员 所以他持有了外部类的引用 (不然他使用外部类成员的时候用的是外部类哪个对象的 )
    2. 当内部类访问外部类的私有成员的时候 编译不会出错 但是虚拟机运行的时候 是会给中间做一个桥接的 由于多调用了方法 所以性能上会降低 如果允许 可以把内部类要访问的成员 定义成protected的
    • 静态内部类
    1. 和一个普通的外部类没有区别 使用的时候 new 外部类.内部类构造()
    2. 静态内部类只能访问外部类的静态方法 和 静态变量
    • 匿名内部类
    1. 方法中 new onClickListener new Runnalbe 这种
    2. 京东面试的时候 面试官说new Thread 不是匿名内部类
      同学和我说 如果不是匿名的 那这个类名是啥。。。。。
    • 判断一个类是什么类型 通过Class的下列方法

    isAnonymousClass 匿名的
    isMemberClass 内部类
    isLocalClass 本地的 (方法中定义的类)

    相关文章

      网友评论

          本文标题:常见的面向对象的问题

          本文链接:https://www.haomeiwen.com/subject/gilarftx.html