Java内部类

本文详细介绍了Java中的内部类概念,包括实例内部类(可直接访问外部类成员)、静态内部类(无需外部类实例即可访问)、匿名内部类(实现接口的简洁形式)。讨论了它们的使用场景和访问权限特点。
摘要由CSDN通过智能技术生成

一、概念

当一个事物的内部,还有一个完整的结构进行描述,而这个内部类的完整结构体又只为外部事物提供服务,那么这个内部的完整结构最好使用内部类。内部类也是一种封装的体现。

二、分类:

实例内部类

静态内部类

匿名内部类

局部内部类(一般不会涉及)

1、实例内部类

外部类中的任何成员都可以在实力内部类方法中直接访问

实例内部类所处的位置与外部类成员位置相同,因此也受访问限定符的约束

在实例内部类方法中访问同名的成员时,优先访问自己的,如果访问外部类同名成员,必须:外部类名.this.同名成员来访问

实例内部类对象必须在先有外部类对象前提下才能创建

实力内部类的非静态方法中包含了一个指向外部类对象的引用(this)

外部类中,不能直接访问实例内部类中的成员,如果要访问必须先要创建内部类对象

class OuterClass{

    public int data1 = 1;
    private int data2 = 2;
    public static int data3 = 3;

    public void testA(){
        System.out.println("OuterClass::testA()");
    }

    //实例内部类
    //定义在类的内部,方法的外部
    class InnerClass{
        public int data4 = 4;
        private int data5 = 5;
        public static int data6 = 6;

        public void test(){
            System.out.println("InnerClass::test()");
            //可访问内部类成员
            System.out.println(data4);
            System.out.println(data5);
            System.out.println(data6);
            System.out.println("========");
            //可访问外部类成员
            System.out.println(data1);
            System.out.println(OuterClass.this.data1);//如果变量名相同,可以拿外部类的变量
            System.out.println(data2);
            System.out.println(data3);
          /* OuterClass outerClass = new OuterClass();
            System.out.println(outerClass.data1);*///也可以拿到外部类的变量
        }

    }
    
}
public class innerClass {

    public static void main(String[] args) {
        OuterClass out = new OuterClass();
        //通过对象的引用来new内部类对象
        OuterClass.InnerClass innerClass = out.new InnerClass();
        innerClass.test();
    }
    
}

2、静态内部类

实际开发经常使用,因为和实例内部类相比,少一个外部类的实例化对象

在静态内部类中,不能访问外部类的非静态成员,需要new外部类的对象后再进行访问

创建静态内部类对象时,不需要先创建外部类对象

class OuterClass2{
    public int data1 = 1;
    private int data2 = 2;
    public static int data3 = 3;
  
    public void testA(){
        System.out.println("OuterClass::testA()");
    }
    //静态内部类
    static class InnerClass{
        public int data4 = 4;
        private int data5 = 5;
        public static int data6 = 6;
        
        public void test(){
            System.out.println("InnerClass::test()");
            //System.out.println(data1);不能直接访问调用非静态类的成员变量,需要对外部类引用
            OuterClass2 outerClass2 = new OuterClass2();
            System.out.println(outerClass2.data1);
            System.out.println(outerClass2.data2);
            System.out.println(data3);
            System.out.println(data4);
            System.out.println(data5);
            System.out.println(data6);
        }
    }
    
}
public class Test {
    public static void main(String[] args) {
        //静态内部类,实际开发经常使用,因为和实例内部类相比,少一个外部类的实例化对象
        OuterClass2.InnerClass innerClass = new OuterClass2.InnerClass();
        innerClass.test();
    }
}

3、匿名内部类 

相当于一个类实现了这个接口同时重写了test方法

interface ITestable{
    void test();
}

public class Test2 {
 
    public static void main(String[] args) {
        //匿名内部类
        ITestable iTestable = new ITestable() {
            @Override
            public void test() {
                System.out.println("test()");
            }
        };
        //相当于一个类实现了这个接口同时重写了test方法!!
        iTestable.test();
    }
}

下面这样就是有名字

interface ITestable{
    void test();
}
class ITE implements ITestable{
    @Override
    public void test() {
        System.out.println("test()");
    }
}
public class Test2 {
    public static void main(String[] args) {
        ITestable it = new ITE();
        it.test();
    }
  
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值