java编程思想--内部类

    xiaoxiao2026-08-24  2

    一、内部类

    内部类长这样:

    public class Outer{ private int num; private String str; public Outer(int num){ this.num = num; } class Inner{ private float f; private String name; public Inner(String name){ this.name = name ; } } public Inner getInner(String name){ return new Inner(name); } }

    内部对象能访问到外围对象的所有成员,如下示例:

    import java.util.ArrayList; import java.util.List; public class Sequence { private List<Object> list = new ArrayList<>(); public void add(Object o){ list.add(o); } public SequenceImpl getImpl(){ return new SequenceImpl(); } private class SequenceImpl implements Selector{ private int counter = 0; @Override public boolean hasNext() { return counter!=list.size(); } @Override public Object next() { return list.get(counter++); } } public static void main(String[] args) { Sequence sq = new Sequence(); for(int i=0;i<10;i++){ sq.add(Integer.valueOf(i)); } Selector sl = sq.getImpl(); while(sl.hasNext()){ System.out.print(sl.next()+" "); } } } interface Selector{ public boolean hasNext(); public Object next(); }

    内部类自动获取外围类所有成员的访问权限,如何做到的呢? 当外围类创建了内部类的一个对象时,此内部类对象隐式地创建了一个指向外部类对象的引用。当访问外部类成员时,就是用那个引用来选择那个引用的成员。

    怎样获取内部类对象? 通过.new 比如上面的程序: sq.new Inner();

    二、匿名内部类

    public class Anonymous{ private String str; public Content getContent(final int num){ //匿名类:继承自Content的匿名类对象 //如果匿名类想使用一个在外部定义的对象,那么编译器会要求其引用参数是final的,比如下面的final int num,num在内部类里面被使用到了。 return new Content(){ private int i = num; public int print(){ System.out.println("i="+i); return i; } };//注意这里有一个分号,标志语句结束 } }

    三、嵌套类

    用static声明的内部类就是嵌套类

    嵌套类与外围类对象间没有关系。

    创建嵌套类的对象,并不需要依赖外部类嵌套类的对象只能访问外部类的static成员嵌套类中的成员可以用static修饰,但是普通的内部类不行

    四、为什么需要内部类

    每个内部类都能独立地继承自一个接口的实现,所以无论外围类是否已经继承了某个接口的实现,对于内部类都没有影响。

    内部类实现”多重继承“:

    class A{} abstract class B{} class C extends A{ public B getB(){ return new B(){};//匿名内部类 } } public class MultiImpl{ public static void doA(A a){} public static void doB(B b){} public static void main(String[] args){ C c = new C(); doA(c); doB(c.getB()); } }

    五、内部类标志符

    由于每个类都会生成一个.class文件,那么内部类生成的.class文件名是什么样的呢?

    比如内部类SequenceImpl ,它的class文件名是:Sequence $SequenceImpl .class

    转载请注明原文地址: https://ju.6miu.com/read-1311525.html
    最新回复(0)