一、final和抽象类
1、final作用
- 修饰变量:被final修饰的变量是常量
- 修饰基本数据类型:只能赋值一次
- 修饰引用数据类型:对象不能被赋值,但属性可以修改
- 修饰方法:被final修饰的方法不能被重写
- 修饰类:被final修饰的类不能被继承
2、抽象类
注意:
- 有抽象方法的类只能定义成抽象类
- 抽象类不能实例化,即不能用new来实例化抽象类。
- 抽象类必须有构造方法,创建子类对象的时候使用
- 一个抽象类至少0个抽象方法,至多(所有的方法都是抽象方法)个抽象方法
- 子类必须重写父类的抽象方法,不重写就提示编译错误;或者子类也定义为抽象类
二、接口
1、使用要点:
- 声明:权限修饰符 interface 接口名
- 接口中的方法是抽象方法
- 一个类实现了接口,必须实现接口内的方法,否则变为抽象类
- 一个类实现了接口,此类可以作为此接口的子类存在
- 一个类可以实现多个接口,必须实现各个接口中的方法,否则变为抽象类
- 一个接口可以继承多个接口 ,实现此接口的类,必须实现各个接口内的方法 ,否则变为抽象类
- 接口中的变量 是全局静态常量,默认被 public staic final 修饰
- 接口内的方法 默认被 public abstract 修饰
- 接口不能创建实例
2、接口应用
内部比较器:
图书类、学生类、新闻类、商品类等是不同的类,可是却都需要有比较的功能,怎么办?共同的父类不可以,可以定义一个比较接口Comparable,其中定义一个实现比较的方法compareTo(Object obj)。让各个类实现该接口即可。
3、接口新特征
jdk1.8及以后
- 接口中可以添加非抽象方法(static),实现类不能重写,只能通过接口名调用。
- 接口中可以添加非抽象方法(default),实现类可以重写,只能通过对象名调用。
jdk1.9
- 接口中可以定义private的非抽象方法。便于将多个方法中的冗余代码进行提取,并且不对外公开。减少冗余、也实现了代码隐藏。
4、面向接口编程
接口就是规范,就是项目中最稳定的核心! 面向接口编程可以让我们把握住真正核心的东西,使实现复杂多变的需求成为可能。
通过面向接口编程,而不是面向实现类编程,可以大大降低程序模块间的耦合性,提高整个系统的可扩展性和和可维护性。
三、内部类
1、非静态成员内部类
- 内部类可以直接访问外部类的成员(变量/方法)
- 外部类不能直接访问内部类的成员,需要先创建对象再通过对象名访问
- 内部类访问外部类的同名成员变量:OuterClass.this.num
- 必须先创建外部类的对象,才能创建内部类的对象。格式:OuterClass.InnerClass = new OuterClass().new InnerClass;
- 非静态内部类不能有静态方法、静态属性和静态初始化块。
2、静态成员内部类
- 静态内部类只能够访问外部类的静态成员
- 静态内部类访问外部类的同名成员变量:OuterClass.name;
- 静态内部类属于整个外部类的。创建静态内部类的对象,不需先创建外部类的对象;
- 创建内部类对象格式:OuterClass.InnerClass = new OuterClass.InnerClass();
- 外部类可以通过类名直接访问内部类的静态成员
3、局部内部类
局部内部类访问所在方法的局部变量,要求局部变量必须使用final修饰。JDK1.8中final可以省略,但是编译后仍旧会加final。
4、匿名内部类
- 匿名内部类可以实现一个接口,也可以继承一个类(可以是抽象类)。
- 匿名内部类只能实现一个接口,而不是多个
- 必须实现所有的方法,匿名内部类不能是抽象类
- 匿名内部类不可能有构造方法,因为类是匿名的
- 匿名内部类没有访问修饰符
四、虚拟机和垃圾回收
1、虚拟机构成
虚拟机:类加载器、运行时数据区、执行引擎、本地(native)方法接口、本地方法库、垃圾回收器。
运行时数据区:方法区(元空间metaspace)、堆区、虚拟机栈、本地方法栈、程序计数器。
2、垃圾回收
- 垃圾回收机制主要是回收JVM堆内存里的对象空间。
- 垃圾回收发生具有不可预知性,程序无法精确控制垃圾回收机制执行。
- finalize:垃圾被回收前,最后调用的方法。但永远不要主动调用某个对象的finalize方法,应该交给垃圾回收机制调用。