1 接口
接口相当于一个完全抽象的,没有任何实现的类
所有的成员函数都是抽象函数
所有的成员变量都是public static final而且一定要赋予初值
接口中的静态函数必须有函数体
接口在声明时也可以声明是泛型接口,其格式是在接口名称后加上
使用关键词interface声明接口
[接口修饰符] interface 接口名称[] [extends 超类名]{
... //方法的原型或静态变量
}
实现接口使用关键字implements
实现接口的语法如下:
public class 类名称 implements 接口名称{
//实现接口的方法
//本类的数据和方法
}
类可以实现很多接口
接口不能继承类,但是接口可以继承接口,派生出新的接口,而且一个接口可以继承多个接口
接口不能实现接口
2 塑型/造型
Java的对象变量是多态的,它们能保存不止一种类型的对象
它们可以保存的是声明类型的对象,或声明类型的子类的对象
当把子类的对象赋给父类的变量的时候,就发生了向上造型
2.1 类型转换
类型转换也称为塑型(type-casting),对象只能被塑性为:
任何一个超类类型
对象所属的类实现的一个接口
自己原来所属的类
塑性主要应用在如下场合:
赋值转换
方法调用转换
算数表达式转换
字符串转换
当一个类对象被塑形为其超类后,它提供的方法就会减少
2.2 造型
用括号围起类型放在值的前面
对象本身并没有发生任何变化,所以不是“类型转化”
运行时有机制来检查这样得转化是否合理, ClassCastException
2.3 向上造型
把一个类型的对象赋给另外一个类型的变量
子类的对象可以赋值给父类的变量
注意:java中不存在对象对对象的赋值
父类的对象不能赋值给子类的对象
2.4 函数调用的绑定
当通过对象调用函数的时候,调用哪个函数这件事情叫做绑定
静态绑定:根据变量的声明类型来决定
在成员函数中调用其他成员函数也是通过this这个对象来调用的
3 多态
3.1 多态的定义
多态指不同类型的对象可以响应相同的消息
通过塑型可以将一个对象当做它的基类对象看待,相同基类派生出的多种类型可被当做同一种类型对待,可对这些不同的类型进行相同的处理,例如toString方法
3.2 绑定
将一个方法调用和一个方法主体连接到一起成为绑定
4 内部类
定义在别的类内部、函数内部的类
内部类能直接访问外部的全部资源,包括任何私有的成员
外部是函数时,只能访问那个函数里final的变量,因为方法中定义的变量是局部的,当方法的声明周期结束时,方法中变量的生存期也结束了,但方法中定义的内部类的实例可能还在被引用。
4.1 常规内部类
OuterClass、InnerClass分别是外部类和内部类,out是OuterClass的引用,则在OuterClass外部实例化InnerClass的代码片段为:
OuterClass out = new OuterClass();
OuterClass.InnerClass in = out.new InnerClass();
或
OuterClass.InnerClass in = new OuterClass().new InnerClass();
4.2 在方法中的内部类
对方法中定义的内部类实例化,必须在定义的的方法中,而且必须在内部类定义后方可对其实例化。
4.3 匿名内部类
匿名内部类时没有名字的内部类,一般可分为两种:常规定义的内部类;作为方法的参数定义的匿名内部类。常规定义的匿名内部类的声明和使用采用如下格式:
Classname classname = new Classname(){
//类体
}; //注意,必须跟分号
其中,Classname是类或接口名,注意这是一个表达式,它返回一个对象,可以用在需要引用该对象的任何地方。
匿名内部类的方便之处:
该句法定义了一个类,但不需要类的类型;
匿名类实现了一个接口或继承另一个类,而不需要使用implements或extends关键字
4.4 静态内部类
使用了修饰符static的内部类,称为静态内部类。静态内部类与包含类的实例没有实际的联系,因此,不能访问包含类中的非静态成员。实例化静态内部类时,与常规内部类实例化不同。
实例化InnerClass代码片段如下:
OuterClass.InnerClass in = new OuterClass.InnerClass();
一个类OuterClass中有另一个类InnerClass(外部类和内部类), 如果在main函数中使用new 的方式创建内部类的对象,会报错:No enclosing instance of type OuterClass is accessible.
1、原因:
内部类是动态的(无static关键字修饰),而main方法是静态的,普通的内部类对象隐含地保存了一个引用,指向创建它的外围类对象,所以要在static方法(类加载时已经初始化)调用内部类的必须先创建外部类。
2、解决办法:
创建内部类对象应该:
方法1:外部类对象.内部类对象 (保证外部类对象先于内部类对象出现)
InnerClass in = new OuterClass().InnerClass();
方法2:
如果将内部类修改为静态类,可以在main中直接创建内部类实例。
static class InnerClass{
...
}
当在包含类内部实例化内部类时,可以直接对内部类实例化。如果在包含类的外部实例化内部类,则需要使用包含类的一个引用来实例化。
4.5 匿名类
在new对象的时候就给出类的定义形成了匿名类
匿名类可以继承某类,也可以实现某接口
Swing的消息机制广泛使用匿名类