再介绍几个类的特殊用法。
内部类/接口
也称嵌套类/接口,是在一个类或接口内部声明的类/接口。
内部类包括成员类,局部类,匿名类;而内部接口都是成员接口。
成员类
成员类分为静态成员类和非静态成员类。
在非静态成员类中,有如下特征需要注意:
- 不能定义静态变量和方法
- 可以访问封装类的所有成员
- 访问与该成员类重名的封装类实例成员语法为:封装类类名.this.封装类实例成员名
另外,在封装类之外创建非静态成员类实例时,需要先创建封装类的实例,然后使用如下语法:
封装类类名.非静态成员类类名 实例变量名 = 封装类实例成员名.new 非静态成员类类名
public class MemberClass {
int id;
String name;
static int counter = 0;
public MemberClass(int id, String name) {
this.id = id;
this.name = name;
counter++; // 计数变量加一
}
public void print() {
InterClass mc = new InterClass();
mc.print();
}
// 非静态成员类
class InterClass {
String name;
public void print() {
// 访问重名属性,需要特定的语法格式
System.out.println("id="+id+", name="+MemberClass.this.name);
System.out.println("counter="+counter);
}
}
// 静态成员类
static class NewInterClass {
String name;
public void print() {
// 访问封装类的静态成员变量
System.out.println("counter="+counter);
}
}
public static void main(String[] args) {
MemberClass ec1 = new MemberClass(1, "Tom");
ec1.print();
MemberClass ec2 = new MemberClass(2, "John");
ec2.print();
MemberClass ec3 = new MemberClass(3, "Dora");
// 在封装类外部创建非静态成员类,需要创建实例对象
MemberClass.InterClass mc = ec3.new InterClass();
mc.print();
// 在封装类外部创建静态成员类实例,只需通过类名调用
MemberClass.NewInterClass newMc = new MemberClass.NewInterClass();
newMc.print();
}
}
局部类
局部内部类是在封装类的方法中定义的内部类,典型用法是用局部类来实现接口,并在方法中返回接口类型。
匿名类
指没有名称的类,一般当某个类仅在程序中使用一次,且功能简单时,就可以用匿名类的方式来创建这个类的实例。
new 匿名类类名() {
类体;
}
匿名类必须是一个具体的对象,不能是抽象类(abstract)。
public class MemberInterface {
public void innerMethod() {
System.out.println("从外部实现了公有内部接口");
}
public static void main(String[] args) {
OuterClassA o = new OuterClassA();
// obj是InnerInterface内部接口的内部实现类的实例对象,具有innerMethod方法
OuterClassA.InnerClass obj = o.outerMethod();
obj.innerMethod();
MemberInterface m = new MemberInterface();
m.innerMethod();
}
}
class OuterClassA {
// 定义一个内部接口
public interface InnerInterface {
void innerMethod();
}
// 定义内部类实现内部接口
public class InnerClass implements InnerInterface {
public void innerMethod() {
System.out.println("在内部实现了公有内部接口");
}
}
// 创建一个内部类实例对象
public InnerClass outerMethod() {
return new InnerClass();
}
}
范型
范型是对Java语言类型系统的一种扩展,支持创建可以按类型进行参数化的类、接口或方法。
将所操作的数据类型参数化,即该数据类型被声明为一个参数,声明的类型参数在使用时用具体地类型来替换。