内部类详解!!!

本文详细介绍了Java中的内部类,包括成员内部类、局部内部类和匿名内部类的使用方式和特点。成员内部类可以直接访问外部类的所有成员,而局部内部类需要外部类的成员变量为final。此外,还讲解了如何创建匿名内部类及其在面试中的相关问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概述:

把类定义在其他类的内部,这个类就称为内部类。

特点:

1、内部类可直接访问外部类的成员,包括私有成员。
2、外部类访问内部类,必须创建对象。

成员内部类

成员内部类(非静态)
外部类.内部类 对象名 = new 外部类().new 外部类();
成员内部类(静态)
外部类.内部类 对象名 = new 外部类().内部类();

package org.wdzl.unit04;

/**
 * 成员内部类的修饰符
 *   private:为了提高数据的安全性,
 *        案例:每一台电脑都有CPU
 *
 * class Computer{
 * //内部类
 *    private class CPU{
 *        public void method(){
 *            System.out.println("改装成水冷")
 *        }
 *    }
 *    public void function(){
 *        if(你是专业人士){
 *            CPU cpu = new CPU();
 *            cpu.method();
 *        }
 *    }
 *
 * }
 * //使用内部类功能
 * Computer.CPU cc = new Computer().new CPU();
 * cc.method();
 */
class Outer3{
    private int num = 10;
    static int num2 = 20;


    public static class Inner3{
        public void show(){
            System.out.println(num2);
        }
        public static void show2(){
            System.out.println(num2);
        }
    }

}

public class InnerDemo3 {
    public static void main(String[] args) {
        //成员内部类被static修饰后的访问方式。
        //格式:外部类名.内部类名 对象名 = new 外部类名().内部类名();
        Outer3.Inner3 oi = new Outer3.Inner3();
        oi.show();
        oi.show2();
    }
}

局部内部类

特点:
1、局部变量访问成员变量,该成员变量必须加final关键字。

package org.wdzl.unit04;

/**
 * 局部内部类:
 *    1、局部内部类可以直接访问外部类的成员
 *    2、访问局部内部类里方法,在局部创建内部类的对象,再通过对象去调用内部类中的方法。
 *  面试题:
 *     局部内部类访问局部变量注意事项:
 *       因为局部内部类与局部变量生命周期冲突,所以加入final关键字来解决这个冲突
 *       冲突:
 *         1、局部内部类存储在堆内存当中,方法执行完毕后,它不会被立即回收
 *         2、局部变量存储在栈内存中,方法执行完毕后,会被立即回收
 *         3、局部变量被回收,但是局部内部类中还有对局部内部类的调用。
 *         4、final关键字修饰的变量会变成常量,它的存储区域会改变到堆内存当中。
 *
 *
 */
public class InnerDemo4 {
    public static void main(String[] args) {
        Outer5 outer5 = new Outer5();
        outer5.method();
    }
}
class Outer5{
    public int num = 5;
    private int num2 = 10;
    public void method(){
        int num3 = 20;
        //局部内部类
        class Inner5{
            public void showInfo(){
                System.out.println(num);
                System.out.println(num2);
                System.out.println(num3);
            }
        }
        //只能在成员方法创建成员内部类对象,因为它是在成员方法内的,作用域也在成员方法之中。
        Inner5 inner5 = new Inner5();
        inner5.showInfo();
    }
}

匿名内部类

概述: 内部类的简化
前提: 存在一个类(抽象类)或者接口
格式: new 类名或者接口名(){重写方法};

面试题

在这里插入图片描述

package org.wdzl.unit04;

/**
 * 1、内部类与外部类不是继承关系
 * 2、通过外部类名限定this
 *     格式:外部类.this.num;
 */
public class Test {
    public static void main(String[] args) {
        Outer4.Inner4 oi = new Outer4().new Inner4();
        oi.show();
    }
}
class Outer4{
    public int num = 10;
    class Inner4 extends Object{
        public int num = 20;
        public void show(){
            int num = 30;
            System.out.println(num);
            System.out.println(this.num);
            //方式1
            System.out.println(new Outer4().num);
            //方式2
            System.out.println(Outer4.this.num);
        }
    }
}

面试题

在这里插入图片描述

package org.wdzl.unit04;

/**
 * 匿名对象面试题:补全代码输出:"HelloWorld"
 */

interface Inter7{
    void show();//接口中的方法默认是public abstract
}
class Outer7{
    //补全代码
    //1、 Outer7.method():所以我们知道method方法是一个静态方法。
    //2、Outer7.method().show();可知:Outer7.method()执行的结果应该是返回了一个对象,只有对象才能继续调用方法。
    //         又由接口Inter得知,method返回的结果应该是Inter接口的实现类对象。
    public static Inter7 method(){
        return new Inter7(){
            @Override
            public void show() {
                System.out.println("Hello World");
            }
        };
    }
}
public class Test1 {
    public static void main(String[] args) {
        Outer7.method().show();
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值