内部类的详细介绍~

内部类的分类:

1、本地内部类        2、实例内部类        3、静态内部类        4、匿名内部类

一、本地内部类:定义在方法当中的类

public void func(){
        class Test{//本地内部类
            public int a;
        }
    }

缺点:只能在方法中使用

二、实例内部类:定义在类内部了类

Class OuterClass{
    class InnerClass{//实例内部类
    }
}

注意:

1、在实例内部类中不能定义一个静态的成员变量,还要定义只能定义一个静态的常量

class OuterClass{
    public int data1=1;
    private int data2=1;
    public static int data3;
    class InnerClass{//实力内部类,可以把它当作是外部类的一个普通实例的成员
        public int data4=4;
        private int data5=5;
        public static in t data6=6;//会报错,带static的是属于类的,不属于对象,但InnerClass需要依赖外部类对象调用的
        public static final int data7=6;//正确,静态的常量可以定义
        public InnerClass(){
            System.out.println("奴带参数的内部类的构造方法!");
        }
        public void test(){
            System.out.println("InnerClass::test()");
        }
    }

2、如何实例化,实例内部类的对象:外部类名.内部类名   变量=外部类对象的引用.new 内部类

Class OuterClass{
    class InnerClass{
    }
}
public static void main(String[] args) {
    OuterClass outerClass=new OuterClass();
    OuterClass.InnerClass innerClass=outerClass.new InnerClass();//实例内部类对象
}

 3、实例内部类当中,如果包含了和外部类同名的成员变量,如何在实例内部类中访问?

class OuterClass{
    public int data1=1;
    class InnerClass{//实力内部类,可以把它当作是外部类的一个普通实例的成员
        public int data1=99999;
        public void test(){
            System.out.println(OuterClass.this.data1);//才能访问到外面的data1,输出1
            System.out.println(this.data1);//99999
        }
    }
}

public static void main(String[] args) {
        OuterClass outerClass=new OuterClass();
        OuterClass.InnerClass innerClass=outerClass.new InnerClass();//实例内部类对象
        innerClass.test();
}

实例内部类当中有两个this,一个是外部类的this,一个是自己的this

三、静态内部类

class OuterClass{
    static class InnerClass{//静态内部类
    }
}

注意:

1、如何实例化,实例内部类的对象: 

Class OuterClass{
    class InnerClass{
    }
}
public static void main(String[] args) {
    OuterClass.InnerClass innerClass=new OuterClass.InnerClass();//获取静态内部类对象
}

2、如何访问外部类的普通成员变量:

class OuterClass{
    public int data1=1;
    private int data2=2;
    static class InnerClass{
        public int data4=4;
        private int data5=5;
        public static int data6=6;//可以定义静态的
        public void test(){
            System.out.println(data1);//报错,因为调用data1需要外部类的引用,而InnerClass不需要调用外部类的对象
            System.out.println(new OuterClass().data1);//创建一个外部类对象就可以访问外部类的普通成员变量
            System.out.println(data2);//报错,私有的不能访问
        }
    }
}

四、匿名内部类

class Test1{
    public void test(){
        System.out.println("test()haha!");
    }
}
public static void main(String[] args) {
    new Test1(){

    };//匿名内部类
}

匿名内部类调用方法

class Test1{
    public void test(){
        System.out.println("test()haha!");
    }
}
public static void main(String[] args) {
    new Test1(){
        @Override
         public void test() {
            System.out.println("我是重写的test方法");
        }
    }.test();//匿名内部类调用test方法
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值