抽象类
• 为什么需要抽象类? 如何定义抽象类?
• 是一种模版模式。 抽象类为所有子类提供了一个通用模版, 子类可以在这个模版基础上进行扩展。
• 通过抽象类,可以避免子类设计的随意性。 通过抽象类, 我们就可以做到严格限制子类的设计,使子类之间更加通用。
-
• 抽象方法和抽象类均必须用abstract来修饰。
• 抽象方法没有方法体, 只需要声明不需实现。 -
• 有抽象方法的类只能定义成抽象类
• 相反抽象类里面的方法不一定全是抽象方法, 也可能没有抽象方法。 -
• 抽象类可以包含属性、 方法、 构造方法。
• 抽象类不能实例化, 及不能用new来实例化抽象类, 只能用来被子类调用。
• 抽象类只能用来继承。
• 抽象方法必须被子类实现。 抽象类的子类必须覆盖所有的抽象方法才能被实例化, 否则还是抽象类
接口 interface
• 我们前面用继承关系, 描述了动物、 哺乳动物、 爬行动物的各种关系。
• 现在我们要描述:
• 飞机 导弹 子弹 篮球 石头的关系?
-
为什么需要接口?接口和抽象类的区别?
• 接口就是比“抽象类” 还“抽象” 的“抽象类” , 可以更加规范的对子类进行约束。 全面地专业地实现了 规范和具体实现的分离 。
• 接口就是规范, 定义的是一组规则, 体现了现实世界中“如果你是…则必须能…”的思想。 如果你是天使, 则必须能飞。 如果你是汽车, 则必须能跑。 如果你好人, 则必须干掉坏人; 如果你是坏人, 则必须欺负好人。
• 接口的本质是契约, 就像我们人间的法律一样。 制定好后大家都遵守。
• 项目的具体需求是多变的, 我们必须以不变应万变才能从容开发, 此处的“不变” 就是“规范” 。 因此, 我们开发项目往往都是面向接口编程! -
• 接口相关规则
• 接口中所有方法都是抽象的。
• 即使没有显式的将接口中的成员用public标示, 也是public访问类型的
• 接口中变量默认用 public static final标示, 所以接口中定义的变量就是全局静态常量。
• 可以定义一个新接口, 用extends去继承一个已有的接口。
• 可以定义一个类, 用implements去实现一个接口中所有方法。
• 可以定义一个抽象类, 用implements去实现一个接口中部分方法。 -
如何定义接口?
• 格式:
-
如何实现接口
• 子类通过implements来实现接口中的规范
• 接口不能创建实例, 但是可用于声明引用变量类型。
• 一个类实现了接口, 必须实现接口中所有的方法, 并且这些方法只能是public的。
• Java的类只支持单继承, 接口支持多继承 -
Java中, 一个类只能继承一个类, 但同时可以实现多个接口, 既可以实现多重继承的效
果和功能, 也避免的多重继承的危险性。
class Student extents Person implements Runner, Flyer
{…}
• 注意: extends 必须位于implements之前
内部类
将一个类定义置入另一个类定义中就叫作“内部类”
- 类中定义的内部类特点
• 内部类作为外部类的成员, 可以直接访问外部类的成员(包括private成员) , 反之则不行。
• 内部类做为外部类成员, 可声明为private、 默认、 protected或public。
• 内部类成员只有在内部类的范围之内是有效的。
• 用内部类定义在外部类中不可访问的属性。 这样就在外部类中实现了比外部类的private还要小的访问权限。
• 编译后生成两个类: OuterClass.class 和OuterClass$InnerClass.class - 内部类分类
• 成员内部类 静态内部类 方法内部类 匿名内部类
package cn.bjsxt.innerClass;
/**
* 测试内部类的使用
*
*/
public class Outer {
public static void main(String[] args) {
Face f = new Face();
Face.Nose n = f.new Nose();
n.breath();
Face.Ear e = new Face.Ear();
e.listen();
}
}
class Face {
int type;
String shape="瓜子脸";
static String color="红润";
class Nose {
void breath(){
System.out.println(shape);
System.out.println(Face.this.type);
System.out.println("呼吸!");
}
}
static class Ear {
void listen(){
System.out.println(color);
System.out.println("我在听!");
}
}
}
- 匿名内部类Anonymous
• 可以实现一个接口, 或者继承一个父类
• 只能实现一个接口
• 适合创建那种只需要一次使用的类, 不能重复使用。 比较常见的是在图形界面编程GUI里用得到。
• 匿名内部类要使用外部类的局部变量, 必须使用final修饰该局部变量
垃圾回收机制
-
对象空间的分配:
• 使用new关键字创建对象即可 -
对象空间的释放:
• 传统的C/C++语言, 需要程序员负责回收已经分配内存。 显式回收垃圾回收的缺点:
(1) 程序忘记及时回收, 从而导致内存泄露, 降低系统性能。
(2) 程序错误回收程序核心类库的内存, 导致系统崩溃。
• Java语言不需要程序员直接控制内存回收, 是由JRE在后台自动回收不再使用的内存, 称为垃圾回收机制(Garbage Collection)。
• 可以提高编程效率。
• 保护程序的完整性。
• 其开销影响性能。 Java虚拟机必须跟踪程序中有用的对象, 确定哪些是无用的。 -
垃圾回收机制关键点
• 垃圾回收机制只回收JVM堆内存里的对象空间。
• 对其他物理连接, 比如数据库连接、 输入流输出流、 Socket连接无能为力
• 现在的JVM有多种垃圾回收实现算法, 表现各异。
• 垃圾回收发生具有不可预知性, 程序无法精确控制垃圾回收机制执行。
• 可以将对象的引用变量设置为null, 暗示垃圾回收机制可以回收该对象。
• 程序员可以通过System.gc()或者Runtime.getRuntime().gc()来通知系统进行垃圾回收, 会有一些效果, 但是系统是否进行垃圾回收依然不确定。
• 垃圾回收机制回收任何对象之前, 总会先调用它的finalize方法(如果覆盖该方法, 让一个新的引用变量重新引用该对象, 则会重新激活对象) 。
• 永远不要主动调用某个对象的finalize方法, 应该交给垃圾回收机制调用。