JAVA300集——抽象类-接口-内部类-垃圾回收机制

本文深入探讨了抽象类和接口的概念,解释了为什么需要它们,以及它们在Java编程中的作用。详细介绍了抽象类的定义、特性及其与子类的关系,接口的定义、规则以及与抽象类的区别。

抽象类

• 为什么需要抽象类? 如何定义抽象类?
• 是一种模版模式。 抽象类为所有子类提供了一个通用模版, 子类可以在这个模版基础上进行扩展。
• 通过抽象类,可以避免子类设计的随意性。 通过抽象类, 我们就可以做到严格限制子类的设计,使子类之间更加通用。
在这里插入图片描述

  1. • 抽象方法和抽象类均必须用abstract来修饰。
    • 抽象方法没有方法体, 只需要声明不需实现。

  2. • 有抽象方法的类只能定义成抽象类
    • 相反抽象类里面的方法不一定全是抽象方法, 也可能没有抽象方法。

  3. • 抽象类可以包含属性、 方法、 构造方法。
    • 抽象类不能实例化, 及不能用new来实例化抽象类, 只能用来被子类调用。
    • 抽象类只能用来继承。
    • 抽象方法必须被子类实现。 抽象类的子类必须覆盖所有的抽象方法才能被实例化, 否则还是抽象类

接口 interface

• 我们前面用继承关系, 描述了动物、 哺乳动物、 爬行动物的各种关系。
• 现在我们要描述:
• 飞机 导弹 子弹 篮球 石头的关系?

  1. 为什么需要接口?接口和抽象类的区别?
    • 接口就是比“抽象类” 还“抽象” 的“抽象类” , 可以更加规范的对子类进行约束。 全面地专业地实现了 规范和具体实现的分离
    • 接口就是规范, 定义的是一组规则, 体现了现实世界中“如果你是…则必须能…”的思想。 如果你是天使, 则必须能飞。 如果你是汽车, 则必须能跑。 如果你好人, 则必须干掉坏人; 如果你是坏人, 则必须欺负好人。
    • 接口的本质是契约, 就像我们人间的法律一样。 制定好后大家都遵守。
    • 项目的具体需求是多变的, 我们必须以不变应万变才能从容开发, 此处的“不变” 就是“规范” 。 因此, 我们开发项目往往都是面向接口编程

  2. • 接口相关规则
    • 接口中所有方法都是抽象的。
    • 即使没有显式的将接口中的成员用public标示, 也是public访问类型
    • 接口中变量默认用 public static final标示, 所以接口中定义的变量就是全局静态常量
    • 可以定义一个新接口, 用extends去继承一个已有的接口
    • 可以定义一个类, 用implements去实现一个接口中所有方法。
    • 可以定义一个抽象类, 用implements去实现一个接口中部分方法。

  3. 如何定义接口?
    • 格式:
    在这里插入图片描述

  4. 如何实现接口
    • 子类通过implements来实现接口中的规范
    • 接口不能创建实例, 但是可用于声明引用变量类型。
    • 一个类实现了接口, 必须实现接口中所有的方法, 并且这些方法只能是public的
    • Java的类只支持单继承, 接口支持多继承

  5. Java中, 一个类只能继承一个类, 但同时可以实现多个接口, 既可以实现多重继承的效
    果和功能, 也避免的多重继承的危险性。

class Student extents Person implements Runner, Flyer
    {…}
 • 注意: extends 必须位于implements之前

内部类

将一个类定义置入另一个类定义中就叫作“内部类”

  1. 类中定义的内部类特点
    • 内部类作为外部类的成员, 可以直接访问外部类的成员(包括private成员) , 反之则不行。
    • 内部类做为外部类成员, 可声明为private、 默认、 protected或public。
    • 内部类成员只有在内部类的范围之内是有效的。
    用内部类定义在外部类中不可访问的属性。 这样就在外部类中实现了比外部类的private还要小的访问权限
    • 编译后生成两个类: OuterClass.class 和OuterClass$InnerClass.class
  2. 内部类分类
    • 成员内部类 静态内部类 方法内部类 匿名内部类
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("我在听!"); 
		}
	}
	
}
  1. 匿名内部类Anonymous
    • 可以实现一个接口, 或者继承一个父类
    • 只能实现一个接口
    适合创建那种只需要一次使用的类, 不能重复使用。 比较常见的是在图形界面编程GUI里用得到。
    匿名内部类要使用外部类的局部变量, 必须使用final修饰该局部变量
    在这里插入图片描述

垃圾回收机制

  1. 对象空间的分配:
    • 使用new关键字创建对象即可

  2. 对象空间的释放:
    • 传统的C/C++语言, 需要程序员负责回收已经分配内存。 显式回收垃圾回收的缺点:
    (1) 程序忘记及时回收, 从而导致内存泄露, 降低系统性能。
    (2) 程序错误回收程序核心类库的内存, 导致系统崩溃。
    • Java语言不需要程序员直接控制内存回收, 是由JRE在后台自动回收不再使用的内存, 称为垃圾回收机制(Garbage Collection)。
    • 可以提高编程效率。
    • 保护程序的完整性。
    • 其开销影响性能。 Java虚拟机必须跟踪程序中有用的对象, 确定哪些是无用的。

  3. 垃圾回收机制关键点
    • 垃圾回收机制只回收JVM堆内存里的对象空间。
    • 对其他物理连接, 比如数据库连接、 输入流输出流、 Socket连接无能为力
    • 现在的JVM有多种垃圾回收实现算法, 表现各异。
    • 垃圾回收发生具有不可预知性, 程序无法精确控制垃圾回收机制执行。
    可以将对象的引用变量设置为null, 暗示垃圾回收机制可以回收该对象。
    • 程序员可以通过System.gc()或者Runtime.getRuntime().gc()来通知系统进行垃圾回收, 会有一些效果, 但是系统是否进行垃圾回收依然不确定。
    • 垃圾回收机制回收任何对象之前, 总会先调用它的finalize方法(如果覆盖该方法, 让一个新的引用变量重新引用该对象, 则会重新激活对象) 。
    • 永远不要主动调用某个对象的finalize方法, 应该交给垃圾回收机制调用。
    在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值