iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >深入了解Java内部类的用法
  • 825
分享到

深入了解Java内部类的用法

2024-04-02 19:04:59 825人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

目录1.内部类分类和概念2.局部内部类3.匿名内部类(重要)基于接口的匿名内部类基于类的匿名内部类一些细节匿名内部类的最佳实践4.成员内部类5.静态内部类1.内部类分类和概念 jav

1.内部类分类和概念

java类的五大成员:属性,方法,构造器(构造方法),代码块,内部类

内部类的分类:

定义在外部类局部的位置(比如方法内):

  • 局部内部类(有类名)
  • 匿名内部类(无类名)

定义在外部类成员位置上:

  • 成员内部类(没有static修饰)
  • 静态内部类(有static修饰)

概念:在一个类的内部再定义一个完整的类,也会生成一个class文件

代码示例:


public class InnerClass {
    private int n = 521;

    public InnerClass(int n) {
        this.n = n;
    }

    class Inner { // 内部类

    }
}

谨记:内部类很重要,java底层源码内部类使用场景很多!

2.局部内部类

class Outer001 { // 外部类
    private int n = 521;
    private void kaka() {
        System.out.println("我是外部类的方法!");
    }
    public void show() {
        // 局部内部类定义在外部类的局部位置,通常在方法中
        class Inner001 {
            // 局部内部类
            public void f() {
                // 可以直接访问外部类的所有成员,包含私有的
                System.out.println(n);
            }
        }
    }
}

不能添加访问修饰符,但是可以添加final

局部内部类的作用域只在定义它的方法或者代码块中

外部类使用内部类的方法,直接new即可:

public void show() {
    // 局部内部类定义在外部类的局部位置,通常在方法中
    final class Inner001 {
        // 局部内部类
        public void f() {
            // 可以直接访问外部类的所有成员,包含私有的
            System.out.println(n);
            kaka();
        }
    }
    // 外部类使用内部类的方法
    Inner001 inner001 = new Inner001();
    inner001.f();
}

外部其他类不能访问局部内部类!

外部类和局部内部类的成员重名时,默认遵循就近原则,如果想要访问外部类的成员,使用外部类名.this.成员进行访问

3.匿名内部类(重要)

匿名内部类其实有名字,它的名字是底层的jdk给分配的~系统分配该类名的时候会在外部类的基础上加上$1,存在多个内部类的,$后面的值进行递增

基于接口的匿名内部类


public class AnonymousInnerClass {
    public static void main(String[] args) {
        Outer002 outer002 = new Outer002();
        outer002.method();
    }
}

class Outer002 {
    private int n = 521;

    public void method() {
        // 基于接口的匿名内部类
        // tiger的编译类型是IA,运行类型就是匿名内部类!
        // 系统分配该类名的时候会在外部类的基础上加上$1,此处是Outer002$1
        // JDK底层在创建了匿名内部类之后,立即创建了一个实例,并且把地址返回给tiger
        IA tiger = new IA() {
            @Override
            public void cry() {
                System.out.println("我是一只小老虎?");
            }
        };
        tiger.cry();
        System.out.println(tiger.getClass());
    }
}

interface IA {
    public void cry();
}

输出:

我是一只小老虎?
class seNIOrobject.innerclass.Outer002$1

注意:匿名内部类使用一次就不能再使用了!

基于类的匿名内部类

基于类的匿名内部类和基于接口的差不太多

Father类:

class Father {
    private String name;

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

    }
}

匿名内部类:

// 基于类的匿名内部类,加入大括号就摇身一变变成内部类了
Father jack = new Father("jack"){
    @Override
    public void test() {
        super.test();
        System.out.println("♪(^∇^*)");
    }
};
System.out.println(jack.getClass());

输出:

class seniorobject.innerclass.Outer002$2

一些细节

匿名内部类是类,同时,它也可以理解为是一个对象

匿名内部类可以访问外部类的所有成员,包括私有的

不能添加访问修饰符

定义域在定义它的方法或者代码块中,转瞬即逝!

外部其他类不能访问匿名内部类

外部类和匿名内部类成员重名时,参照局部内部类的方式即可

匿名内部类的最佳实践

当作实参直接传递,简洁高效


public class AnonymousInnerClassPractice {
    public static void main(String[] args) {
        f(new IL() {
            @Override
            public void show() {
                System.out.println("你好啊");
            }
        });
    }

    public static void f(IL il) {
        il.show();
    }
}

interface IL {
    void show();
}

4.成员内部类

定义在外部类的成员位置上:

实例:


public class MemberInnerClass {
    public static void main(String[] args) {
        Outer003 outer003 = new Outer003();
        outer003.t();
    }
}

class Outer003 {
    private int n = 521;
    public String name = "dahe";

    class Inner003 { // 成员内部类
        public void say() {
            System.out.println(n + name);
        }
    }

    public void t() {
        // 使用成员内部类
        Inner003 inner003 = new Inner003();
        inner003.say();
    }
}

输出:

521dahe

可以访问外部类的所有成员,包括私有的

可以添加任意的访问修饰符

作用域为整个类体中

外部类想要使用成员内部类,创建对象调用即可!

外部其他类想要访问成员内部类,存在两种方式:

// 直接创建对象
Outer003.Inner003 inner003 = outer003.new Inner003();
// 注意:这里的outer003是外部类的对象实例
// 成员内部类的外部类创建一个返回内部类对象的公有方法
public Inner003 getInner003Instance() {
    return new Inner003();
}

// 外部其他类进行调用该共有方法
Outer003.Inner003 inner0031 = outer003.getInner003Instance();
inner0031.say();

外部类和成员内部类的成员重名时,参考局部内部类和匿名内部类即可

5.静态内部类

可以直接访问外部类的静态成员

可以添加任意的访问修饰符

作用域为整个类体

外部类想要访问静态内部类依然是创建对象访问

外部其他类想要访问静态内部类:

// 通过类名直接访问
Outer004.Inner004 inner004 = new Outer004.Inner004();
inner004.say();
// 静态内部类的外部类创建一个返回内部类对象的公有方法
// 返回静态内部类的对象实例
public Inner004 getInner004() {
    return new Inner004();
}

Outer004.Inner004 inner0041 = outer004.getInner004();
inner0041.say();
// 返回静态内部类的对象实例,但是是静态方法
public static Inner004 getInner004_() {
    return new Inner004();
}

// 静态内部类的外部类创建一个返回内部类对象的公有静态方法
Outer004.Inner004 inner0042 = Outer004.getInner004_();
inner0042.say();

整体代码示例:


public class StaticInnerClass {
    public static void main(String[] args) {
        Outer004 outer004 = new Outer004();
        // 通过类名直接访问
        Outer004.Inner004 inner004 = new Outer004.Inner004();
        inner004.say();
        // 静态内部类的外部类创建一个返回内部类对象的公有方法
        Outer004.Inner004 inner0041 = outer004.getInner004();
        inner0041.say();
        // 静态内部类的外部类创建一个返回内部类对象的公有静态方法
        Outer004.Inner004 inner0042 = Outer004.getInner004_();
        inner0042.say();
    }
}

class Outer004 {
    private int n = 521;
    private static String name = "dahe";
    public static class Inner004 {
        public void say() {
            // 可以直接访问外部类的静态成员
            System.out.println(name);
        }
    }

    // 返回静态内部类的对象实例
    public Inner004 getInner004() {
        return new Inner004();
    }

    // 返回静态内部类的对象实例,但是是静态方法
    public static Inner004 getInner004_() {
        return new Inner004();
    }
}

外部类和成员内部类的成员重名时,遵循就近原则,如果想要访问外部类的成员,使用外部类名.成员即可

以上就是深入了解Java内部类的用法的详细内容,更多关于Java内部类的资料请关注编程网其它相关文章!

--结束END--

本文标题: 深入了解Java内部类的用法

本文链接: https://www.lsjlt.com/news/164476.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • 深入了解Java内部类的用法
    目录1.内部类分类和概念2.局部内部类3.匿名内部类(重要)基于接口的匿名内部类基于类的匿名内部类一些细节匿名内部类的最佳实践4.成员内部类5.静态内部类1.内部类分类和概念 jav...
    99+
    2024-04-02
  • 深入理解Java嵌套类和内部类
     一、什么是嵌套类及内部类可以在一个类的内部定义另一个类,这种类称为嵌套类(nested classes),它有两种类型:静态嵌套类和非静态嵌套类。静态嵌套类使用很少,最重要的是非静态嵌套类,也即是被称作为内部类(inner)。嵌...
    99+
    2023-05-31
    java 嵌套类 内部类
  • Java基础8:深入理解内部类
    更多内容请关注微信公众号【Java技术江湖】这是一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM、SpringBoot、MySQL、分布式、中间件、集群、Linux、网络、多线程,偶尔讲点Docker、EL...
    99+
    2023-06-02
  • java的内部类和外部类用法讲解
    目录一、为何使用内部类二、内部类与外部类的联系2.1内部类是一个相对独立的实体,与外部类不是is-a关系2.2内部类可以直接访问外部类的元素,但是外部类不可以直接访问内部类的元素2....
    99+
    2024-04-02
  • Java中的内部类你了解吗
    目录成员内部类1.定义2.成员内部类的使用规则 3.成员内部类对象的创建:4.内部类与静态域静态内部类:1.定义:2.静态内部类的使用规则:3.静态内部类对象的创建&nbs...
    99+
    2024-04-02
  • 深入了解Java核心类库--Math类
    目录Java常用类库Math一、Field Summary二、Method Summary2.1 常用方法2.1.1 部分方法源码2.2 算数运算2.3 三角函数2.4 其他不常用方...
    99+
    2024-04-02
  • 深入了解Java核心类库--Objects类
    目录1 Objects1.1 Objects方法1.2 Objects常用方法1.2.1 equals(Object a, Object b)1.2.2 isNull(Object ...
    99+
    2024-04-02
  • 深入了解Java核心类库--Arrays类
    目录Java常用类库Arrays一、常用方法1.1 toString1.2 Sort1.2.1 sort​(T[] a, int fromIndex, int toInd...
    99+
    2024-04-02
  • 深入了解Java核心类库--String类
    目录一、 简介零碎知识点字符串常量池堆在逻辑上的划分二、 创建对象2.1.1 直接引用常量区2.1.2 使用构造方法2.1.3 两种实例化方法的区别三、常用方法总结一、 简介 零碎知...
    99+
    2024-04-02
  • 深入了解JavaObject类的使用
    目录1.equals方法==运算符equals2.hashCode3.toString4.finalize1.equals方法 ==运算符 比较运算符,即可以判断基本类型又可以判断引...
    99+
    2024-04-02
  • 深入了解Java I/O 之File类
    目录File类创建File文件File文件基本操作总结File类 Java使用File类来表示计算机系统磁盘文件的对象类型。File类中提供了大量的方法,可以对文件进行增加、修改、删...
    99+
    2024-04-02
  • 深入了解Java核心类库--泛型类
    目录1.1 泛型的使用1.1.1 泛型类1.1.2 泛型接口1.1.3 泛型方法1.1.4 tips 1.2 泛型限制类型1.3 通配符?1.3.1 上界限定1.3.2 下...
    99+
    2024-04-02
  • 深入理解Golang方法的内部实现
    Golang是由Google开发的一种静态类型的编程语言,以其简洁的语法和高效的性能而备受程序员欢迎。在Golang中,方法是一种特殊的函数,用于为结构体添加行为。本文将深入探讨Gol...
    99+
    2024-02-23
    深入理解 内部实现 golang方法
  • Go语言快速入门:深入了解全部内容
    全面了解Go语言的快速入门指南 引言Go语言是一种开源的静态类型编程语言,于2007年由Google公司设计和开发。它结合了传统的编译语言的效率和现代语言的易用性。Go语言非常适合构建高效、可靠且可扩展的软...
    99+
    2024-01-30
    指南 Go语言 快速入门 网络编程 标准库
  • 深入了解volatile和Java内存模型
    目录前言为什么我们需要volatile?保证数据的可见性禁止指令重排序Java内存模型(JMM)JMM下的内存逻辑结构内存交互的操作重排序Volatile实现原理禁止重排序实现原理可...
    99+
    2022-11-13
    Java内存模型 Java volatile Java 内存模型 volatile
  • 深入了解Java核心类库--BigDecimal和System类
    目录BigDecimal 类一、 概述常用字段常用构造方法常用方法System类三个成员变量arraycopy​(Object src, int srcPos, Obje...
    99+
    2024-04-02
  • 怎么使用Java内部类、成员内部类、静态内部类和方法内部类
    这篇文章主要讲解了“怎么使用Java内部类、成员内部类、静态内部类和方法内部类”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么使用Java内部类、成员内部类、静态内部类和方法内部类”吧!&...
    99+
    2023-06-15
  • 深入了解Java核心类库--Date,Calendar,DateFormat类
    目录一、Date1.1 构造方法1.1.1 Date()1.1.2 Date(long date)1.2 常用方法1.3 其他方法二、Calendar(抽象)2.1 获取时间 get...
    99+
    2024-04-02
  • 如何理解Java内部类中的局部内部类
    这篇文章给大家介绍如何理解Java内部类中的局部内部类,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。局部内部类  局部内部类是定义在一个方法或者一个作用域里面的类,它和成员内部类的区别在于局部内部类的访问仅限于方法内或...
    99+
    2023-06-05
  • java内部类之成员内部类、局部内部类和匿名内部类用法及说明
    目录内部类概念分类成员内部类使用成员内部类间接方式访问内部类直接方式访问内部类外部类和内部类变量重名问题局部内部类修饰内部类的权限匿名内部类测试类 一、匿名内部内应用总结内部类概念 ...
    99+
    2022-12-23
    java成员内部类 java局部内部类 java匿名内部类 java内部类
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作