我的编程空间,编程开发者的网络收藏夹
学习永远不晚

java内部类之成员内部类、局部内部类和匿名内部类用法及说明

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

java内部类之成员内部类、局部内部类和匿名内部类用法及说明

内部类概念

一个类中包含另外一个类。

分类

  • 成员内部类。
  • 局部内部类(包含匿名内部类)。

成员内部类

定义格式:

修饰符 class 类名称 {
    修饰符 class 类名称 {
        //...
    }
    //...
}

注意:

内部类使用外部,可以随意访问,但是外部类使用内部类要借助内部类的对象。

使用成员内部类

两种方法:

1. 间接方式:在外部类的方法中,使用内部类,然后main只调用外部类的方法。

2. 直接方式:公式:

一般类:类名称 对象名 = new 类名称();

成员内部类:外部内名称.内部类名称 对象名 = new 外部类名称().new 内部类名称();

Body.java含有一个内部类Heart

public class Body {

    private String name;

    //外部类方法
    public void methodBody() {
        System.out.println("外部类的方法");
        new Heart().beat();//在外部类方法中使用内部类。 
    }


    public  class Heart { //成员内部类
        //内部类方法
        public void  beat() {
            System.out.println("心脏跳动");
            System.out.println("我叫:"+name);
        }
    }
}

下面分别介绍两种方式访问内部类:

间接方式访问内部类

Demo01InnerClass.java

public class Demo01InnerClass {
    public static void main(String[] args) {
        Body body = new Body();//外部类对象

        //通过外部类的对象,调用外部类的方法,里面间接使用内部类Heart
        body.methodBody();

直接方式访问内部类

public class Demo01InnerClass {
    public static void main(String[] args) {
        Body body = new Body();//外部类对对象

        //外部内名称.内部类名称 对象名 = new 外部类名称().new 内部类名称();
        Body.Heart heart = new Body().new Heart();
        heart.beat();
    }
}

外部类和内部类变量重名问题

当外部类的变量和内部类变量重名时,在内部类方法中访问外部类变量的格式是:外部类.this.外部类成员变量名

public class Outer {
    int number = 10;

    public class Inner {
        int number = 20;

        public  void methodInner() {
            int number =30;//内部类方法的局部变量
            System.out.println(number);//就近原则
            System.out.println(this.number);
            System.out.println(Outer.this.number);//外部类的成员变量
        }
    }
}

30
20
10

局部内部类

如果类是定义在一个方法内部的,那么这就是一个局部内部类。

“局部”:只有当前所属的方法才能使用它,出了这个方法外面就不能用了。

定义格式:

修饰符 class 外部类名称 {
    修饰符 返回值类型  外部类方法名称(参数列表) {
        class 局部内部类名称 {
            //...
        }
    }
}

Outer.java含有局部内部类

public class Outer {
    public void methodOuter() {

        class Inner {
            int num = 10;
            public void methodInner() {
                System.out.println(num);//10
            }
        }
        //这个内部列只有当前所属方法能够访问这个类,出了这个方法就不能用了
        Inner inner = new Inner();
        inner.methodInner();
    }
}

DemoMain.java

public class DemoMain {

    public static void main(String[] args) {
        Outer outer = new Outer();
        outer.methodOuter();
    }
}

结果:

10

注意:

局部内部类,如果希望访问所在方法的局部变量,那么这个局部变量必须是【有效final的】

备注:从java 8+开始,只要局部变量事实不变,那么final关键字可以省略。

原因:

1. new 出来的对象在堆内存当中。

2. 局部变量是跟着方法走的,在栈内存当中。

3. 方法运行结束后,立刻出栈,局部变量就会立刻消失。

4. 但是new出来的对象在堆当中持续存在,直到垃圾回收消失。

public class MyOuter {
    public void methodOuter() {
        final int num = 10;//所在方法的局部变量

        
        //num = 20;

        class MyInner {
            public  void methodInner() {
                System.out.println(num);
            }
        }
        Inner myinner = new MyInner();
        inner.methodInner();
    }
}

修饰内部类的权限

public > protected > (default) > private

定义一个类的时候,权限修饰符规则:

  • 外部类:public / (default)
  • 成员内部类:都可以写,public > protected > (default) > private
  • 局部内部类:什么都不能写,但不是de

匿名内部类

如果接口的实现类(或者是父类的子类)只需要使用唯一的一次。

那么这种情况下就可以省略调该类的定义,而改为使用【匿名内部类】。

匿名内部类定义格式:

接口名称 对象名 = new 类名或者接口名称() {
    //覆盖重写所有抽象方法
};

代表继承了或者实现了该接口的子类对象。

==接口MyInterface.java==

public interface MyInterface {
    void method1();//抽象方法
    void method2();
}

==接口实现类MyInterfaceImp.java==

public class MyInterfaceImpl implements  MyInterface {


    @Override
    public void method1() {
        System.out.println("实现类覆盖重写了方法1");
    }

    @Override
    public void method2() {
        System.out.println("实现了覆盖重写方法2");
    }
}

测试类 一、

一般接口实现方法

DemoMain.java

public class DemoMain {
    public static void main(String[] args) {
//        MyInterface impl = new MyInterfaceImpl();
//        impl.method();
        }
}

匿名内部类实现接口

DemoMain.java

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

        //使用匿名内部类,但不匿名对象,对象名称就叫obj
        MyInterface objA = new MyInterface() {
            @Override
            public void method1() {
                System.out.println("匿名内部类实现了方法1-A");
            }
            @Override
            public void method2() {
                System.out.println("匿名内部类实现了方法2-A");
            }
        };
        objA.method1();
        objA.method2();

        System.out.println("----------我是分割线----------");

        //使用匿名内部类,而且省略了对象名称,也是匿名对象
        new MyInterface() {
            @Override
            public void method1() {
                System.out.println("匿名内部类实现了方法1-B");
            }
            @Override
            public void method2() {
                System.out.println("匿名内部类实现了方法2-B");
            }
        }.method1();
    }
}

结果:

匿名内部类实现了方法1-A
匿名内部类实现了方法2-A
----------我是分割线----------
匿名内部类实现了方法1-B

匿名内部内应用

实现倒计时5秒。

public class Demo02_Time {
    public static void main(String[] args) {
        Timer timer = new Timer();
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                System.out.println("倒计时5秒");
            }
        },5000);//倒计时5秒
    }
}

注意事项:

对格式进行解析:"new 接口名称 {...};"进行解析

  • new代表创建对象的动作
  • 接口名称就是匿名内部类需要实现那个接口
  • {…}这才是匿名内部类的内容

注意:

  • 这个类只需要使用一次。匿名内部类在创建对象时,只能使用唯一一次。
  • 如果希望多次希望多次创建对象,而且内容一样的话,那么就必须使用单独定义的实现类。
  • 匿名对象,在调用的时候,只能调用唯一一次。
  • 如果希望同一个对象,调用多次方法,那么必须给对象取一个名字。
  • 匿名内部类是省略了【实现类/子类】,但是匿名对象是省略了【对象命名】。

强调:匿名和匿名对象不是一回事。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

java内部类之成员内部类、局部内部类和匿名内部类用法及说明

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

java内部类之成员内部类、局部内部类和匿名内部类用法及说明

这篇文章主要介绍了java内部类之成员内部类、局部内部类和匿名内部类的用法及说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2022-12-23

怎么使用Java内部类、成员内部类、静态内部类和方法内部类

这篇文章主要讲解了“怎么使用Java内部类、成员内部类、静态内部类和方法内部类”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么使用Java内部类、成员内部类、静态内部类和方法内部类”吧!
2023-06-15

如何理解Java内部类中的匿名内部类

如何理解Java内部类中的匿名内部类,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。匿名内部类  匿名内部类应该是平时我们编写代码时用得最多的,在编写事件监听的代码时使用匿名
2023-06-05

如何理解Java内部类中的局部内部类

这篇文章给大家介绍如何理解Java内部类中的局部内部类,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。局部内部类  局部内部类是定义在一个方法或者一个作用域里面的类,它和成员内部类的区别在于局部内部类的访问仅限于方法内或
2023-06-05

如何理解Java内部类中的成员内部类

如何理解Java内部类中的成员内部类,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。在Java中,可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类。广泛意义上的
2023-06-05

JAVA匿名内部类怎么用

这篇文章主要介绍了JAVA匿名内部类怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1.前言匿名内部类在我们JAVA程序员的日常工作中经常要用到,但是很多时候也只是照本宣
2023-06-20

Java匿名内部类怎么使用

这篇文章主要介绍“Java匿名内部类怎么使用”,在日常操作中,相信很多人在Java匿名内部类怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java匿名内部类怎么使用”的疑惑有所帮助!接下来,请跟着小编
2023-06-22

java中什么是局部内部类

这篇文章将为大家详细讲解有关java中什么是局部内部类,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Java可以用来干什么Java主要应用于:1. web开发;2. Android开发;3.
2023-06-14

java内部类引用局部变量与外部类成员变量实例分析

这篇“java内部类引用局部变量与外部类成员变量实例分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“java内部类引用局部
2023-06-17

java中的匿名内部类总结

java中的匿名内部类总结匿名内部类也就是没有名字的内部类正因为没有名字,所以匿名内部类只能使用一次,它通常用来简化代码编写但使用匿名内部类还有个前提条件:必须继承一个父类或实现一个接口实例1:不使用匿名内部类来实现抽象方法abstrac
2023-05-31

java的内部类和外部类怎么使用

本篇内容介绍了“java的内部类和外部类怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、为何使用内部类内部类提供了更好的封装,只有
2023-06-22

java 中匿名内部类的使用方法

本篇文章为大家展示了java 中匿名内部类的使用方法,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。java 中匿名内部类的实例详解原来的面貌: class TT extends Test{ v
2023-05-31

java匿名内部类的写法是什么

Java匿名内部类的写法如下:1. 实现接口的匿名内部类:```java接口名 对象名 = new 接口名() {// 实现接口的方法};```示例:```javaRunnable runnable = new Runnable() {@O
2023-10-07

java匿名内部类怎么定义和使用

在Java中,匿名内部类是一种没有显式定义类的方式,直接在代码中创建并使用类的一种方式。匿名内部类通常用于创建只需要使用一次的类对象。匿名内部类的定义和使用步骤如下:创建一个需要使用匿名内部类的接口或者抽象类。例如,创建一个接口Greet
java匿名内部类怎么定义和使用
2024-02-29

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录