今天android班又来了两位新同学,11人已经可以创建一支足球队了。加油,we are a team!!
接口、内部类、枚举类、垃圾回收机制
一、接口
1、接口:interface,支持多继承
2、接口内的方法或变量只能用public修饰符修饰,若没有修饰符,则默认为public
3、接口类的命名方式一般首字母“I”
4、接口与抽象类的区别:前者完全抽象,后者部分抽象
5、接口的好处:
①“接口是一种规范”,能够达到统一访问。
②“接口”能让人清晰的知道接口的功能,而不需要知道其具体的实现
③“接口”和实现分离,对分工协作有很大的帮助
二、内部类
1、定义:一个类定义在另一个类的内部,则这个类为内部类
2、一般内部类:可以直接调用外部类的实例变量和实例方法
3、静态内部类:只能调用外部类的静态变量与方法
4、方法内部类:即声明在方法体中的类。方法内部类只在方法体中有效
5、匿名内部类:一般只需要用一次的类,可以把它设置为匿名内部类,可以减少代码量
//定义一个接口
interface Human{
abstract void walk();
}
public class NoNameClass {
public static void main(String[] args) {
//匿名内部类实现了Human接口
new Human() {
@Override
public void walk() {
System.out.println("行走");
}
};
}
}
三、枚举类
1、枚举类与普通类的区别:枚举类继承至java.lang.Enum类,而普通类都继承至Object类
2、枚举类规范了参数的形式,这样可以不用考虑类型的不匹配并且显式的替代了int型参数可能带来的模糊概念
3、枚举类可以提高程序的阅读性
枚举类:
public enum SeasonEnum {
//列出4个枚举实例
SPRING,SUMER,FALL,WINTER;
}
测试类:
public class RoleTest {
public static void main(String[] args) {
System.out.println("请输入角色:");
Scanner scanner = new Scanner(System.in);
String string = scanner.next();
try {
//表示取Role枚举类中值为FEMALE的对象。
Role roleTest = Enum.valueOf(Role.class,string);
switch (roleTest) {
case USER:
System.out.println("用户");
Role.USER.print();
break;
case PM:
System.out.println("项目经理");
break;
case DISIGNER:
System.out.println("设计师");
break;
case CODER:
System.out.println("程序员");
break;
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
四、垃圾回收机制GC
1、当对象的内存不在被调用时,将等待GC回收
2、GC只负责回收对象
3、程序无法精确控制垃圾回收机制的运行
4、在回收任何对象之前,都会先调用finalize()方法
5、对象在jvm的三种不同的状态:①可达 ②可恢复 ③不可达
6、强制垃圾回收方法:
①System.gc();//操作系统层面,较随机的
②Runtime.getRuntime().gc();//当前程序层面的,较稳定,推荐使用
课堂作业
场景:一个系统的数据库是可以随时切换的,目前支持连接MySql和SqlServer,甚至以后还有可能连接Oracle数据库
要求:利用抽象模版的思想和接口规范的思想实现以上场景
提示:数据库操作过程包含链接(connect),查询(query),释放(dispose),具体细节不用实现,体现思路即可。
具体思路:数据库Dao设计模式
①定义接口IDao
②分别通过实现该接口具体实现MySql和SqlServer数据库操作
③创建一个能够获取当前数据库类型的类DaoFactory
④通过调用DaoFactory,实现具体的数据库操作DBImpl类
代码如下:
//数据库操作接口
public interface IDao {
//数据库连接
abstract void connect();
//数据库查询
abstract void query();
//关闭数据库
abstract void dispose();
}
//MySql数据库实现
public class MySqlImpl implements IDao {
@Override
public void connect() {
System.out.println("MySql数据库连接");
}
@Override
public void query() {
System.out.println("MySql数据库查询");
}
@Override
public void dispose() {
System.out.println("MySql关闭数据库");
}
}
//SqlServer数据库实现
public class SqlServerImpl implements IDao {
@Override
public void connect() {
System.out.println("SqlServer数据库连接");
}
@Override
public void query() {
System.out.println("SqlServer数据库查询");
}
@Override
public void dispose() {
System.out.println("SqlServer关闭数据库");
}
}
//获取数据库类型的类
public class DaoFactory {
private static String dbName = "MySql";
public static IDao getDBName() {
if (dbName.equals("MySql")) {
return new MySqlImpl();
} else if (dbName.equals("SqlServer")) {
return new SqlServerImpl();
} else {
return null;
}
}
}
//数据库操作类
public class DBImpl implements IDao {
IDao db = DaoFactory.getDBName();
@Override
public void connect() {
db.connect();
}
@Override
public void query(){
db.query();
}
@Override
public void dispose() {
db.dispose();
}
public static void main(String[] args) {
DBImpl dbImpl = new DBImpl();
dbImpl.connect();
dbImpl.query();
dbImpl.dispose();
}
}
运行截图: