一文搞懂内部类(Java)

简介: Java内部类包括成员内部类、静态内部类、局部内部类和匿名内部类。成员内部类能访问外部类的所有成员,可以通过外部类实例创建。静态内部类与外部类实例无关,可直接访问外部类的静态成员。局部内部类仅限方法内使用,能访问最终变量。匿名内部类无名称,常用于一次性实现接口或抽象类,需外部类成员为final。

@[TOC]

内部类(Java)

hello hello~ ,这里是 code袁~💖💖 ,欢迎大家点赞🥳🥳关注💥💥收藏🌹🌹🌹

💥个人主页:code袁
💥 所属专栏:Java

1、内部类

内部类是指定义在另一个类内部的类。在Java中,内部类可以分为四种类型:成员内部类、静态内部类、局部内部类和匿名内部类

2、成员内部类

2.1 定义

成员内部类:成员内部类是定义在另一个类的内部,并且可以访问外部类的成员变量和方法。成员内部类可以使用外部类的实例来创建对象,也可以直接使用外部类的静态成员。

public class Outer {
   
    private int age=12;
    //成员内部类
    public class Inner{
   
        private String name;

        public void test(){
   
            System.out.println("ooo");
        }
        public String getName() {
   
            return name;
        }

        public void setName(String name) {
   
            this.name = name;
        }
    }
}

2.2 使用

public class Test {
   
    public static void main(String[] args){
   
        //成员内部类的使用
        Outer.Inner in=new Outer().new Inner();
        in.test();
    }
}

2.3 成员内部类变量的使用

public class Inner{
   
        private String name;
        private int age=55;

        public void test(){
   

            //成员内部类访问外部类
            int age=12;
            System.out.println(age);
            //访问内部变量
            System.out.println(this.age);
            //访问外部变量
            System.out.println(Outer.this.age);
        }
    }

3、静态内部类

3.1 定义

静态内部类:静态内部类是使用static关键字修饰的内部类,它与外部类的实例无关,可以直接通过外部类名访问。静态内部类不能访问外部类的非静态成员,但可以访问外部类的静态成员

public class Outer {
   
    //静态内部类
    public static class Inner{
   
        private String name;
        public void test(){
   

        }
    }
}

3.2 使用

public class Test {
   
    public static void main(String[] args){
   
        //静态内部类的访问 可以直接访问
        Outer.Inner inner=new Outer.Inner();
        inner.test();
    }
}

3.3 注意事项

1、静态内部类可以直接访问外部类的静态成员吗? 可以的
2、静态内部类中是否可以直接访问外部类的实例成员? 不可以的

4、局部内部类

4.1 定义

局部内部类:局部内部类是定义在方法内部的类作用域仅限于所在方法内部。局部内部类可以访问外部方法的局部变量,但这些变量必须是final的或事实上是final的。

public class Outer {
   
    public void outerMethod() {
   
        final int localVar = 10;

        class LocalInner {
   
            public void localInnerMethod() {
   
                System.out.println("Accessing localVar from local inner class: " + localVar);
            }
        }

        LocalInner inner = new LocalInner();
        inner.localInnerMethod();
    }
}

5、匿名内部类

5.1 定义

匿名内部类:匿名内部类是没有类名的内部类,通常用于创建只需使用一次的类的实例。匿名内部类通常用于实现接口或继承抽象类。

public class Test {
   
    public static void main(String[] args){
   
        Animal a=new Animal(){
   
            @Override
            public void cry(){
   
                System.out.println("11111");
            }
        };
        a.cry();
    }
}
//抽象类
abstract class Animal{
   
    public abstract void cry();
}

5.2 使用

package com.ham.demo1.dy08_NoNameClass;

public class Test2 {
   
    public static void main(String[] args){
   

        Swimming s1=new Swimming() {
   
            @Override
            public void swim() {
   
                System.out.println("游泳");
            }
        };
        go(s1);
    }

    //定义方法
    public static void go(Swimming swimming){
   
        System.out.println("开始——————————————————");
        swimming.swim();
    }
}

interface Swimming{
   
    void swim();
}
在上面的示例中,我们创建了一个匿名内部类来实现Swimming接口,
并重写了其中的swim方法。然后我们创建了一个go对象,
并将这个匿名内部类的实例传递给的go构造函数,最后启动线程执行其中的逻辑。

5.3 注意事项

匿名内部类的优点在于可以简化代码结构,避免单独定义一个类,使得代码更加紧凑和易读。它通常用于只需要一次性使用的场景,避免了定义一个完整的类的开销。
需要注意的是,匿名内部类在定义时可以访问外部类的成员变量和方法,但需要将外部类的成员变量声明为final或事实上是final的。这是因为匿名内部类在编译时会创建一个单独的对象,如果外部类的成员变量发生变化,可能会导致匿名内部类访问到的是旧值。
总的来说,匿名内部类是一种方便且灵活的方式来实现接口或继承抽象类,适用于一次性使用的场景,能够简化代码并提高代码的可读性。

🎉写在最后

🍻伙伴们,如果你已经看到了这里,觉得这篇文章有帮助到你的话不妨点赞👍或 Star ✨支持一下哦!手动码字,如有错误,欢迎在评论区指正💬~

你的支持就是我更新的最大动力💪~

目录
相关文章
|
2月前
|
Java 编译器
【Java】内部类
【Java】内部类
23 0
|
4月前
|
Java
【Java基础面试二】、个Java文件里可以有多个类吗(不含内部类)?
这篇文章讨论了Java文件中类的定义规则,指出一个Java文件可以包含多个类(不包含内部类),但其中最多只能有一个public类,且如果有public类,它的名称必须与文件名一致。
|
4月前
|
算法 Java
12 Java常用类(一)(内部类+object类+包装类)
12 Java常用类(一)(内部类+object类+包装类)
41 5
|
5月前
|
Java
Java进阶之内部类
【7月更文挑战第13天】Java内部类增进代码组织与封装,允许直接访问外部类成员,包括私有成员。主要有四种类型:成员、静态、局部和匿名内部类。匿名内部类常用于一次性实现接口或扩展类。内部类可隐藏实现细节,减少命名冲突,并在特定上下文中定义辅助类。示例展示了静态和非静态内部类如何在Shape类中封装Circle和Rectangle。使用内部类能提升代码可读性,但可能增加复杂性。
47 6
|
4月前
|
Java
【Java】内部类、枚举、泛型
【Java】内部类、枚举、泛型
|
6月前
|
Java
一篇文章讲明白Java中内部类详解—匿名内部类
一篇文章讲明白Java中内部类详解—匿名内部类
100 2
|
6月前
|
设计模式 Java 编译器
Java中的内部类(如果想知道Java中有关内部类的知识点,那么只看这一篇就足够了!)
Java中的内部类(如果想知道Java中有关内部类的知识点,那么只看这一篇就足够了!)
|
6月前
|
Java
Java内部类相关内容总结和解读
Java内部类相关内容总结和解读
35 0
|
6月前
|
存储 Java
Java 五种内部类演示及底层原理详解
Java 五种内部类演示及底层原理详解
36 0
|
6月前
|
Java 编译器 程序员
Java基础9-深入理解Java内部类及其实现原理
Java基础9-深入理解Java内部类及其实现原理
29 0
下一篇
DataWorks