一、内部类
内部类是静态(static)的,可以使用public、private、protected访问控制符,外部类只能使用public和默认。
内部类分为:成员内部类,局部内部类,匿名内部类。
使用内部类的主要原因有:
内部类可以访问外部类中的数据,包括私有的数据。
内部类可以对同一个包中的其他类隐藏起来。
当想要一个回调函数且不想编写大量代码时,使用匿名内部类比较便捷。
减少类的命名冲突。
1、成员内部类:
在外部类内部直接定义(不在方法内部或代码块内部)的类就是成员内部类,它可以直接使用外部类的所有变量和方法,即使是private的。外部类想要访问内部类的成员变量和方法,则需要通过内部类的对象来获取。
public class outer{
private class inner{
}
}
成员内部类可以使用各种修饰符,包括public、protected、private、static、final和abstract,也可以不写。
若有static修饰符,就为类级,否则为对象级。类级可以通过外部类直接访问,对象级需要先生成外部的对象后才能访问。
非静态内部类中不能声明任何static成员。
内部类间可以相互调用,例如:
class a{
class b{}
class c{} //b、c间可以互相调用
}
成员式内部类的访问
实例化内部类对象,要先实例化外部类对象(outObjectName.new).如下所示:
Outer outer=new Outer();
Outer.Inner inner=outer.new Inner();
static 内部类相当于外部类的static成员,可以直接创建,如下:
Outer.Inner inner=new Outer.Inner();
由于内部类可以直接访问外部类的成分,因此当内部类与其外部类中存在同名属性或方法时,也将导致命名冲突。所以在多层调用时要指明,如下所示
public class Outer{
private int size;
public class Inner{
private int size;
public void dostuff(int size){
size; //局部变量 size
this.size; //内部类的 size
Outer.this.size++
}
}
}
2、局部内部类
局部内部类是定义在代码块中的类。它们只在定义它们的代码块中是可见的。
局部内种类有几个重要特性:
1)仅在定义了它们的代码块中是可见的;
2)可以使用定义它们的代码块中的任何局部final变量;
3)局部类不可以是static的,里面也不能定义static成员;
4)局部类不可以用public 、private、protected修饰,只能使用缺省的;
5)局部类可以是abstract的。
3、匿名内部类
只给出方法定义而不具体实现的方法被称为抽象方法,抽象方法是没有方法体的,在代码的表达上九是没有“{}”。包含一个或多个抽象方法的类也必须被声明为抽象类。
使用abstract修饰符来表示抽象方法和抽象类。
抽象类不能被实例化,抽象方法必须在子类中实现。
一个有抽象方法的类必定是抽象类,一个抽象类中不一定有抽象方法
在下列情况下,一个类将成为抽象类:
1)当一个类的一个或多个方法是抽象方法时;
2)当类是一个抽象类的子类,并且不能成为任何抽象方法提供任何实现细节或方法主题时;
3)当一个类实现一个借口,并不能为任何抽象方法提供实现细节或方法主体时;
二、接口
在抽象类中,可以包含一个或多个抽象方法;但在接口中(interface)中所有的方法必须都是抽象的,不能有方法体。
接口中声明的变量默认都是public static final的,必须显示的初始化。在常量声明时可以省略这些修饰符。
接口有其自身的一些特性,如下:
1)接口中只能定义抽象方法,这些方法默认为public abstract的,在声明方法时可以省略这些修饰符。试图在接口中定义实例变量、非抽象的实例方法及静态方法,都是非法的。
public interface demo{
public int a ;//编译出错,a被看做静态常量,必须显示初始化。
protected void write();//编译出错,必须是public类型。
public static String read (){//编译出错,接口中不能包含静态方法。
return “数据”;//编译出错,接口中只能包含抽象方法。
}
}
2)接口中没有构造方法,不能被实例化。
3)一个接口不能实现另一个接口,但可以继承多个其他接口。接口的多继承弥补了类的单继承。
接口的使用
接口不能直接使用new关键字来构建实例。
接口必须通过类来实现(implements)它的抽象方法,然后再实例化类。类实现接口的关键字为implements.
如果一个类不能实现该接口的所有抽象方法,那么这个类必须被定义为抽象类。
不允许创建接口的实例,但允许定义接口类型的引用变量,该变量指向了实现接口的类的实例。
一个类只能继承一个父类,但却可以实现多个接口。