内部类和设计模式

回顾

1.二维数组的理解和初始化
2.二维数组的遍历方式
3.异常的概念和分类
4.异常的处理方式
5.自定义异常

任务

1.内部类
	1.1 成员内部类
	1.2 局部内部类
	1.3 静态内部类
	1.4 匿名内部类
2.设计模式
	2.1 单例设计模式
	2.2 工厂设计模式

目标

1.了解成员内部类、局部内部类和静态内部类的语法结构
2.了解各种内部类的注意事项
3.掌握匿名内部类的使用
4.掌握单例设计模式的实现
5.掌握工厂设计模式的实现

第一节 内部类

1.1 成员内部类

作为外部类的成员存在,与成员变量和成员方法平级关系。

 
 

代码实现:

 
1.2 局部内部类

作为局部成员存在,和局部变量平级。

 
1.2.2 说明:
局部内部类的访问权限:只能是默认

1.2.3 如何创建局部内部类对象:
直接在局部内部类所在的方法中创建对象并调用方法

1.2.4 如何在局部内部类中访问外部类的属性:
	i.不同名,直接访问
	ii.同名,外部类名.this.属性名

1.2.5 字节码文件:
	外部类名$编号内部类名.class

代码实现:

 
1.3 静态内部类
 
 

代码实现:

 
1.4 匿名内部类
1.4.1 什么是匿名内部类:

	  没有名字的内部类

1.4.2 原理产生原因:

	由于接口和抽象类不能创建对象,若一个接口的实现类只需要使用一次,或一个抽象类的非抽象类只需要使用一次,可以使用匿名内部类,匿名内部类只能创建一个对象

代码实现:

public interface I {
	public abstract void fun();
}

public class Test{
	public static void main(Strng[]args){
		I i = new I(){
			public void fun(){
				//功能代码
			}
		};
		i.fun1();//使用匿名内部类的对象(接口引用)调用匿名内部类中重写的接口中的方法
	}
}

1.4.3 匿名内部类的注意事项:

匿名内部类中必须把抽象方法全部实现

匿名内部类中可以声明独有的属性和方法,但是由于接口引用不能访问实现类中独有的属性和方法,所以一般不在匿名内部类中声明独有的方法

匿名对象:若在匿名内部类中声明了独有的方法火属性,可以使用匿名对象访问,匿名对象只能使用一次

代码实现:

 
1.4.4 匿名内部类的字节码文件格式:

	测试类$编号.class

	匿名内部类只能使用一次,即便两次声明的匿名内部类完全一致,也是两个匿名内部类

第二节 设计模式

2.1 单例设计模式
2.1.1 什么是单例:
	单个实例

2.1.2 单例的模式动机:
 	在一个系统或平台中,某个类的实例(对象),只需要有一个
 	一个朝代只能有一个皇帝,一个公司只能有一个老板
 	
2.1.3 实现原理:封装
 	得到一个类的对象,需要通过new关键字,调用构造方法创建对象

 	实现过程:
 	分析:某个类只能有一个对象,但是构造方法只要一调用就会产生新的对象,可以通过封装将构造方法进行私有化;
 	若构造方法私有化,那么此类将没有对象
 	私有化的构造方法可以再类内部调用创建对象

2.1.4 需要完成的事项:
 		1)私有化构造方法;
 		2)在类内创建对象;
 		3)提供一个共有的方法,用来获取本类对象

2.1.5 实现方式:
  	单例分为懒汉式和饿汉式
	核心:
	构造方法私有:不能在类外随意创建对象
	在类内部声明一个本类静态的对象作为属性
	提供一个共有静态的方法用来获取本类对象

饿汉式代码实现:

 

懒汉式代码实现:

 
思考:懒汉式和饿汉式有什么区别?
书写上的区别:懒汉是调用方法是初始化对象,饿汉是声明同时初始化
使用上没有区别
存储时:在第一次获取单例类对象前,懒汉比饿汉节省空间
多线程操作时区别:懒汉式存在线程安全问题,饿汉式不存在
2.2 工厂设计模式

1.原理:多态

生活中的工厂:手机厂,电视厂,服装厂...

2.动机:

考虑一个简单的软件应用场景,一个软件系统可以提供多个外观不同的按钮(如圆形按钮、矩形按钮、菱形按钮等),这些按钮都源自同一个基类,不过在继承基类后不同的子类修改了部分属性从而使得它们可以呈现不同的外观,如果我们希望在使用这些按钮时,不需要知道这些具体按钮类的名字,只需要知道表示该按钮类的一个参数,并提供一个调用方便的方法,把该参数传入方法即可返回一个相应的按钮对象,此时,就可以使用简单工厂模式。

3.优缺点:

​ 优点:工厂类含有必要的判断逻辑,可以决定在什么时候创建哪一个产品类的实例,客户端可以免除直接创建产品对象的责任,而仅仅“消费”产品;简单工厂模式通过这种做法实现了对责任的分割,它提供了专门的工厂类用于创建对象。

​ 缺点:由于工厂类集中了所有产品创建逻辑,一旦不能正常工作,整个系统都要受到影响。使用简单工厂模式将会增加系统中类的个数,在一定程序上增加了系统的复杂度和理解难度。系统扩展困难,一旦添加新产品就不得不修改工厂逻辑,在产品类型较多时,有可能造成工厂逻辑过于复杂,不利于系统的扩展和维护。

4.案例: 服装厂:生产服装

分析: 需要一个服装厂类:工厂,类中具有生产服装的功能(创建服装对象) 服装类(各种):一类服装是一个类 需要一个各类服装的父类或接口:可以表示任意类服装

 

总结

课前默写

 

作业

作业要求

面试题