Java内部类以及内部类与静态内部类的区别

在Java编程中,内部类是将一个类定义在另一个类的内部,形成类的嵌套结构。内部类可以访问其所在外部类的成员,包括私有成员,并且可以对外部类对象拥有控制权,从而提供更加灵活和封装的设计方式。

Java中主要有四种内部类:成员内部类、局部内部类、匿名内部类和静态内部类。

成员内部类:

成员内部类指的是定义在外部类的成员位置上的类,可以访问外部类的所有成员变量和方法,示例代码如下:

public class Outer {
    private int count = 1;
    public class Inner {
        public void print() {
            System.out.println("count: " + count);
        }
    }
}

局部内部类:

局部内部类指的是定义在方法或块内部的内部类,只能在方法或块内使用,示例代码如下:

public class Outer {
    public void test() {
        int num = 10;
        class Inner {
            public void print() {
                System.out.println("num: " + num);
            }
        }
        new Inner().print();
    }
}

匿名内部类:

匿名内部类指的是没有类名的内部类,通常用于实现某个接口或类的子类,示例代码如下:

public interface OnClickListener {
    void onClick();
}

public class Button {
    public void setOnClickListener(OnClickListener listener) {
        //...
    }
}

public class Demo {
    public void test() {
        Button button = new Button();
        button.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick() {
                System.out.println("button clicked.");
            }
        });
    }
}

静态内部类:

静态内部类指的是定义在外部类中的静态成员位置上的类,使用static修饰,可以直接通过外部类名访问其静态成员,示例代码如下:

public class Outer {
    private static int count = 1;
    public static class Inner {
        public void print() {
            System.out.println("count: " + count);
        }
    }
}

内部类与静态内部类的区别:

内部类与静态内部类的最大区别就在于是否具有静态特性。静态内部类是独立于外部类的,可以看作是与外部类并列的一种新型数据类型,因此它不能直接访问外部类的非静态成员,而只能访问静态成员。此外,静态内部类与其他类一样,可以拥有静态成员和方法,并且可以通过类名直接调用。

以下是内部类和静态内部类的代码示例:

public class Outer {
    private int outerVar = 10;
    private static int staticOuterVar = 20;

    // 成员内部类
    class Inner {
        private int innerVar = 30;

        public void print() {
            System.out.println("outerVar: " + outerVar);
            System.out.println("staticOuterVar: " + staticOuterVar);
            System.out.println("innerVar: " + innerVar);
        }
    }

    // 静态内部类
    static class StaticInner {
        private int staticInnerVar = 40;

        public void print() {
            // 静态内部类只能访问外部类的静态成员
            System.out.println("staticOuterVar: " + staticOuterVar);
            System.out.println("staticInnerVar: " + staticInnerVar);
        }
    }

    // 测试方法
    public static void main(String[] args) {
        // 测试成员内部类
        Outer outer = new Outer();
        Outer.Inner inner = outer.new Inner();
        inner.print();

        // 测试静态内部类
        Outer.StaticInner staticInner = new Outer.StaticInner();
        staticInner.print();
    }
}

在上述代码示例中,我们定义了一个名为Outer的外部类,并分别在其中定义了一个Inner成员内部类和一个StaticInner静态内部类。在Inner类中,可以直接访问外部类的非静态成员变量outerVar和非静态方法print(),并通过使用外部类名Outer来访问外部类的静态成员变量staticOuterVar,从而证明了成员内部类对外部类对象具有控制权。而在StaticInner类中,虽然也可以通过使用外部类名来访问静态成员变量staticOuterVar,但却不能直接访问外部类的非静态成员变量outerVar和非静态方法print(),从而证明了静态内部类是独立于外部类的新型数据类型。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值