黑马程序员技术交流社区

标题: 今天看到接口嵌套类有点晕,赶紧查资料共享下 [打印本页]

作者: 张涛的狂怒    时间: 2014-8-5 15:24
标题: 今天看到接口嵌套类有点晕,赶紧查资料共享下
类是对对象的抽象,而接口是对类的抽象。
一、接口中可以存在接口,只能嵌入嵌套类,而不能是非嵌套类
接口中定义的变量默认是public static final 型,且必须给其初值,所以实现类中不能重新定义,也不能改变其值。
接口中的方法默认都是 public,abstract 类型的
接口中可以定义抽象类可以定义,也不仅限于抽象类。只是接口本身不能被实例化,接口内部的类是可以实例化的。
调用接口的内部类有两种方法搜索:1.接口名.类名2.创建实现类implements接口,再直接实例化
内部类示例代码:
interface Test {
        class A {
                void print() {
                        System.out.println("hello--------A");
                }

                public int a = 1;//注意----接口的成员必然是public的。
        }
}
class B implements Test {
        void method() {
                System.out.println(new A().a);
        }
}
public class Demo1 {
        public static void main(String[] args) {
                Test.A b = new Test.A();
                //类中的方法可以不用复写
                b.print();//输出hello--------A               
                System.out.println(b.a);//输出1
                new B().method();//输出1               
        }
}

注意-----可以不实现一个接口的内部接口!

注意:接口中定义的类都是静态嵌套类,并且按照约定,关键字static可以省略,并且其默认修饰符是public。
      二、类中可以嵌入类与接口
普通类中嵌入抽象类与接口
class A{
        void printA(){
                System.out.println("hello-------A");
        }
        abstract class A1{
                public abstract void printA1();
        }
        interface B{
                public void printB();
        }
}
class X extends A{
        void printA(){
                System.out.println("hello-------A");
        }
        class M extends A1{
                public void printA1(){
                        System.out.println("hello-------A1");
                }
        }
        class Y implements B{
                public void printB(){
                        System.out.println("hello-------B");
                }
        }
}
public class Demo2 {
        public static void main(String[] args){
                A a=new X();
                a.printA();
                A.B b=new X().new Y();
                b.printB();
                A.A1 a1=new X().new M();
                a1.printA1();
        }
}
输出结果---“hello-------A     hello-------A1    hello-------B”
      三、内部类,内部接口可以定义成为private,protect,它们就相当于外围类的一个成员,内部类持有外部类的引用。

      四、private的类通常用于内部使用,更多用于返回一个指向外部接口的向上转型的引用

      五、内部类的构造器被定义为private,但是,它还是可以从其外围类中进行实例化

      六、当内部类为public或者是包妨问权限时,可以在外围类之外的其他中实例化它,除此之处,内部类可
          以继承、覆盖(这个有点小技巧),
      七、非嵌套类的内部类进行实例化时,需要一个指向外围类的引用,即先实例化外围类,再实例化内类。

      八、内部类用于实现多继承

      九、内部类可以妨问外围类的所有成员(包括private成员)

      十、当一个类要实现两个接口,但是,两个接口有部分方法是相同的,这时,可以用一个内部类来实现其中一个接口,当然,这种情

况不只是发生在同时实现两个接口的情况。
   
      十一、接口中的成员在被实现时可以将其实现为private或者是其他权限

      十二、局部内部类的作用域在对应代码块中,不能在其前面加权限修饰符

      十三、匿名内部类要使用其外围类中的成员变量,这此变量必须是final的。不然将会在编译时抛出错误。

      十四,匿名内部类通常用在方法体内。因为方法中也可以定义内部类,如:

public class A {
public void f() {
class B extends Thread {
public void run() { }
}
class C implments Runnable {
public void run() { }
}
B b = new B();
C c = new C();
}
}

但是在方法中再定义内部类往往显得累赘。于是上面的代码就可以用匿名内部类重写成:
public class A {
public void f() {
Thread b = new Thread() {
public void run() { }
};
Runnable c = new Runnable() {
public void run() { }
}
}
}

Thread是类,Runnable是接口,分别只用一条语句就实现了声明,赋值,继承或接口实现,代码简洁了许多。

使用匿名内部类的前提是,你不需要对父类做任何扩展,只能是重写其中的方法,因为即使你在匿名内部类中写了一个父类中没有的方法,

你也不能在外部使用它。还有一点就是匿名内部类不能有自己的构造函数




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2