目录:
一、抽象类与抽象方法
二、接口(interface)
三、类的成员之五:内部类
/*--------------------分割线----------------*/
一、抽象类与抽象方法
> 用abstract来修饰一个方法,改方法就叫做抽象方法。
> 抽象方法,只有方法的声明,没有方法的实现。以分号结束:
比如:public abstract void talk();
> 含有抽象方法的类必须被声明为抽象类
> 抽象类不能被实例化,抽象类是用来被继承的,抽象类的子类必须重写父类的抽象方法,并提供方法体。若没有重写全部的抽象方法,仍然为抽象类。
注意:
> 不能用abstract修饰变量、代码块、构造器
> 不能用abstract修饰私有方法、静态方法、final的方法、final的类
抽象类是用来模块化那些父类无法确定全部实现,而是由其子类提供具体实现的对象的类。
多态的应用:模板方法设计模式
抽象类体现的就是一种模板模式的设计,抽象类作为多个子类的通用模板,子类在抽象类的基础上进行扩展、改造,但子类总体上会保留抽象类的行为方式。
解决的问题:
> 当功能内部一部分实现是确定的,一部分实现是不确定的。这时,可以把不确定的部分暴露出去,让子类去实现。
> 换句话说,在软件开发中实现一个算法时,整体步骤很固定、通用,这些步骤已经在父类中写好了。但是某些部分易变,易变部分可以抽象出来,供不同子类实现。这就是一种模板模式。
模板方法涉及模式是编程中经常用得到的模式。各个框架、类库中都有他的影子,比如常见的有:
> 数据库访问的封装
> Junit 单元测试
> JavaWeb的Servlet中关于doGet/doPost 方法调用
> Hibernate中模板程序
> Spring中JDBCTemplate、HibernateTemplate等
二、接口(interface)
Java不支持多重继承,有了接口,就可以得到多重继承的效果。
接口就是规范,定义的是一组规则,体现了显示世界中“如果你是。。则必须能。。”的思想。继承是一个“是不是”的关系,而接口实现则是“能不能”的关系。
接口的本质是七月,标准,规范,就想我们的法律,制定好了大家就得遵守。
> 接口(interface)是抽象方法和常量值定义的集合
接口夫人特点:
用interface来定义
接口中的所有成员变量都默认是由public static final修饰的。
接口中的所有抽象方法都默认是由public abstract修饰的。
接口中没有构造器
接口采用多继承机制
定义Java类的语法格式:先写extends,后写implements
一个类可以实现多个接口,接口也可以继承其他接口。
实现接口的类中必须提供接口中所有的具体实现内容,方可实例化。否则,认为抽象类。
接口的主要用途就是被实现类实现(面向接口编程)
与继承关系类似,接口与实现类之间存在多态性
接口和类是并列关系,或者可以理解为一种特殊的类。从本质上讲,接口是一种特殊的抽象类,这种抽象类中只包含常量和方法的定义,而没有变量和方法的实现。
代理模式:
代理模式是Java开发中使用较多的一种设计模式。代理设计就是为其他对象提供一种代理以控制对这个对象的访问。
应用场景:
安全代理:屏蔽对真实角色的直接访问。
远程代理:通过代理类处理远程方法调用(RMI)
延迟加载:先加载轻量级的代理对象
分类:
静态代理:(静态定义代理类)
动态代理:(动态生成代理类)
JDK自带的动态代理,需要反射等知识
接口和抽象类之间的对比
Java8中关于接口的改进
java8中,你可以为接口添加静态方法和默认方法。从技术角度来说,这是完全合法的,只是它看起来违反接口作为一个抽象定义的理念。
静态方法:使用static关键字修饰。可以通过接口直接调用静态方法,并执行其方法体。我们经常在相互一起使用的类中使用静态方法。你可以在标准库中找到像Collection
Java中,允许一个类的定义位于另一个类的内部,前者称为内部类,后者称为外部类。
Inner class一般用在定义它的类或语句块之内,在外部引用它时必须给出完整的名称。
分类:成员内部类(static成员内部类和非static成员内部类)
局部内部类(不谈修饰符)、匿名内部类
成员内部类作为类的成员的角色:
和外部类不同,Inner class还可以声明为private或protected;
可以调用外部类的结构
Inner class 可以声明为static的,但此时就不能再使用外层类的非static的成员变量
成员内部类作为类的角色:
可以在内部定义属性、方法、构造器导尿管结构
可以声明abstract类,因此可以被其他的内部类继承
可以声明为final的
编译以后生成OuterClass¥InnerClass.class字节码文件
注意:
非static的成员内部类中的成员不能声明为static的,只有在外部类或static的成员内部类中才可声明static成员。
外部类访问成员内部类的成员,需要“内部类.成员”或“内部类对象.成员”的方式
成员内部类可以直接使用外部类的所有成员,包括私有的数据
当想要在外部类的静态成员部分使用内部类时,可以考虑内部类声明为静态的
如何声明局部内部类:
如何使用局部内部类
只能在声明它的方法或代码块中使用,而且是先声明后使用。除此之外的任何地方都不能使用该类
但是它的对象可以通过外部方法的返回值返回使用,返回值类型只能是局部内部类的父类或父接口类型
匿名内部类:
匿名内部类不能定义任何静态成员、方法、和类,只能创建匿名内部类的一个实例。一个匿名内部类一定是在new的后面,用其隐含实现一个接口或实现一个类。
格式:
new 父类构造器(实参列表)|实现接口(){
//怒名内部类的类体部分
}
匿名内部类的特点:
必须继承父类或实现接口
只能有一个对象
对象只能使用多态形式引用