广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Java中的内部类你了解吗
  • 611
分享到

Java中的内部类你了解吗

2024-04-02 19:04:59 611人浏览 八月长安

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

摘要

目录成员内部类1.定义2.成员内部类的使用规则 3.成员内部类对象的创建:4.内部类与静态域静态内部类:1.定义:2.静态内部类的使用规则:3.静态内部类对象的创建&nbs

成员内部类

1.定义

成员内部类是直接定义在类中,不加任何修饰符的(特指不加static修饰的)的内部类,可以类比着成员变量来理解,如下面这个代码段中的Inn类就是一个成员内部类

public class Inner1 {
    private String o = "外部类属性";
    public class Inn{
        private String i = "成员内部类属性";
    }
}

2.成员内部类的使用规则

  • 内部类可以直接的访问外部类的成员变量,但是因为内部类也是一个类,所以外部类必须通过内部类的对象才能访问内部类的成员变量
  • 内部类就相当于外部类的成员变量,故而内部类与外部类之间可以方便的相互访问,包括privte权限修饰的属性和方法
  • 成员内部类可以实现“曲线救国”,通过多个内部类继承别的类,变相的实现多继承
//成员内部类
public class Inner1 {
//    外部类的私有属性o
    private String o = "外部类属性";
    public class Inn{
//        内部类的私有属性i
        private String i = "成员内部类属性";
        private void Itest(){
//            内部类直接访问外部类的属性,包括私有属性
            System.out.println(o);
        }
    }
    public void Otest(){
//        外部类则要先创建内部类的对象再访问其成员变量,这里注意,也可以访问其私有属性
        Inn in = new Inn();
        in.Itest();
        System.out.println(in.i);
    }
    public static void main(String[] args) {
        Inner1 i1 = new Inner1();
        i1.Otest();
    }
}

 3.成员内部类对象的创建:

  • 外部类的内部创建:与正常类的对象创建方法一样,
  • 内部类名称 对象名 = new 类名() 
public class Inner1 {
    private String str1 = "外部类";
//    外部类内部创建内部类对象
    Inn i1 = new Inn();
    private class Inn{
        private String str2 = "内部类";
    }
}
  • 外部类的外部创建:成员内部类就相当于是外部类的一个特殊的成员变量,故而,我们知道,成员内部类依赖于外部类的存在而存在,也就是说,必须先有外部类的对象才能创建成员内部类的对象 
  • 外部类名称.内部类名称 对象名 = new 外部类名称().new 内部类名称()
  • 当前,在外部类的外部创建内部类对象时,前提也需得内部类对外部类的外部是可见的

如下图, 内部类为private,在外部类的外部无法创建该对象

修改内部类访问权限为public时正确创建 :

public class Inner1 {
    private String str1 = "外部类";
//    外部类内部创建内部类对象
    Inn i1 = new Inn();
    public class Inn{
        private String str2 = "内部类";
    }
}
class Test{
//    外部类的外部创建外部类的内部类对象
    Inner1.Inn i2 = new Inner1().new Inn();
}

4.内部类与静态域

  • 成员内部类可以访问外部类的静态域,但是自己不能定义静态变量(成员内部类是依赖于外部类的,如果它自己能定义静态变量,没有外部对象也能访问了,失去其意义)
  • 外部类中的静态方法也不能使用成员内部类(相当于在静态变量中调用成员变量,是不可行的)。
  • 为此,特别注意,main方法就是static方法,故而不能直接在外部类的main方法中创建内部类对象,要借助外部类才能创建
public class Inner1 {
    private String str1 = "外部类";
//    外部类内部创建内部类对象
    Inn i1 = new Inn();
    public class Inn{
        private String str2 = "内部类";
    }
    public static void main(String[] args) {
//        main中创建
        Inner1.Inn inn = new Inner1().new Inn();
        System.out.println(inn.str2);
    }
}

静态内部类:

1.定义:

  • 静态内部类也是定义在类中,但是与成员内部类不同的是,它用static修饰,是静态内部类,可类比静态变量进行理解
  • static修饰,所以它无需依赖外部类对象,我们可以把它看作一个普通类
public class Inner2 {
    private String str1 = new String("外部");
//    静态内部类
    public static class Inn{
        private String str2 = new String("静态内部");
    }
}

2.静态内部类的使用规则:

静态内部类不能直接访问外部类的普通成员变量 (普通成员变量有对象才能访问,所以static不能访问普通的成员变量),当然,可以通过new一个外部类的对象来达到访问外部类成员变量的目的
public class Inner2 {
    private String str1 = new String("外部");
    private static String str3 = new String("外部静态属性");
//    静态内部类
    public static class Inn {
    private String str2 = new String("静态内部");
    public void fun(){
//        静态内部类不能直接访问外部类的普通成员变量
        System.out.println(str1);
//        但可以通过new一个外部类对象访问
        Inner2 i2 = new Inner2();
        System.out.println(i2.str1);
//        static家族互通
        System.out.println(str3);
    }
}
}

但是,静态内部类虽然不能直接访问外部类的成员变量,但是是可以拥有自己的普通成员变量 的

3.静态内部类对象的创建

  • 外部类内部:和普通类的用法相同 ,且不同于成员内部类,在静态内部类这里,外部类的静态方法中是可以创建静态内部类的对象(static家族互访),当然,没有对象都可以,那么,外部类的成员方法中也是可以创建静态内部类对象的
  • 内部类名称 对象名 = new 类名() 
public class Inner2 {
    private String str1 = new String("外部");
//    静态内部类
    public static class Inn{
        private String str2 = new String("静态内部");
    }
//    直接在类的内部创建静态内部类的对象
    Inn i = new Inn();
    public static void main(String[] args) {
//        外部类的静态方法中创建使用静态内部类的对象
        Inn inn = new Inn();
    }
}

外部类的外部:

外部类名称.内部类名称 对象名 = new 外部类名称. 内部类名称()

public class Inner2 {
    private String str1 = new String("外部");
//    静态内部类
    public static class Inn {
    private String str2 = new String("静态内部");
}
}
class Test{
//    外部类的外部创建静态内部类的对象
    Inner2.Inn i = new Inner2.Inn();
}

 成员内部类 VS 静态内部类

  • 成员内部类可以访问外部类的成员域和静态域,但是不能拥有自己的静态域
  • 静态内部类不可以直接访问外部类的成员域,但可以拥有自己的成员域,另外,static家族互访,随意

方法内部类:

1.定义:

直接定义在方法内部,不允许使用任何修饰符修饰(包括访问权限修饰符,static等),对外部完全隐藏,出了这个方法,这个类就没有了,可以类比局部变量进行理解 

2.方法内部类的使用规则:

除了无法定义static域外,和成员内部类基本一样,这里不再赘述

3.注意形参的使用

方法内部类中若使用了方法的形参, 该形参为隐式的final声明(jdk8之前,必须手动显式定义为final ,但JDK8以后,直接隐式一定为final)

如下面这个例子:

public class Inner3 {
    public void fun(int num){
//        方法内部类
        class Inn{
            public void test(){
//                将下面这行代码注释掉,num正常可作运算
//                System.out.println(num);
            }
        }
        num ++;
        System.out.println(num);
    }
    public static void main(String[] args) {
        Inner3 i3 = new Inner3();
        i3.fun(3);
    }
}

 但如果我们的方法内部类使用了方法的形参,编译报错

 

匿名内部类(函数式编程)

  • 是方法内部类的特殊版本,直接不写类名称
  • 遵从方法内部类的所有要求
  • 默认会继承一个类或实现一个接口,继承类一般是继承抽象类
  • 通常是在传参的过程中使用该类,可以简化写法

如之前我们写的接口传参:

public class Inner4 {
    public static void fun(MessageImpl m) {
        m.printMessage();
    }
    public static void main(String[] args) {
        MessageImpl l = new MessageImpl();
        fun(l);
    }
}
interface IMessage {
    void printMessage();
}
class MessageImpl implements IMessage {
    public void printMessage() {
        System.out.println("aaa");
    }
}

 使用匿名内部类可以这样写:

public class Inner4 {
    public static void fun(IMessage m ){
        m.printMessage();
    }
    public static void main(String[] args) {
//        匿名内部类
        fun(new IMessage() {
            @Override
            public void printMessage() {
                System.out.println("aaa");
            }
        });
    }
}
interface IMessage {
    void printMessage();
}

 最后,重点掌握成员内部类与静态内部类,以及二者使用区别。

总结

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

--结束END--

本文标题: Java中的内部类你了解吗

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

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

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

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

下载Word文档
猜你喜欢
  • Java中的内部类你了解吗
    目录成员内部类1.定义2.成员内部类的使用规则 3.成员内部类对象的创建:4.内部类与静态域静态内部类:1.定义:2.静态内部类的使用规则:3.静态内部类对象的创建&nbs...
    99+
    2022-11-13
  • C++的友元和内部类你了解吗
    目录友元函数案例友元类内部类总结友元分为:友元函数 和 友元类 友元提供了一种突破封装的方式,有时提供了便利。但是友元会增加耦合度,破坏了封装,所以友元不宜多用。...
    99+
    2022-11-13
  • 你了解Java中的Object类吗
    任何一个类默认继承Object类,就算没有直接继承,最终也会间接继承。 Object类,有两种方式找到: 第一种:在源码当中找到 第二种:查阅java类库的帮助文档...
    99+
    2022-11-12
  • 学生视角带你了解Java内部类
    目录一、内部类介绍二、成员内部类:1、非静态内部类2、静态内部类二、局部内部类:2、有名的局部内部类1、匿名局部内部类(重要)一、内部类介绍 1.定义:一个类内部又嵌套了一个类,被嵌...
    99+
    2022-11-13
  • PHP数组的内部实现你了解吗
    目录前言探究zvalzend_array结构介绍结构体数组插入操作hash函数总结前言 这几天在翻github的时候, 碰巧看到了php的源码, 就 down 下来随便翻了翻&nbs...
    99+
    2022-11-13
  • Java中的抽象类和接口你了解吗
    目录抽象类什么是抽象类?抽象类属于什么类型?抽象类怎么定义?抽象类是干什么的?什么是抽象方法?非抽象类继承抽象类抽象类总结接口接口的基础语法接口的实现接口和多态联合使用继承和实现同时...
    99+
    2022-11-13
  • 如何理解Java内部类中的局部内部类
    这篇文章给大家介绍如何理解Java内部类中的局部内部类,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。局部内部类  局部内部类是定义在一个方法或者一个作用域里面的类,它和成员内部类的区别在于局部内部类的访问仅限于方法内或...
    99+
    2023-06-05
  • 深入了解Java内部类的用法
    目录1.内部类分类和概念2.局部内部类3.匿名内部类(重要)基于接口的匿名内部类基于类的匿名内部类一些细节匿名内部类的最佳实践4.成员内部类5.静态内部类1.内部类分类和概念 jav...
    99+
    2022-11-13
  • 一文带你真正理解Java中的内部类
    目录概述内部类介绍和分类常规内部类局部内部类匿名内部类静态内部类静态内部类和普通内部类的区别内部类的作用概述 不知道大家在平时的开发过程中或者源码里是否留意过内部类,那有思考过为什么...
    99+
    2022-11-13
  • 如何理解Java内部类中的匿名内部类
    如何理解Java内部类中的匿名内部类,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。匿名内部类  匿名内部类应该是平时我们编写代码时用得最多的,在编写事件监听的代码时使用匿名...
    99+
    2023-06-05
  • 如何理解Java内部类中的成员内部类
    如何理解Java内部类中的成员内部类,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。在Java中,可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类。广泛意义上的...
    99+
    2023-06-05
  • TypeScript中的函数和类你了解吗
    目录函数作为参数定义函数函数参数的类型可选类型参数默认值剩余参数this的默认推导函数重载类初始化继承多态成员修饰符总结函数 以下声明了一个函数类型,通过type来定义类型别名,vo...
    99+
    2022-11-13
  • python3中的类继承你真的了解吗
    目录(1)首先使用直接继承的方式(2)在子类中定义属性(3)如果想要继承父类中的属性,一般使用super方法:(4)如果需要在子类的__init__中传入参数则可以这样使用:&nbs...
    99+
    2022-11-13
  • PHP编程中的数据类型:你了解了吗?
    在PHP编程中,数据类型是非常重要的一部分。正确使用数据类型可以提高程序的效率和可读性,避免不必要的错误和问题。本文将介绍PHP中常见的数据类型,并演示一些代码来帮助你更好地理解它们。 基本数据类型 PHP中的基本数据类型包括整型(i...
    99+
    2023-09-10
    编程算法 学习笔记 数据类型
  • 你了解ASP中的HTTP数据类型吗?
    ASP(Active Server Pages)是一种基于服务器端的脚本语言,它可以用来构建动态网站。在ASP中,HTTP数据类型是非常重要的一个概念。本文将为大家详细介绍ASP中的HTTP数据类型。 一、HTTP数据类型概述 HTTP(H...
    99+
    2023-08-11
    数据类型 http 自然语言处理
  • C++中类的转换函数你了解吗
    只有接受一个参数(其他参数有默认值的也算)的构造函数才能作为转换构造函数。 在C++中,接受一个参数的构造函数为将类型与该参数相同的值转换为类提供了蓝图。因此,下面的构造函数用于将d...
    99+
    2022-11-13
  • C++的内联函数你了解吗
    目录1.概念2.函数演示3.函数特性总结1.概念 以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数压栈的开销,内联函数提升程序运行的效率。...
    99+
    2022-11-13
  • 内网穿透你真的了解吗?
    前言 内网穿透作为程序员常用的调试手段之一,我们可以通过在个人电脑上运行花生壳或者 frp 等方式,让他人访问我们本地启动的服务,而且这种访问可以不受局域网的限制,当我们使用ngrok,frp等开源框架时,你是否有好奇过它神奇的作用?明明没...
    99+
    2023-08-31
    网络穿透 NAT 内网 后端开发 Linux服务器开发
  • Java的内存区域与内存溢出异常你了解吗
    目录1.运行时数据区域1.程序计数器(线程私有)2.Java虚拟机栈(线程私有)3.本地方法栈(线程私有)4.Java堆(线程共享)5.方法区(线程共享)6.运行时常量池2.对象是如...
    99+
    2022-11-13
  • 详解Java 中的嵌套类与内部类
    详解Java 中的嵌套类与内部类在Java中,可以在一个类内部定义另一个类,这种类称为嵌套类(nested class)。嵌套类有两种类型:静态嵌套类和非静态嵌套类。静态嵌套类较少使用,非静态嵌套类使用较多,也就是常说的内部类。其中内部类又...
    99+
    2023-05-31
    java 嵌套类 内部类
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作