🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[TOC] # 面向对象三大特性 封装、继承、多态。 * 封装隐藏了类的内部实现机制,可以在不影响使用的情况下改变类的内部结构,同时也保护了数据 * 继承可以重用父类代码,实现代码复用和可扩展的效果 * 多态指对象的一个方法在调用时可以有多种状态,即父类引用可以持有子类对象 * 多态实现的两种形式:基于继承重写、基于接口 * 多态存在的三个条件:继承、重写、父类引用持有子类对象 * 非静态成员方法的调用:编译看父类,运行看子类 * 多态优点:不用创建一堆子类对象的引用;多态缺点:不能使用子类特有的成员属性和成员方法 # 静态绑定和动态绑定 * 绑定指一个方法的调用与方法所在的类关联起来 * 静态绑定:编译过程中编译器已经准确的知道这个方法属于哪个类了 * 动态绑定:需要在运行时根据对象具体的类型来绑定,来选择调用哪个类的方法 * private方法、static方法、final方法、构造器方法都是静态绑定的;其他方法全部为动态绑定 # 方法的重载与重写 * 重载指在一个里面,方法名字相同,参数不同,返回类型可相同也可不同。常用于构造器重载 * 重写指子类对父类允许访问的方法的实现过程进行重新编写,返回值和形参都不能变 # 本地变量、实例变量以及类变量之间的区别 * 本地变量就是局部变量,定义在方法内部或者方法的形参中 * 实例变量为为非静态变量,隶属于对象,每一个对象的实例变量都不同 * 类变量为静态变量,隶属于类 # 形参与实参 * 形参是定义方法时使用的参数,出现在方法定义中,在整个方法内可以使用,离开该方法不能使用。 * 实参是用于调用方法时传递给方法的参数。 # 引用分类 1、强引用:是使用最普遍的引用。如果一个对象具有强引用,那垃圾回收器绝不会回收它。 2、软引用:如果内存空间足够,垃圾回收器就不会回收软引用对象;如果内存空间不足,就会回收软引用对象。 3、弱引用:弱引用对象比软引用对象生命周期更短,垃圾回收器扫描时一旦发现弱引用对象,就会回收它。垃圾回收器优先级不高,所以不一定很快发现弱引用对象。 4、虚引用:虚引用对象就和没有被引用一样,任何时候都可能被垃圾回收器回收。一般用于跟踪对象被垃圾回收器回收的过程,如开源库LeakCanary。 # 值传递与引用传递 1、Java总是采用按值调用,方法得到的是参数值的一个拷贝。 2、一个方法不能改变其参数的值,如果是基本类型参数不能改变参数的值,如果是对象参数不能改变参数的引用指向(但可以改变所指向对象的属性) # final关键字的理解 1、final的意思是【无法改变的】、【最终的】,可以修饰非抽象类、非抽象类的成员变量和成员方法 2、final类不能被继承,没有子类,其中的方法默认是final的 3、final方法不能被重写,但可以被继承(final不能用于修饰构造方法) 4、final成员变量表示常量,只能被赋值一次,赋值后不再改变。 5、使用final声明基础数据类型时,数值恒定不变;使用final声明对象引用时,引用的对象恒定不变,但对象的数据可变;使用final声明数组类型时,引用的数组恒定不变,但数组内的数据可变。 优点: 1、编译器遇到final方法时会转入内嵌机制,提高效率。 2、可以安全的在多线程环境下共享,不需要额外的同步开销。 # Java类加载的时机 1、加载顺序:加载 -> 验证 -> 准备 -> 解析 -> 初始化 -> 使用 -> 卸载 2、解析有时可以在初始化之后进行 3、Java虚拟机没规定什么时候进行加载,但规定以下几种情况需要进行初始化,当然初始化前的那几步操作需要在初始化前完成。 a、new一个实例对象时,读取或设置一个类的静态字段时,调用一个类的静态方法时 b、反射调用时,如果没初始化需要触发初始化 c、初始化一个类时,如果其父类还未初始化,需要先触发父类的初始化 d、虚拟机启动时,会先初始化主类 # Java类加载调用顺序 1、基类静态代码块、基类静态成员变量(优先级相同,按代码出现顺序依次执行)(只有第一次加载类时执行) 2、派生类静态代码块、派生类静态成员变量(优先级相同,按代码出现顺序依次执行)(只有第一次加载类时执行) 3、基类普通代码块、基类普通成员变量(优先级相同,按代码出现顺序依次执行) 4、基类构造函数 5、派生类普通代码块、派生类普通成员变量(优先级相同,按代码出现顺序依次执行) 6、派生类构造函数 # 抽象类和接口区别 * 抽象类可以包含抽象方法和具体方法;接口只能包含抽象方法 * 抽象类方法可使用public、protected、private修饰符;接口方法默认使用public static修饰,成员变量默认使用public static final修饰 * 一个抽象类只能继承一个父类;但一个接口可以继承多个父接口 * 相同点:二者都不可以实例化 # 为什么匿名内部类使用局部引用要用final 1、匿名内部类属于一种局部内部类。 2、编译后局部内部类中会有一个成员变量,是对外部局部变量的引用的拷贝,在局部内部类使用外部局部变量值时都是通过这个引用进行的。 3、为避免这个成员变量的值(引用的对象)被外部类的方法修改,导致内部类在使用时得到的值不一样,需要使用final让该成员变量不可变。 4、局部变量位于方法内部,在虚拟机的栈上,意味着这个变量无法进行共享,匿名内部类无法直接访问,只能通过值传递的方式,传递给匿名内部类。 5、而类的成员变量在虚拟机的堆上,内部类可以直接获取这个变量,故类的成员变量不需要声明为final内部类就可访问。 # 什么是匿名内部类 1、匿名内部类即没有名字的内部类,只可被使用一次 2、使用匿名内部类前提条件:必须继承自一个父类或实现一个接口 3、语法格式为 new 父类构造器(参数列表)|实现接口(){} 4、直接将抽象类的方法或者接口方法在大括号中实现,可以省略一个类的书写 5、匿名内部类中不能定义构造方法,但可以使用初始化语块代替构造方法