内部类

内部类

1.

//内部类一
/*内部类:当B类想要调用A类私有的成员函数时,可以将B类移入A类中作为内部类
访问方式-内部类访问外部类:可直接访问外部类的所有成员和函数,包含私有的
        -外部类访问内部类:外部类必须创建内部类的对象
*/
//内部类的访问方式:内部类在成员位置,可以被修饰符修饰

public class Outer{
    public static void main(String[] args){
        /*A a=new A();
        a.method();*/

        /*直接访问内部类
        A.B a=new A().new B();
        a.print();*/

        /*调用静态内部类的非静态函数
        A.C q=new A.C();
        q.print2();*/
        /*调用非静态类内静态类内的静态函数
        A.C.print3();*/
    }
}

class A{     //外部类
    int num=7;

    class B{
    void print(){
        System.out.println("B method run");
        }

     //static void print4(){}非静态内部类中不允许定义静态成员,但是仅允许定义静态变量
    }   

    static class C{
        void print2(){
            System.out.println("C static class run");
        }

        static void print3(){
            System.out.println("C static method run");
        }
    }

    void method(){  //内部类,内部类必须有自己的所属名字进行标识
        B b=new B();
        b.print();
    }
}


2.

/*内部类能直接访问外部类的原因:
非静态内部类中持有外部类的引用
静态内部类不持有外部类.this,而是直接类明调用
*/
public class Outer2{
    public static void main(String[] args){
        Outer n=new Outer();
        n.show();//num=5BSystem.out.println("run");
    }
}

class Outer{
    int num=3;
    class Inner{
        int num=4;

        void method(){
            int num=5;
            System.out.println("num="+num);//5
            System.out.println("num="+this.num);//4
            System.out.println("num="+Outer.this.num);//3
        }
    }

    void show(){
        new Inner().method();
    }
}

3.

/*内部类在局部位置上,只能访问被final修饰的局部变量*/
public class Outer3{
    public static void main(String[] args) {
        Outer n=new Outer();
        n.method();
        //如果Inner对外提供,那么可以如此截获
        Outer.Inner in=n.getObject();
        in.show();
        //如果Inner被private,可以通过父类型获取
        In i=n.getObject();
        i.show();
    }
}

class Outer{
    int num=3;
    /*
    void method(){
        final int x=10;
        int y=2;
        class Inner extends In{//内部类可以延伸类或者借口
            void show(){
                //System.out.println("y="+y);//访问失败,y的生命周期太短了
                System.out.println("x="+x);
                System.out.println("inner run..."+num);
            }
        }
        new Inner().show();
    }*/
    final int x=10;
    int y=2;
    private class Inner extends In{
        void show(){
            System.out.println("x="+x);
            System.out.println("inner run..."+num);
        }
    }
    public Inner getObject(){
        return new Inner();
    }

    public void method(){
        new Inner().show();
    }
}

abstract class In{
    abstract void show();
}

4.

public class Outer4{
    public static void main(String[] args) {
        Outer n=new Outer();
        n.method();
     }
}

abstract class AbsDemo{
    abstract void show();
}

class Outer{
    int num=3;
    /*
    class Inner extends Outer{
        void show(){
            System.out.println("num==="+num);
        }
    }
    */
    public void method(){
        //不想创建子类型,但想创建子类对象
        new AbsDemo(){//AbsDemo的子类对象,一个带着内容的子类对象,相当于new Inner().show();
                      //匿名内部类:带内容的子类对象 new父类()或者接口{子类的接口}
                      //前提:匿名内部类必须继承父类或者实现接口
            void show(){
                System.out.println("num==="+num);
            }
        }.show();
    }
}

5.

public class Outer5{
    public static void main(String[] args) {
        Outer n=new Outer();
        n.method();
    }
}

interface Inter{
    void show1();
    void show2();
}

class Outer{
    int num=4;

    /*class Inner implements Inter{
        public void show1(){
            System.out.println("show1 run");
        }

        public void show2(){
            System.out.println("show2 run");
        }
    }*/
    public void method(){
        Inter in=new Inter(){//当需要匿名类调用多个方法时,可以为匿名类起个名字然后调用
            public void show1(){
            System.out.println("show1 run");
            }

            public void show2(){
            System.out.println("show2 run");
            }
        };
        in.show1();
        in.show2();
    }
}

6.

public class OuterDemo{
    public static void main(String[] args) {
    Outer.method().show();  
    }
}

interface Inter{
    public void show();
}

class Outer{
    public static Inter method(){
        return new Inter(){
            public void show(){
                System.out.println("hahaha");
            }
        };
    }
}

class Outer2{
    //以下两个对象有区别吗?
    new Object(){
         public void show(){

         }
    }.show();//编译通过

    Object in=new Object(){
        public void show(){

        }
    };
    in.show();//编译失败,因为匿名内部类是子类对象,当Object obj指向时,就被提升了Object,而Object类中没有定义show方法,所以编译失败
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值