内部类解释及存在的问题说明

文章介绍了Java中的四种内部类:实例内部类、静态内部类、匿名内部类和局部内部类。实例内部类需要依赖外部类对象实例化,不能定义静态变量或方法。静态内部类不依赖外部类实例,可以直接创建。匿名内部类通常用于简洁的实现接口或抽象类。文章还讨论了内部类与外部类成员变量重名时的处理方法以及如何访问外部类的非静态成员。
摘要由CSDN通过智能技术生成

内部类有多种类型: 实例内部类, 静态内部类, 匿名内部类, 局部内部类等

认识内部类,举几个简单例子说明:

实例内部类:

形如这样的定义在OuterClass中的Inner类, 就是一个实例内部类, 它所处的位置与OuterClass中其它的成员变量相同

class OuterClass{
    public int data1=10;
    private int data2=100;
    public static int data3=1000;

    class Inner{
        Inner(){
            System.out.println("内部类中的一个无参构造方法!");    
        }
        public int data4=10000;
        private int data5=100000;
        
        
    }


}

静态内部类:

形如这样用static修饰的Inner类被称为静态内部类

class OuterClass2{
    public int data1=10;
    private int data2=100;
    public static int data3=1000;

    static class Inner{
        Inner(){
            System.out.println("静态内部类中的一个无参构造方法!");
        }
        public int data4=10000;
        private int data5=100000;
    }
    
}

匿名内部类:

形如这样的test(){}; 则被称为匿名内部类, 单纯的new test () 则为一个匿名对象, 只做简单的介绍, 重点在于静态内部类和实例内部类

class test{
    test(){
        System.out.println("test的一个无参的构造方法");
    }
}

public class InnerClass2 {
    public static void main(String[] args) {
        new test(){

        };
    }
}

实例内部类

三个问题:

1. 如何实例化一个实例内部类对象?

2. 实例内部类中如何定义一个静态变量?

3. 实例内部类中的成员变量和外部类中的成员变量重名怎么办?


第一个问题:

首先如何实例化一个内部类对象呢, 显然用通常的实例化一个对象的方法是不行的, 内部类存在于外部类之中, 肯定是要依赖于外部类的, 所以在实例化一个内部类对象时必须要有一个外部类引用来调用

形如这样使用传统方式是完全不行的, idea编译器会自动报错的

正确的方式是用---外部类类名.内部类类名 变量 = 外部类引用.new 内部类

形如下方代码:

public class InnerClass {
    public static void main(String[] args) {
        OuterClass outerClass=new OuterClass();
        OuterClass.Inner inner = outerClass.new Inner();
    }
}

第二个问题:

当在内部类中定义一个静态变量时也会报错, 因为内部类对象需要依赖与外部类的, 所以当你在一个内部类当中定义一个静态变量时, 静态变量使用只依赖于当前类中, 会发生冲突所以默认是不可以定义的

是会报错的

 如果非要定义则需要配合final一起使用, 此时就变成了一个常量, 在编译的时候就已经是确定的值了, 就不再是一个变量了

这里有一个注意事项, 内部类中是不可以定义一个静态方法的


 第三个问题:

当内部类的成员变量和外部类的成员变量重名时, 可以看到下图, 会优先使用自己的

那么如何拿到外部类中的重名成员变量呢, 这也很简单因为内部类是依赖于外部类的, 所以只需要创建一个外部类对象来调用即可

 


内部类在编译后生成的字节码文件是独立的, 名称为: 外部类$内部类.class

静态内部类

两个问题:

1. 如何实例化?

2. 在静态内部类中如何访问外部类中的非静态成员变量?


第一个问题:

静态内部类的结构位置在文章开头已经说过, 想其它的静态变量一样静态内部类是不需要依赖于外部类对象的, 直接使用外部类名即可实例化, 形如下图:

 因为这样的特性, 其使用的频率也是最高的


第二个问题:

在规定的语法中在静态内部类中只可以访问外部类中的静态成员变量, 如下图访问data1时会报错

 那么当非要在内部类中访问外部类的非静态成员变量时该怎么办呢, 这也很简单, 同上面拿到重名的变量相同, 只需要创建一个外部类实例来进行调用即可


以上!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值