• 6面向对象高级特性


    java.lang.object包

    1. oblect类是所有类的根父类
      • 根父类

          一个类不管是否显示声明extends Object,它都是Object的子类。数组也是。
        
      • 继承特性

          根据继承特性,则所有派生类具有object的属性和方法。
        
      • 多态特性

          1、Object类型的引用变量可以接收任何类型的对象
          2、Object类型的形参可以接收任何类型的实参
        
    2. Object 类中的主要方法
      • "=="与equals的区别?

          1、==用于比较基本数据,是否相等,相等则为true
            用于比较引用数据时,比较的是对象的地址,同一个对象时返回true
          2、equals()用于比较对象时
          	如果没有重写equals()则和==效果一样,比较地址。
          重写该方法,则根据自己定义的规则比较。
        
      • hashcode()

          用于计算对象的hash值。
          特点:1、如果两个对象的hashCode值不相等,那么这两个对象一定不相等
          	2、如果两个对象的hashCode值相等,那么这两个对象可能相等,可能不相等
           	3、如果两个对象调用==或equals相等,那么这两个对象的hashCode值一定相等。
        
      • toString()方法

          1、object类中的toString
          	return getClass().getName() + '@' + Integer.toHexString(hashCode())
          2、在进行String与其它类型数据的连接操作时,自动调用toString()方法
          3、可以根据需要在用户自定义类型中重写toString()方法
          	 System.out.println(s1);
          	//相当于System.out.println(s1.toString());
        
      • finalize()

          1、此方法不是程序员手动调用的,而是gc调用的,当一个对象被gc回收之前会调用finalize()(留临终遗言)。
          2、每一个对象的该方法只能被调用一次。如果某个对象被重写的finalize()中有一个变量再次引用了this当前对象,那么当前对象就活了,这次gc就不回收此对象。不过,下次再变成垃圾后,gc直接回收它,不在调用finalize().
          3、一般情况下不会重写该方法,只有这个类表示某种连接资源时,FileInputStream或FileOutputStream,可能需要重写,为了该类的对象被gc回收前,释放系统资源。
        

    static

    1. 为什么有static

       中国人实例,都有国际属性,每个实例此属性的值一致,因此不必每个实例都存此值,只需要保留一份。
      
    2. static的修饰范围

       属性、方法、代码块、内部类
      
      • 静态变量的特点
        • 随着类的初始化而初始化,优先于实例对象的创建
        • 修饰的成员,被所有对象所共享
        • 访问权限允许时,可不创建对象,直接“类名.xx”调用
        • 类变量的值存储在方法区
        • 类变量的get/set方法也是静态的
      • 静态方法也叫类方法,特点
        • static修饰的方法,只有访问权限允许,可以通过"类名.方法"访问,因此static的方法也称为类方法。
        • 在static方法内部只能访问类变量与类方法(static属性和方法),不能访问类的实例变量和成员方法(非static属性和方法)。
        • static方法内部不能有this和super。
        • 如果在静态方法中有局部变量与类变量重名,可以使用“本类名.xxx”
        • 如果在静态方法中想要访问父类的静态成员,可以使用“父类名.xxx”
        • static修饰的方法不能被重写,或者说不会被覆盖

    重写只适用于可见的实例方法,不能用于static、final、private修饰的方法

    代码块

    1. 静态代码块

       (1)可以为类变量(静态的属性)初始化
       (2)随着类的初始化而初始化,只执行一次
       (3)如果子类初始化时,它的父类没有初始化会先初始化父类
       (4)在静态代码块中不能访问非静态成员(属性、方法、内部类)
       (5)在静态代码块中不能使用this和super关键字
       如果有重名问题,需要访问本类或父类的静态成员,那么可以使用“本类名.xx”、“父类名.xx”
       如果没有重名问题,直接访问即可。
      
    2. 非静态代码块

       (1)可以为实例变量(非静态的属性)初始化
       (2)随着对象的创建而初始化,每创建一个对象,就执行一次
       (3)创建子类对象时,需要先为从父类继承的属性进行初始化,所以会导致父类的构造块和构造器先执行
       (4)本类的非静态代码块优先于构造器执行
      
    3. 初始化顺序

      • 类初始化(不创建对象,仅仅初始化类)

          第一步,声明类变量的默认值
          第二步,类变量显示初始化/静态代码块初始化(这俩同级别,按顺序执行)
        
      • 创建对象

          第一步,先类初始化(如上所示)
          第二步,声明实例变量(成员变量)默认值
          第三步,显示实例变量赋值/非静态代码块赋值(这俩同级别,按顺序执行)
          第四步,构造器(有父类的,先就先调用父类的构造器)
  • 相关阅读:
    HashMap源码解析
    深入理解Java字符串
    Netty粘包、半包
    Netty源码分析-Future和Promise
    Lock简介
    一、Netty中的EventLoop
    对象实例化内存布局与访问定位
    运行时数据区概述及线程
    TCP三次握手和四次挥手
    Redis线程IO模型-Redis 单线程为什么还能这么快?
  • 原文地址:https://www.cnblogs.com/xingrui/p/9801224.html
Copyright © 2020-2023  润新知