`

总结---内部类

    博客分类:
  • java
阅读更多

昨天上课毕老师讲到了匿名内部类,很多哥们都懵了,一点不奇怪,引用老师的话:“任何人第一次接触匿名内部类都是懵的,因为他没见过这种形式。”我以前刚开始学习java接触到内部类和匿名内部类的时候很惆怅,苦于没有老师,只能上网去查资料、翻书,很长时间才明白个大概。我这里就把我理解的内部类的情况总结了一下,可能不是很全面或者有什么错误的地方,希望大家能补充或指正。

     在Java中定义在其他类内部的类叫内部类或者嵌入类。内部类分为成员内部类,静态内部类,局部内部类,匿名内部类。大家可以把静态内部类当做静态属性来看,成员内部类当做成员属性来看,只不过它们同时具备类的特性,而且可以访问外部类的私有成员。

成员内部类:

特点:可以访问外部类所有成员,相比较外部类只有public和默认的修饰符不同,内部类作为一个成员,可以被任意修饰符修饰。

例:

//当我们在外部类,内部类,内部类的方法中定义了相同名称的变量时,如何知道你要访问的是哪个变量?(内部类中的注释部分)

//如何实例化内部类调用内部类的方法 1.(注释部分) 2. 在外部类的外面直接创建内部类的实例然后调用内部类方法,要注意格式(main方法中未注释部分)

class Outer {
         private int i = 1;
         class Inner {
                  private int i = 2;
                  public void show() {
                  int i = 3;
                  System.out.println(i);                  // 得到的是方法内的i
                  System.out.println(this.i);           // 使用this,得到的是内部类的i

                  System.out.println(Outer.this.i); //使用外部类名.this,得到的是外部类的i
                  }
           }
    /*public void innerMethod() {            //在外部类中创建内部类对象调用方法,并提供方法供外部调用
                  Inner in = new Inner();
                  in.show();
       }*/
}

public class Test {
         public static void main(String[] args) {
               /*Outer out = new Outer();    //创建外部类的实例
                  out.innerMethod();*/           

                  Outer out = new Outer();    //创建外部类的实例
                  Outer.Inner in = out.new Inner();  //创建内部类实例
                  in.show();                                  //调用内部类方法
          }
}
 

静态内部类:

特点:在定义成员内部类的时候可以在类前面加static将类定义成静态的,静态内部类只能访问外部类的静态成员,只有在静态内部类中才能定义静态的变量和方法,静态内部类实例化的时候不必先实例化外围类,可以直接实例化内部类。拿上面例子来说: 静态内部类的对象可以直接生成:Outer.Inner in = new Outer.Inner();而不需要通过生成外部类对象来生成。

 

局部内部类(在方法和作用域内的类):

特点:只在局部有效,可以访问外部类的所有成员变量,但是只能访问内部类所在作用域用final修饰的变量。(为什么呢?final修饰的变量在内存中只有一份,生命周期较长,普通的局部变量在代码块执行完毕后就会被当成垃圾回收,而内部类的不会消失)静态方法中的局部内部类只能访问外围类的静态成员,访问不了非静态成员。当我们要解决一个复杂的问题,需要一个类来辅助我们的解决方案,但又不希望这个类是公共可用的时候就用到局部内部类。由于局部内部类只在局部有效,所以不能在外面用局部内部类的引用指向局部内部类的对象,只能用局部内部类实现接口并创建局部内部类对象,在外面用接口引用指向局部内部类对象。

例(From Thinking in java):

public class Test {
          public Destination dest(String s){
                  class PDestination implements Destination{
                         private String label;
                         private PDestination(String label){
                                   this.label = label;
                         }
                         public String readLabel(){
                         return label;
                         }
                  }
                   return new PDestination(s);
                 }
 public static void main(String[] args) {
                 Test t = new Test();
                 Destination d = t.dest("Tanzania");
   }
}
interface Destination{
                 String readLabel();
}

 

匿名内部类:

特点:是内部类的一种简化写法,使用匿名内部类的前提是内部类可以继承一个外部类或者实现一个接口,必须实现父类或者接口中的所有抽象方法。可以简单理解为:建立一个带内容的外部类或者接口的匿名对象,目的是是为了方便阅读。

例:

public class Outer {
         public static void main(String[] args) {
                  new Outer().method(new OneClass() {
                       public void show() {
                             System.out.println("哈哈");
                       }
                  });
          }

              public void method(OneClass o) {
                 o.show();
              }
         }

}

abstract class OneClass {
         abstract public void show();
}

另外需要注意的是:

成员内部类编译后生成的.class文件名称格式是<外部类类名>$<内部类类名>。

静态内部类编译后生成的.class文件名称格式是<外部类类名>$<静态内部类类名>。

局部内部类编译后生成的.class文件名称格式是<外部类类名>$<x><内部类类名>  x是该局部的第几个内部类
匿名内部类编译后生成的.class文件名称格式是<外部类类名>$<x>   x是该类的第几个匿名内部类。


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/liuxiaolei7676/archive/2010/03/31/5437041.aspx

分享到:
评论

相关推荐

    (179722824)三相异步电机矢量控制仿真模型

    三相异步电机矢量控制仿真模型。内容来源于网络分享,如有侵权请联系我删除。另外如果没有积分的同学需要下载,请私信我。

    一次并发导致错误分析与总结

    一次并发导致错误分析

    025 - 快手直播词和控场话术.docx

    025 - 快手直播词和控场话术

    第4章 管理信息库2024v2.pdf

    第4章 管理信息库2024v2

    (178729196)pytorch人脸表情识别数据集(2w8训练集+7k测试集)

    在本文中,我们将深入探讨如何使用PyTorch进行人脸表情识别。这个数据集包含28,000张训练图像和7,000张测试图像,专为Python开发人员设计,以研究和构建深度学习模型来理解人类的情绪。PyTorch是一个强大的深度学习框架,因其灵活性和易用性而被广泛采用,它提供了动态计算图的功能,便于构建和调试神经网络。 让我们了解人脸表情识别的基本概念。这是一个计算机视觉任务,旨在根据面部特征识别七种基本表情:高兴、悲伤、惊讶、恐惧、愤怒、厌恶和中立。这通常涉及到图像处理、特征提取和机器学习算法。 要开始使用这个数据集,你需要做以下步骤: 1. **数据预处理**:解压Datawhale_人脸情绪识别_数据集文件,然后对图像进行预处理。这可能包括调整大小、归一化像素值到0-1区间、以及数据增强,如随机翻转、裁剪或旋转,以增加模型的泛化能力。 2. **数据加载器**:使用PyTorch的`torch.utils.data.Dataset`和`DataLoader`类来创建自定义数据加载器。这将使你能批量加载数据,并在训练过程中高效地处理图像。 3. **模型构建**:选择一个适合任务的卷

    070 - 直播核心细节话术.docx

    070 - 直播核心细节话术

    基于springboot的微服务的旅行社门店系统的设计实现源码(java毕业设计完整源码+LW).zip

    功能说明:可以管理首页、个人中心、用户管理、旅行社管理、产品分类管理、门店公告管理、行政中心管理、订单信息管理、合同信息管理、社区留言、系统管理等功能模块。环境说明:开发语言:Java框架:springboot,mybatisJDK版本:JDK1.8数据库:mysql 5.7数据库工具:Navicat11开发软件:eclipse/ideaMaven包:Maven3.6

    基于springboot的校友社交系统源码(java毕业设计完整源码+LW).zip

    系统管理员主要包括首页、个人中心、用户管理、校友信息管理、校友会信息管理、加入校友会管理、活动类型管理、校友活动管理、报名申请管理、岗位管理、招聘信息管理、项目管理、校园捐赠管理、我的捐赠管理、校友相亲管理、论坛中心、系统管理。 环境说明: 开发语言:java JDK版本:jdk1.8 框架:springboot 数据库:mysql 5.7/8 数据库工具:navicat 开发软件:eclipse/idea

    АДЛИН - No Love(Instrumental).mp3

    АДЛИН - No Love(Instrumental).mp3

    基于java+springboot+mysql+微信小程序的社区超市管理系统 源码+数据库+论文(高分毕业设计).zip

    项目已获导师指导并通过的高分毕业设计项目,可作为课程设计和期末大作业,下载即用无需修改,项目完整确保可以运行。 包含:项目源码、数据库脚本、软件工具等,该项目可以作为毕设、课程设计使用,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。 项目都经过严格调试,确保可以运行!可以放心下载 技术组成 语言:java 开发环境:idea、微信开发者工具 数据库:MySql5.7以上 部署环境:maven 数据库工具:navicat

    (177078646)python决策树实现鸢尾花分类

    这个项目是基于 Python 编写的,使用决策树算法对鸢尾花数据集进行分类。决策树是一种常用的监督学习算法,适用于分类和回归问题。在这个项目中,我们主要关注鸢尾花分类任务。 项目介绍: 数据集: 项目使用经典的鸢尾花数据集(Iris dataset)。这个数据集包含了三个不同种类的鸢尾花(山鸢尾、变色鸢尾、维吉尼亚鸢尾)的样本数据,每个样本有四个特征(花瓣长度、花瓣宽度、花萼长度、花萼宽度)。 决策树算法: 决策树是一种树形结构,其中每个节点代表一个特征,每个分支代表一个特征取值,每个叶子节点代表一个类别。通过对数据集进行递归划分,决策树学习从输入特征到输出标签的映射。 数据预处理: 在项目中,首先对鸢尾花数据集进行加载和预处理,包括数据的划分成训练集和测试集。 模型训练: 使用训练集训练决策树模型,让模型从数据中学习特征和类别之间的关系。 模型评估: 使用测试集对训练好的决策树模型进行评估,衡量模型的分类性能。通常使用准确率、精确度、召回率等指标进行评估。 结果展示: 最后,项目展示了决策树模型对新样本进行分类的能力,通过可视化方式展示决策树的结构。 这个项目旨在演。内容来源于网络分

    096 - 主播活跃直播间的台词.docx

    096 - 主播活跃直播间的台词

    全球地表覆盖图 -所有类型(无偏移).zip

    地表覆盖分布是气候变化研究、生态环境评估及地理国情监测等不可或缺的重要基础信息。近年来,随着卫星遥感和计算机存储与计算能力的不断增强,全球尺度中高分辨率地表覆盖产品的应用需求日益迫切。   作为全球首套2020年全球30米精细地表覆盖产品,该数据集及时反映了2020年全球陆地区域(除南极洲)在30米空间分辨率下的地表覆盖分布状况,为地表相关应用提供了最新的数据支撑,对于全球变化、可持续发展分析以及地理国情监测等具有重要意义。   经过多年研究,该团队突破了全球30米地表覆盖多时相自动化精细分类关键技术,并于2019年9月发布了精细分类体系的2015年全球30米地表覆盖精细分类产品。该团队在此基础上做了大量优化工作,例如结合定量遥感反演模型对分类体系做了进一步深化(林地二级类从区域尺度拓展为全球尺度),利用多源辅助数据集和专家先验知识集改善了原来存在的少量错分和漏分问题,针对原来存在的少许空间过渡不连续问题进行了针对性处理与优化。

    基于springboot的旧物置换网站源码(java毕业设计完整源码+LW).zip

    项目均经过测试,可正常运行! 环境说明: 开发语言:java JDK版本:jdk1.8 框架:springboot 数据库:mysql 5.7/8 数据库工具:navicat 开发软件:eclipse/idea

    (2368806)CCNA中文版PPT

    **CCNA(思科认证网络助理工程师)是网络技术领域中的一个基础认证,它涵盖了网络基础知识、IP编址、路由与交换技术等多个方面。以下是对CCNA中文版PPT中可能涉及的知识点的详细说明:** ### 第1章 高级IP编址 #### 1.1 IPv4地址结构 - IPv4地址由32位二进制组成,通常分为四段,每段8位,用点分十进制表示。 - 子网掩码用于定义网络部分和主机部分,如255.255.255.0。 - IP地址的分类:A类、B类、C类、D类(多播)和E类(保留)。 #### 1.2 子网划分 - 子网划分用于优化IP地址的分配,通过借用主机位创建更多的子网。 - 子网计算涉及掩码位数选择,以及如何确定可用的主机数和子网数。 - CIDR(无类别域间路由)表示法用于更有效地管理IP地址空间。 #### 1.3 私有IP地址 - 为了节省公网IP地址,私有IP地址被用于内部网络,如10.0.0.0/8,172.16.0.0/12,192.168.0.0/16。 #### 1.4 广播地址 - 每个网络都有一个特定的广播地址,所有数据包都会发送到这个地址以达到同一网络内的所有设备。

    汽车安全技术之ESC系统介绍及其电路配置

    内容概要:本文介绍了 ESC(Electronic Stability Control)电子稳定控制系统,这是一种用于提高汽车操控稳定性的技术,主要包括 ABS(防抱死刹车系统)、TCS(牵引力控制系统)和偏航控制。ESC 通过监测车辆动态,自动调整四个车轮的刹车,防止车轮打滑和车辆侧滑。文章还详细解释了 ESC 的电路配置,包括收发器、MCU、DC/DC 转换器、马达驱动电路和阀门驱动电路等关键组件的工作原理和所需电子零部件的特点。 适合人群:汽车行业从业者、汽车电子工程师及相关领域的研究者。 使用场景及目标:帮助读者了解 ESC 系统的基本原理和技术细节,适用于汽车安全技术研发、故障排除及系统维护等工作。 其他说明:文中还提到了未来 ESC 系统的发展趋势,包括提高刹车控制精度、小型化和冗余化、低损耗与耐热性,以及智能化和网联化等方面的内容。

    三轴转台sw2016可编辑全套技术资料100%好用.zip

    三轴转台sw2016可编辑全套技术资料100%好用.zip

    conda文件下载1111

    conda文件下载1111

    二叉树深度计算的Python与多语言实现及应用场景

    内容概要:本文详细介绍了二叉树的深度概念及其两种常见的计算方法——递归方法和层序遍历方法。提供了Python、Java和C++的代码实现,并对不同方法的优缺点进行了对比分析,解释了它们适用于不同类型二叉树的情况。 适合人群:具有一定数据结构基础的学习者,特别是对二叉树有初步了解但需要深入掌握二叉树深度计算的读者。 使用场景及目标:通过理论结合代码实例的方式,帮助学习者深刻理解二叉树的性质,掌握二叉树深度的不同计算方式,能够在实际项目中灵活选用最适合的方法进行高效计算。 阅读建议:建议读者先熟悉二叉树的基本概念,再逐步深入学习递归和层序遍历的方法。在实践中运行并调试给出的代码例子,有助于更好地吸收文章内容。

    009 - 成功暖场留人话术.docx

    009 - 成功暖场留人话术

Global site tag (gtag.js) - Google Analytics