世界上并没有完美的程序,但我们并不因此而沮丧,因为写程序本来就是一个不断追求完美的过程。 ——摘自周志明

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. 初始化顺序

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

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

        第一步,先类初始化(如上所示)
        第二步,声明实例变量(成员变量)默认值
        第三步,显示实例变量赋值/非静态代码块赋值(这俩同级别,按顺序执行)
        第四步,构造器(有父类的,先就先调用父类的构造器)
      
posted @ 2018-10-16 22:45  白杯与咖啡  阅读(143)  评论(0编辑  收藏  举报