Java ------内部类

内部类

        在Java中,允许在一个类的内部定义类,这就叫内部类,其所在的类就是外部类

        在实际开发中,根据内部类的位置、修饰符和定义方式的不同,内部类可分为成员内部类、 局部内部类、静态内部类、匿名内部类。

成员内部类

        一个类可以定义成员变量、成员方法和还可以定义类就是成员内部类,成员内部类、成员变量和成员方法同一级。

        成员内部类可以无视权限访问外部类的所有成员。

       (测试类)想通过外部类要访问内部类,则要创建内部类对象

        格式如下:外部类名 外部类对象=new 外部类名();

                           外部类名.内部类名 内部类对象=外部类对象.new 内部类名(); 

package 内部类;

public class Example20 {
    public static void main(String[] args){
        //实例化外部类
        Outer outer =new Outer();
        //实例化外部类
        Outer.Inner inner=outer.new Inner();
        inner.show1();
        outer.test2();
    }
}
class Outer{
    int m=0;
    //定义成员方法test1()
    void test1(){
        System.out.println("外部类成员方法test1()");
    }
    //定义成员内部类
    class Inner{
        int n=1;
        void show1(){
            //在成员内部类的方法中访问外部类的成员变量m
            System.out.println("外部类成员变量m="+m);
            //在成员内部类的方法中访问外部类的成员方法test1
            test1();
        }
        void show2(){
            System.out.println("成员内部类方法show2()");
        }
    }
    //外部类方法test2()
    void test2(){
        Inner inner=new Inner();
        System.out.println("内部类的成员变量n="+inner.n);
        inner.show2();
    }
}

局部内部类

         也叫方法内部类,是指定义在某个局部范围中的类,在方法中定义

        访问外部类的所有成员。

        与局部变量同等级

        在外部类访问局部内部类的成员,只能在内部类所属的方法下创建内部类对象,通过该对象访问

package 内部类;

public class Example21 {
    public static void main(String[] args){
        Outer1 outer = new Outer1();
        outer.test2();  //通过外部类对象outer调用创建了局部内部类的方法test2()
    }
}
class Outer1 {
    int m = 0;

    void test1() {
        System.out.println("外部类成员方法test1()");
    }

    void test2() {
        class Inner {
            int n = 1;

            void show() {
                System.out.println("外部类成员变量m=" + m);
                test1();
            }
        }
        //访问局部内部类中的变量和方法
        Inner inner =new Inner();
        System.out.println("局部内部类变量n="+inner.n);
        inner.show();
    }
}

静态内部类

        形式上只是在成员内部类加了static

        功能上静态内部类只能访问外部类的静态成员

通过外部类访问静态内部类成员时,可以通过外部类直接创建一个静态内部类对象。(y因为程序已经提前在静态常量区为静态内部类分配好了内存,所以即使静态内部类没有加载)

格式如下:外部类名.静态内部类名 变量名=new 外部类名.静态内部类名();

package 内部类;

public class Example22 {
    public static void main(String[] args){
        Outer3.Inner inner= new Outer3.Inner();
        inner.show();
    }
}
class Outer3{
    static int m=0;
    //下面的代码定义了一个静态内部类
    static class Inner{
        int n=1;
        void show(){
            //有静态内部类的方法中访问外部类的静态变量m
            System.out.println("外部静态变量m="+m);
        }
    }
}

匿名内部类

        就是没有名称的内部类

        格式:new 类名/接口(){

                        重写抽象方法}

或 new 继承的父类或实现的接口名(){

        匿名内部类的类体

}

        使用条件:作用于类或者接口只有一个抽象方法的时候

方法中的参数可以是接口类型,除了可以传入一个接口实现类,还可以传入实现接口的匿名内部类作为参数

        

interface Animal1{   //定义接口
    void shout();   //定义抽象方法
}


public class Example23 {
    public static void main(String[] args){
        String name ="小花";
        animalShout(new Animal1(){   //调用animalShout()方法,参数为匿名内部类
            @Override  //@Override 注解只能应用于重写父类方法的方法上
            public void shout(){
                System.out.println(name+"喵喵。。。。。");  //访问final修饰的局部变量 jdk8后就不用了
            }
        });
    }
    //定义一个animalShout()方法,创建Animal1 an 作为参数
    public static void animalShout(Animal1 an){   //该方法参数为Animal1接口类型
        an.shout();
    }
}

可以理解为    接口类型 对象          new 接口类型(){匿名类体};  分开写

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值