返回顶部
首页 > 资讯 > 后端开发 > Python >解析JavaSe的内部类
  • 631
分享到

解析JavaSe的内部类

2024-04-02 19:04:59 631人浏览 薄情痞子

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

摘要

目录内部类1. 内部类简介2. 非静态内部类3. 静态内部类4. 匿名内部类总结内部类 1. 内部类简介 (1) 内部类提供了更好的封装,可以把内部类隐藏在外部类之内,不允许同一个包

内部类

1. 内部类简介

(1) 内部类提供了更好的封装,可以把内部类隐藏在外部类之内,不允许同一个包中的其他类访问该类。

(2) 内部类成员可以直接访问外部类的私有数据,因为内部类被当成其外部类成员,同一个类的成员之间可以互相访问。但外部类不能访问内部类的实现细节,例如内部类的成员变量。

(3) 匿名内部类适合用于创建那些仅需要一次使用的类。

(4) 在java中内部类主要分为成员内部类(非静态内部类、静态内部类)、匿名内部类、局部内部类。

2. 非静态内部类

成员内部类是一种与Field、方法、构造器和初始化块相似的类成员,成员内部类分为两种:静态内部类和非静态内部类,使用static修饰的成员内部类是静态内部类,没有使用static修饰的成员内部类是非静态内部类。

  • 因为内部类作为其外部类的成员,所以可以使用任意访问控制符如private、protected和public等修饰;
  • 非静态内部类不能有静态方法、静态属性、静态初始化块;
  • 非静态内部类可以直接访问外部类的成员,但是外部类不能直接访问非静态内部类成员;
  • 外部类的静态方法、静态代码块中不能直接创建非静态内部类实例,访问内部类成员;
  • 非静态内部类的对象必须寄存在外部类的对象里,因此创建非静态内部类对象之前,必须先创建其外部类对象;

当在非静态内部类的方法内访问某个变量时,系统优先在该方法内查找是否存在该名字的局部变量,如果存在就使用该变量;如果不存在,则到该方法所在的内部类中查找是否存在该名字的成员变量,如果存在则使用该成员变量;如果不存在,则到该内部类所在的外部类中查找是否存在该名字的成员变量,如果存在则使用该成员变量;如果依然不存在,系统将出现编译错误:提示找不到该变量。

(1) 非静态内部类可以直接访问外部类的成员,但是外部类不能直接访问非静态内部类成员

public class OuterClass {
    private int a;
    public void test(){
        // 编译报错,因为外部类不能直接访问非静态内部类成员
        System.out.println(b);
        // 如需访问内部类的实例Field,需显式创建内部类对象
        InnerClass inner = new InnerClass();
        System.out.println(inner.b);
    }
    // 定义非静态内部类,使用private修饰符
    @Data
    private class InnerClass{
        private int b;
        public void info(){
            // 在非静态内部类里可以直接访问外部类的private成员
            System.out.println(a);
        }
    }
}

(2) 非静态内部类不能有静态方法、静态属性、静态初始化块

public class OuterClass {
    // 外部类Field
    private int a;
    // 定义非静态内部类,使用private修饰符
    @Data
    private class InnerClass{
        // 内部类Field
        private int b;
        private int c;
        // 编译报错,非静态内部类里面不能有静态属性
        private static int d;
        // 编译报错,非静态内部类里面不能有静态代码块
        static {
            System.out.println("非静态内部类里面不能有静态代码块");
        }
        // 编译报错,非静态内部类里面不能有静态方法
        public static void show(){
            System.out.println("非静态内部类里面不能有静态方法");
        }
    }
}

(3) 外部类的静态方法、静态代码块中不能直接创建非静态内部类实例,访问内部类成员

public class OuterClass {
    private int a;
    public static void test(){
        // 编译报错,外部类的静态方法中无法创建内部类实例
        InnerClass innerClass = new InnerClass();
    }
    static{
        // 编译报错,外部类的静态方法中无法创建内部类实例
        InnerClass innerClass = new InnerClass();
    }
    // 定义非静态内部类
    @Data
    private class InnerClass{
        private int b;
    }
}

在外部类的普通方法和静态方法中访问内部类成员

public class OuterClass {
    private int a;
    // 定义非静态内部类,使用private修饰符
    @Data
    private class InnerClass{
        private int b;
        public void info(){
            System.out.println("内部类的方法info()");
        }
    }
    // 外部类的代码块
    {
        InnerClass innerClass = new InnerClass();
        innerClass.info();
    }
    // 外部类的静态代码块
    static {
        OuterClass.InnerClass inner = new OuterClass().new InnerClass();
        inner.info();
    }
    // 外部类的普通方法
    public void test(){
        // 在外部类里使用非静态内部类时,与平时使用普通类并没有太大的区别
        InnerClass inner = new InnerClass();
        // 访问内部类的Filed
        System.out.println(inner.b);
        // 访问内部类的方法
        inner.info();
    }
    //  外部类的静态方法
    public static void test1(){
        // 外部类的静态方法、静态代码块中不能直接创建非静态内部类实例
        OuterClass.InnerClass inner = new OuterClass().new InnerClass();
        // 访问内部类的Filed
        System.out.println(inner.b);
        // 访问内部类的方法
        inner.info();
    }
    // 测试
    public static void main(String[] args) {
        OuterClass outerClass = new OuterClass();
        outerClass.test();
    }
}

3. 静态内部类

如果使用static来修饰一个内部类,则这个内部类就属于外部类本身,而不属于外部类的某个对象。static关键字的作用是把类的成员变成类相关,而不是实例相关,即static修饰的成员属于整个类,而不属于单个对象。

  • 静态内部类可以包含静态成员,也可以包含非静态成员。
  • 静态内部类不能访问外部类的实例成员,只能访问外部类的类成员;
  • 外部类不能直接访问静态内部类的成员,但可以使用静态内部类的类名作为调用者来访问静态内部类的类成员,也可以使用静态内部类对象作为调用者来访问静态内部类的实例成员。

(1) 静态内部类不能访问外部类的实例成员,只能访问外部类的类成员

public class OuterClass {
    private int a;
    private static int b;
    public void test(){
        System.out.println(a);
    }
    @Data
    private static class InnerClass{
        private int c;
        // 静态内部类中可以包括静态成员
        private static int d;
        public void info(){
            // 编译报错,静态内部类不能访问外部类的实例成员
            System.out.println(a);
        }
        public static void show(){
            // 静态内部类可以访问外部类的静态成员
            System.out.println(b);
        }
    }
}

(2) 外部类不能直接访问静态内部类的成员,但可以使用静态内部类的类名作为调用者来访问静态内部类的类成员,也可以使用静态内部类对象作为调用者来访问静态内部类的实例成员。

public class OuterClass {
    private int a;
    private static int b;
    public void test(){
        // 外部类不能直接访问静态内部类的成员
        // 可以使用静态内部类对象作为调用者来访问静态内部类的实例成员
        InnerClass innerClass = new InnerClass();
        innerClass.show();
        // 可以使用静态内部类的类名作为调用者来访问静态内部类的类成员
        InnerClass.show();
    }
    public static void main(String[] args) {
        OuterClass outerClass = new OuterClass();
        outerClass.test();
    }
    @Data
    private static class InnerClass{
        private int c;
        private static int d;
        public static void show(){
            System.out.println(b);
        }
    }
}

4. 匿名内部类

匿名内部类适合创建那种只需要一次使用的类,创建匿名内部类时会立即创建一个该类的实例,这个类定义立即消失,匿名内部类不能重复使用。

  • 匿名内部类必须继承一个父类,或实现一个接口,但最多只能继承一个父类,或实现一个接口;
  • 匿名内部类不能是抽象类,因为系统在创建匿名内部类时,会立即创建匿名内部类的对象。因此不允许将匿名内部类定义成抽象类;
  • 匿名内部类不能定义构造器,因为匿名内部类没有类名,所以无法定义构造器,但匿名内部类可以定义实例初始化块,通过实例初始化块来完成构造器需要完成的事情;
public interface Product {
     public int getPrice();
     public String getName();
}
public class Test {
    public void test(Product product){
        System.out.println("name:"+product.getName() +"-------"+"name:"+product.getPrice());
    }
    public static void main(String[] args) {
        Test test = new Test();
        test.test(new Product() {
            @Override
            public int getPrice() {
                return 12;
            }
            @Override
            public String getName() {
                return "苹果";
            }
        });
    }
}

Test类定义了一个test方法,该方法需要一个Product对象作为参数,但Product只是一个接口,无法直接创建对象,因此此处考虑创建一个Product接口实现类的对象传入该方法——如果这个Product接口实现类需要重复使用,则应该将该实现类定义成一个独立类;如果这个Product接口实现类只需一次使用,则可采用上面程序中的方式,定义一个匿名内部类。

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注编程网的更多内容!   

--结束END--

本文标题: 解析JavaSe的内部类

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

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

猜你喜欢
  • 解析JavaSe的内部类
    目录内部类1. 内部类简介2. 非静态内部类3. 静态内部类4. 匿名内部类总结内部类 1. 内部类简介 (1) 内部类提供了更好的封装,可以把内部类隐藏在外部类之内,不允许同一个包...
    99+
    2024-04-02
  • 【JavaSE】内部类
    文章目录 内部类概念局部内部类匿名内部类(重点重点!!! )成员内部类静态内部类 内部类概念 可以将一个类定义在另一个类或者一个方法的内部,前者称为内部类,后者称为外部类。内部类也是封装的...
    99+
    2023-09-14
    java 开发语言 内部类
  • JavaSE学习之内部类及常用API
    目录1.内部类1.1内部类概述1.2成员内部类1.3局部内部类1.4匿名内部类1.5匿名内部类在开发中的使用2.常用API2.1Math2.2System2.3Object2.4Ar...
    99+
    2024-04-02
  • JavaSE中内部类及常用API有哪些
    这篇文章将为大家详细讲解有关JavaSE中内部类及常用API有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1.内部类1.1 内部类概述内部类:就是在一个类中定义一个类。例如:在一个类A内部定义一个类...
    99+
    2023-06-22
  • 解析JavaSe的抽象类和接口
    目录1. 抽象类和抽象方法2. 相关面试题1、抽象类必须要有抽象方法吗?2、普通类和抽象类有哪些区别?3、抽象类能使用 final 修饰吗?3. 接口3.1 接口中的常量3.2 接口...
    99+
    2024-04-02
  • Java内部类详解(含:成员内部类、局部内部类、匿名内部类、静态内部类)
    内部类是什么? 字面意思,在类的内部编写的类就叫内部类!即一个类的内部又完整的嵌套了另一个类结构,被嵌套的类称为内部类(inner class),嵌套其他类的类称为外部类(outer class)。 内部类是类的第五大成员→【提示:类的五大...
    99+
    2023-10-26
    jvm
  • 如何理解Java内部类中的局部内部类
    这篇文章给大家介绍如何理解Java内部类中的局部内部类,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。局部内部类  局部内部类是定义在一个方法或者一个作用域里面的类,它和成员内部类的区别在于局部内部类的访问仅限于方法内或...
    99+
    2023-06-05
  • 如何理解Java内部类中的匿名内部类
    如何理解Java内部类中的匿名内部类,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。匿名内部类  匿名内部类应该是平时我们编写代码时用得最多的,在编写事件监听的代码时使用匿名...
    99+
    2023-06-05
  • 如何理解Java内部类中的成员内部类
    如何理解Java内部类中的成员内部类,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。在Java中,可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类。广泛意义上的...
    99+
    2023-06-05
  • Java的内部类实例分析
    这篇文章主要介绍了Java的内部类实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java的内部类实例分析文章都会有所收获,下面我们一起来看看吧。内部类:其实内部类顾名思义,就是类中类,一个类里面还有一个...
    99+
    2023-06-29
  • java外部类与内部类的关系详解
     private,public,protected,default的访问权限区别 在学习外部类与内部类之前我们首先要弄明白private,public,protected,defau...
    99+
    2024-04-02
  • java的内部类和外部类用法讲解
    目录一、为何使用内部类二、内部类与外部类的联系2.1内部类是一个相对独立的实体,与外部类不是is-a关系2.2内部类可以直接访问外部类的元素,但是外部类不可以直接访问内部类的元素2....
    99+
    2024-04-02
  • Java内部类示例分析
    这篇文章主要介绍“Java内部类示例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Java内部类示例分析”文章能帮助大家解决问题。1.内部类概念及分类将一个类定义在另一个类的内部或者接口内部或者...
    99+
    2023-06-29
  • 浅析Java语言中的内部类
    浅析Java语言中的内部类[@more@]  提起Java内部类(Inner Class)可能很多人不太熟悉,实际上类似的概念在C++里也有,那就是嵌套类(Nested Class),关于这两者的区别与联系,在下文中会有对比。内部类从表面上...
    99+
    2023-06-03
  • Java内部类和异常类的示例分析
    这篇文章将为大家详细讲解有关Java内部类和异常类的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1 内部类Java支持在一个类中声明另一个类,这样的类称作内部类,而包含内部类的类成为内部类的外嵌...
    99+
    2023-06-14
  • java内部类之成员内部类、局部内部类和匿名内部类用法及说明
    目录内部类概念分类成员内部类使用成员内部类间接方式访问内部类直接方式访问内部类外部类和内部类变量重名问题局部内部类修饰内部类的权限匿名内部类测试类 一、匿名内部内应用总结内部类概念 ...
    99+
    2022-12-23
    java成员内部类 java局部内部类 java匿名内部类 java内部类
  • 解析JavaSE的继承和多态
    目录1. 继承1. 子类继承了父类,获得父类的全部Field和方法。2. 子类继承了父类,额外增加新的Field和方法3. 子类继承了父类,重写父类中的方法4. super限定,在子...
    99+
    2024-04-02
  • 怎么使用Java内部类、成员内部类、静态内部类和方法内部类
    这篇文章主要讲解了“怎么使用Java内部类、成员内部类、静态内部类和方法内部类”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么使用Java内部类、成员内部类、静态内部类和方法内部类”吧!&...
    99+
    2023-06-15
  • Java内部类与匿名内部类
    目录一、内部类什么是内部类成员内部类访问特点二、匿名内部类前提格式使用方式一、内部类 什么是内部类 将一个类A定义在另一个类B里面,里面的那个类A就称为内部类,B则称为外部类。 成员...
    99+
    2024-04-02
  • java外部类与内部类怎么理解
    本篇内容主要讲解“java外部类与内部类怎么理解”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“java外部类与内部类怎么理解”吧! 一、内部类内部类就是将一个类A定义在类B里边,里边的...
    99+
    2023-06-22
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作