第7章 面向对象基础-下(内部类)

news/2024/9/22 17:23:44/

7.6 内部类(了解)

7.6.1 概述

1、什么是内部类?

将一个类A定义在另一个类B里面,里面的那个类A就称为内部类,B则称为外部类

2、为什么要声明内部类呢?

总的来说,遵循高内聚低耦合的面向对象开发总原则。便于代码维护和扩展。

具体来说,当一个事物的内部,还有一个部分需要一个完整的结构进行描述,而这个内部的完整的结构又只为外部事物提供服务,不在其他地方单独使用,那么整个内部的完整结构最好使用内部类。而且内部类因为在外部类的里面,因此可以直接访问外部类的私有成员。

3、内部类都有哪些形式?

根据内部类声明的位置(如同变量的分类),我们可以分为:

(1)成员内部类:

  • 静态成员内部类

  • 非静态成员内部类

(2)局部内部类

  • 有名字的局部内部类

  • 匿名的内部类

7.6.2 成员内部类

如果成员内部类中不使用外部类的非静态成员,那么通常将内部类声明为静态内部类,否则声明为非静态内部类。

语法格式:

【修饰符】 class 外部类{
    【其他修饰符】 【static】 class 内部类{
    }
}

1、静态内部类

有static修饰的成员内部类叫做静态内部类。它的特点:

  • 和其他类一样,它只是定义在外部类中的另一个完整的类结构

    • 可以继承自己的想要继承的父类,实现自己想要实现的父接口们,和外部类的父类和父接口无关

    • 可以在静态内部类中声明属性、方法、构造器等结构,包括静态成员

    • 可以使用abstract修饰,因此它也可以被其他类继承

    • 可以使用final修饰,表示不能被继承

    • 编译后有自己的独立的字节码文件,只不过在内部类名前面冠以外部类名和$符号。

  • 和外部类不同的是,它可以允许四种权限修饰符:public,protected,缺省,private

    • 外部类只允许public或缺省的

  • 可以在静态内部类中使用外部类的静态成员

    • 在静态内部类中不能使用外部类的非静态成员哦

    • 如果在内部类中有变量与外部类的静态成员变量同名,可以使用“外部类名."进行区别

  • 在外部类的外面不需要通过外部类的对象就可以创建静态内部类的对象(通常应该避免这样使用)

2、非静态成员内部类

没有static修饰的成员内部类叫做非静态内部类。非静态内部类的特点:

  • 和其他类一样,它只是定义在外部类中的另一个完整的类结构

    • 可以继承自己的想要继承的父类,实现自己想要实现的父接口们,和外部类的父类和父接口无关

    • 可以在非静态内部类中声明属性、方法、构造器等结构,但是不允许声明静态成员,但是可以继承父类的静态成员,而且可以声明静态常量

    • 可以使用abstract修饰,因此它也可以被其他类继承

    • 可以使用final修饰,表示不能被继承

    • 编译后有自己的独立的字节码文件,只不过在内部类名前面冠以外部类名和$符号。

  • 和外部类不同的是,它可以允许四种权限修饰符:public,protected,缺省,private

    • 外部类只允许public或缺省的

  • 还可以在非静态内部类中使用外部类的所有成员,哪怕是私有的

  • 在外部类的静态成员中不可以使用非静态内部类哦

    • 就如同静态方法中不能访问本类的非静态成员变量和非静态方法一样

  • 在外部类的外面必须通过外部类的对象才能创建非静态内部类的对象(通常应该避免这样使用)

    • 如果要在外部类的外面使用非静态内部类的对象,通常在外部类中提供一个方法来返回这个非静态内部类的对象比较合适

    • 因此在非静态内部类的方法中有两个this对象,一个是外部类的this对象,一个是内部类的this对象

java">public class TestMemberInnerClass {public static void main(String[] args) {Outer.outMethod();System.out.println("-----------------------");Outer out = new Outer();out.outFun();System.out.println("-----------------------------");Outer.Inner.inMethod();System.out.println("------------------------");Outer.Inner inner = new Outer.Inner();inner.inFun();System.out.println("-----------------------------");Outer outer = new Outer();
//        Outer.Nei nei = outer.new Nei();Outer.Nei nei = out.getNei();nei.inFun();}
}
class Outer{private static String a = "外部类的静态a";private static String b  = "外部类的静态b";private String c = "外部类对象的非静态c";private String d = "外部类对象的非静态d";static class Inner{private static String a ="静态内部类的静态a";private String c = "静态内部类对象的非静态c";public static void inMethod(){System.out.println("Inner.inMethod");System.out.println("Outer.a = " + Outer.a);System.out.println("Inner.a = " + a);System.out.println("b = " + b);
//            System.out.println("c = " + c);//不能访问外部类和自己的非静态成员
//            System.out.println("d = " + d);//不能访问外部类的非静态成员}public void inFun(){System.out.println("Inner.inFun");System.out.println("Outer.a = " + Outer.a);System.out.println("Inner.a = " + a);System.out.println("b = " + b);System.out.println("c = " + c);
//            System.out.println("d = " + d);//不能访问外部类的非静态成员}}class Nei{private String a = "非静态内部类对象的非静态a";private String c = "非静态内部类对象的非静态c";public void inFun(){System.out.println("Nei.inFun");System.out.println("Outer.a = " + Outer.a);System.out.println("a = " + a);System.out.println("b = " + b);System.out.println("Outer.c = " + Outer.this.c);System.out.println("c = " + c);System.out.println("d = " + d);}}public static void outMethod(){System.out.println("Outer.outMethod");System.out.println("a = " + a);System.out.println("Inner.a = " + Inner.a);System.out.println("b = " + b);
//        System.out.println("c = " + c);
//        System.out.println("d = " + d);Inner in = new Inner();System.out.println("in.c = " + in.c);}public void outFun(){System.out.println("Outer.outFun");System.out.println("a = " + a);System.out.println("Inner.a = " + Inner.a);System.out.println("b = " + b);System.out.println("c = " + c);System.out.println("d = " + d);Inner in = new Inner();System.out.println("in.c = " + in.c);}public Nei getNei(){return new Nei();}
}
静态内部类非静态内部类
类角色字节码文件外部类名$内部类名相同
修饰符public,缺省,abstract,final相同
父类或父接口可以相同
可以包含的成员所有成员不允许有静态成员
成员角色修饰符public、protected、缺省、private,final,static没有static
依赖于外部类依赖相同
依赖于外部类的对象不依赖依赖
使用在外部类中使用内部类没有限制在外部类的静态方法等中不能使用非静态内部类
在内部类中使用外部类静态内部类中不能使用外部类的非静态成员没有限制
在外部类的外面使用内部类的静态成员外部类名.静态内部类名.静态成员没有
在外部类的外面使用内部类的非静态成员见下面的框1见下面的框2
重名外部类名.重名的成员名外部类名.this.重名的成员

 外部类名.静态内部类名 变量 = 外部类名.静态内部类名();
变量.非静态成员();

 外部类名 变量1 = new 外部类();
外部类名.非静态内部类名 变量 = 变量1.new 非静态内部类名();
变量.非静态成员();

.....后续创作中 


http://www.ppmy.cn/news/1437697.html

相关文章

使用Azure AI Search和LlamaIndex构建高级RAG应用

RAG 是一种将公司信息合并到基于大型语言模型 (LLM) 的应用程序中的常用方法。借助 RAG,AI 应用程序可以近乎实时地访问最新信息,团队可以保持对其数据的控制。 在 RAG 中,您可以评估和修改各个阶段以改进结果&#x…

Node.js -- path模块

path.resolve(常用) // 导入fs const fs require(fs); // 写入文件 fs.writeFileSync(_dirname /index.html,love); console.log(_dirname /index.html);// D:\nodeJS\13-path\代码/index.html 我们之前使用的__dirname 路径 输出的结果前面是正斜杠/ ,后面部分是…

acwing算法提高之图论--欧拉回路和欧拉路径

目录 1 介绍2 训练 1 介绍 本专题用来记录欧拉回路和欧拉路径相关的题目。 相关结论: (1)对于无向图,所有边都是连通的。 (1.1)存在欧拉路径的充要条件:度数为奇数的结点只能是0个或者2个。 &…

【银角大王——Django课程——创建项目+部门表的基本操作】

Django框架员工管理系统——创建项目部门表管理 员工管理系统创建项目命令行的形式创建Django项目——创建app注册app——在sttings中的INSTALLED_APPS [ ]数组中注册 设计表结构(django)连接数据库——在settings里面改写DATABASESDjango命令执行生成数…

网贷大数据黑名单要多久才能变正常?

网贷大数据黑名单是指个人在网贷平台申请贷款时,因为信用记录较差而被列入黑名单,无法获得贷款或者贷款额度受到限制的情况。网贷大数据黑名单的具体时间因个人信用状况、所属平台政策以及银行审核标准不同而异,一般来说,需要一定…

TDesign:腾讯的企业级前端框架,对标elementUI和ant-design

elementUI和ant-design在前端开发者中有了很高知名度了,组件和资源十分丰富了。本文介绍腾讯的一款B端框架:TDesign TDesign 是腾讯公司内部推出的企业级设计体系,旨在为腾讯旗下的各种产品提供一致、高效、优质的设计支持。这个设计体系是由…

DataGrip 禁用自动同步

DataGrip 是 JetBrains 出品的一款数据库管理工具 问题描述:默认设定,每次更新数据库结构时都会自动更新 Schemas 。不幸的是,DataGrip 的 introspect schemas 功能有严重的性能问题,数据库有一百多个表格的情况下,同步…

AJAX——Promise-链式调用

1.Promise链式调用 概念:依靠then()方法会返回一个新生成的Promise对象特性,继续串联下一环任务,知道结束 细节:then()回调函数中的返回值,会影响新生成的Promise对象最终状态和结果 好处:通过链式调用&…