1、interface接口
(1)[修饰符] interface 接口名 extends 父接口1,父接口2....
•没有构造方法,不能实例化;
•接口只能继承接口,不能继承类
•接口里没有普通方法,方法全是抽象的;
•接口里的方法默认修饰符是public abstract;
•接口里的字段全是全局常量,默认修饰符是public static final;
(2)接口里的成员包括(主要是前两个):
•全局常量
•公共的抽象方法
•内部类(包括内部类,内部接口,内部枚举类);
使用接口
格式 : public class SubImpl extends Super implements IA,IB
•接口的实现必须在 extends 之后;
•实现接口的方法必须是 public 类型
•接口不能创建实例,但是可以声明引用类型的变量。
•此时,引用类型的变量必须指向到其实现类对象。
•IStudent s = new String();//
•IStudent s = new StudentImpl();//
2、接口和抽象类异同点
(1)相同点:
•都位于继承的顶端,用于被其他实现或继承;
•都不能实例化;
•都包含抽象方法,其子类都必须覆写这些抽象方法;
(2)区别:
•抽象类为部分方法提供实现,避免子类重复实现这些方法,提供代码重用性;接口只能包含抽象方法;
•一个类只能继承一个直接父类(可能是抽象类),却可以实现多个接口;(接口弥补了Java的单继承)
(3)二者的选用:
•优先选用接口,尽量少用抽象类;
•需要定义子类的行为,又要为子类提供共性功能时才选用抽象类;
3、内部类
(1)类中有类
•内部类:嵌套类
•外部类:宿主类
(2)把内部类隐藏在外部类之内,不许同包的其他类访问该类;
(3)内部类可以访问外部类的私有数据,外部类不能访问内部类的实现细节,比如字段;
(4)观察编译后的字节码文件
(5)非静态内部类;静态内部类,局部内部类;
(6)匿名内部类适合于仅使用一次使用的类;
A、非静态内部类
Ø若外部类字段,内部类字段,内部类方法变量同名,则其访问方式分别是:
•访问外部类的字段:外部类类名.this.字段
•访问内部类字段:this.字段
•访问内部类方法的局部变量:字段
非静态内部类例子:
打印结果:
把局部变量添加到尾巴
把内部类属性添加到尾巴
把外部类属性添加到尾巴
在外部类以外访问非静态内部类
(1)内部类不能是private修饰,否则不能访问
(2)外部类以外的地方定义内部类变量
•OuterClass.InnerClass varName ;
(3)非静态内部类对象是存放在外部类的对象里的,因此在创建非静态内部类对象之前,必须先创建其外部类的对象
•OuterInstance.new InnerClass([参数列表]);
public class InnerDemo { public static void main(String[] args) { //Outer.Inner in = new Outer().new Inner(); Outer.Inner in; Outer out = new Outer(); in = out.new Inner(); //in.inShow(); //Outer out = new Outer(); //out.outShow(); } } class Outer { class Inner { public void inShow() { System.out.println("inShow"); } } public void outShow(){ //System.out.println("outShow"); Inner in = new Inner(); in.inShow(); } }
在外部类以外访问非静态内部类例子
B、静态内部类
C、局部内部类
D、匿名内部类