深入的理解嵌套类和内部类

Java 深入理解嵌套类和内部类 Java 深入理解嵌套类和内部类,让你对知识点有个全面深入的理解 立即下载

Java   内置了多线程,  
   
  想象一下:  
  我现在在一个方法里面定义了一个   内部类   它需要用到这个方法的局部变量,但是这个内部类是在另一个线程中启动调用的,那个线程和这个方法调用的线程不是同一个调用堆栈,当那个线程调用了这个内部类的方法,这个时候定义这个内部类的方法的那个局部变量的值是不是变得不可预测了?   这两个线程是独立执行的,为了消除这个很容易出现的错误,Java   语言要求这样以使代码简单、安全. 

  

一、什么是嵌套类及内部类?
  可以在一个类的内部定义另一个类,这种类称为嵌套类(nested classes),它有两种类型:
  静态嵌套类和非静态嵌套类。静态嵌套类使用很少,最重要的是非静态嵌套类,也即是被称作为
  内部类(inner)。嵌套类从JDK1.1开始引入。其中inner类又可分为三种:
  其一、在一个类(外部类)中直接定义的内部类;
  其二、在一个方法(外部类的方法)中定义的内部类;
  其三、匿名内部类。
  下面,我将说明这几种嵌套类的使用及注意事项。
  二、静态嵌套类
  如下所示代码为定义一个静态嵌套类,
  publicclass StaticTest {
  privatestatic String name = "javaJohn";
  private String id = "X001";
  staticclass Person{
  private String address = "swjtu,chenDu,China";
  public String mail = "josserchai@yahoo.com";//内部类公有成员
 
  publicvoid display(){
  //System.out.println(id);//不能直接访问外部类的非静态成员
 
  System.out.println(name);//只能直接访问外部类的静态成员
 
  System.out.println("Inner "+address);//访问本内部类成员。
 
  }
  }
  publicvoid printInfo(){
  Person person = new Person();
  person.display();
  //System.out.println(mail);//不可访问
  //System.out.println(address);//不可访问
 
  System.out.println(person.address);//可以访问内部类的私有成员
 
  System.out.println(person.mail);//可以访问内部类的公有成员
 
  }
  publicstaticvoid main(String[] args) {
  StaticTest staticTest = new StaticTest();
  staticTest.printInfo();
  }
  }
 
  在静态嵌套类内部,不能访问外部类的非静态成员,这是由Java语法中"静态方法不能直接访问非静态成员"所限定。
  若想访问外部类的变量,必须通过其它方法解决,由于这个原因,静态嵌套类使用很少。注意,外部类访问内部类的的成员有些特别,不能直接访问,但可以通过内部类来访问,这是因为静态嵌套内的所有成员和方法默认为静态的了。同时注意,内部静态类Person只在类StaticTest 范围内可见,若在其它类中引用或初始化,均是错误的。
  三、在外部类中定义内部类
  如下所示代码为在外部类中定义两个内部类及它们的调用关系:
  publicclass Outer{
  int outer_x = 100;
  class Inner{
  publicint y = 10;
  privateint z = 9;
  int m = 5;
  publicvoid display(){
  System.out.println("display outer_x:"+ outer_x);
  }
  privatevoid display2(){
  System.out.println("display outer_x:"+ outer_x);
  }
  }
  void test(){
  Inner inner = new Inner();
  inner.display();
  inner.display2();
  //System.out.println("Inner y:" + y);//不能访问内部内变量
 
  System.out.println("Inner y:" + inner.y);//可以访问
 
  System.out.println("Inner z:" + inner.z);//可以访问
 
  System.out.println("Inner m:" + inner.m);//可以访问
 
  InnerTwo innerTwo = new InnerTwo();
  innerTwo.show();
  }
  class InnerTwo{
  Inner innerx = new Inner();
  publicvoid show(){
  //System.out.println(y);//不可访问Innter的y成员
  //System.out.println(Inner.y);//不可直接访问Inner的任何成员和方法
 
  innerx.display();//可以访问
 
  innerx.display2();//可以访问
 
  System.out.println(innerx.y);//可以访问
 
  System.out.println(innerx.z);//可以访问
 
  System.out.println(innerx.m);//可以访问
 
  }
  }
  publicstaticvoid main(String args[]){
  Outer outer = new Outer();
  outer.test();
  }
  }
 
  以上代码需要说明有,对于内部类,通常在定义类的class关键字前不加public 或 private等限制符,若加了没有任何影响,同时好像这些限定符对内部类的变量和方法也没有影响(?)。另外,就是要注意,内部类Inner及InnterTwo只在类Outer的作用域内是可知的,如果类Outer外的任何代码尝试初始化类Inner或使用它,编译就不会通过。同时,内部类的变量成员只在内部内内部可见,若外部类或同层次的内部类需要访问,需采用示例程序中的方法,不可直接访问内部类的变量。
  四、在方法中定义内部类
  如下所示代码为在方法内部定义一个内部类:
  publicclass FunOuter {
  int out_x = 100;
  publicvoid test(){
  class Inner{
  String x = "x";
  void display(){
  System.out.println(out_x);
  }
  }
  Inner inner = new Inner();
  inner.display();
  }
  publicvoid showStr(String str){
  //public String str1 = "test Inner";//不可定义,只允许final修饰
  //static String str4 = "static Str";//不可定义,只允许final修饰
 
  String str2 = "test Inner";
  final String str3 = "final Str";
  class InnerTwo{
  publicvoid testPrint(){
  System.out.println(out_x);//可直接访问外部类的变量
  //System.out.println(str);//不可访问本方法内部的非final变量
  //System.out.println(str2);//不可访问本方法内部的非final变量
 
  System.out.println(str3);//只可访问本方法的final型变量成员
 
  }
  }
  InnerTwo innerTwo = new InnerTwo();
  innerTwo.testPrint();
  }
  publicvoid use(){
  //Inner innerObj = new Inner();//此时Inner己不可见了。
  //System.out.println(Inner.x);//此时Inner己不可见了。
 
  }
  publicstaticvoid main(String[] args) {
  FunOuter outer = new FunOuter();
  outer.test();
  }
  }
 
  从上面的例程我们可以看出定义在方法内部的内部类的可见性更小,它只在方法内部
  可见,在外部类(及外部类的其它方法中)中都不可见了。同时,它有一个特点,就是方法
  内的内部类连本方法的成员变量都不可访问,它只能访问本方法的final型成员。同时另一个
  需引起注意的是方法内部定义成员,只允许final修饰或不加修饰符,其它像static等均不可用。
  五、匿名内部类
  如下所示代码为定义一个匿名内部类:匿名内部类通常用在Java的事件处理上
  import java.applet.*;
  import java.awt.event.*;
  publicclass AnonymousInnerClassDemo extends Applet{
  publicvoid init(){
  addMouseListener(new MouseAdapter(){
  publicvoid mousePressed(MouseEvent me){
  showStatus("Mouse Pressed!");
  }
  })
  }
  publicvoid showStatus(String str){
  System.out.println(str);
  }
  }
 
  在上面的例子中,方法addMouseListener接受一个对象型的参数表达式,于是,在参数里,我们定义了一个匿名内部类这个类是一个MouseAdapter类型的类,同时在这个类中定义了一个继承的方法mousePressed,整个类做为一个参数。这个类没有名称,但是当执行这个表达式时它被自动实例化。同时因为,这个匿名内部类是定义在AnonymousInnerClassDemo 类内部的,所以它可以访问它的方法showStatus。这同前面的内部类是一致的。
  六、内部类使用的其它的问题
  通过以上,我们可以清楚地看出内部类的一些使用方法,同时,在许多时候,内部类是在如Java的事件处理、或做为值对象来使用的。同时,我们需注意最后一个问题,那就是,内部类同其它类一样被定义,同样它也可以继承外部其它包的类和实现外部其它地方的接口。同样它也可以继承同一层次的其它的内部类,甚至可以继承外部类本身。下面我们给出最后一个例子做为结束:
  publicclass Layer {
  //Layer类的成员变量
 
  private String testStr = "testStr";
  //Person类,基类
 
  class Person{
  String name;
  Email email;
  publicvoid setName(String nameStr){
  this.name = nameStr;
  }
  public String getName(){
  returnthis.name;
  }
  publicvoid setEmail(Email emailObj){
  this.email = emailObj;
  }
  public String getEmail(){
  returnthis.email.getMailStr();
  }
  //内部类的内部类,多层内部类
 
  class Email{
  String mailID;
  String mailNetAddress;
  Email(String mailId,String mailNetAddress){
  this.mailID = mailId;
  this.mailNetAddress = mailNetAddress;
  }
  String getMailStr(){
  returnthis.mailID +"@"+this.mailNetAddress;
  }
  }
  }
  //另一个内部类继承外部类本身
 
  class ChildLayer extends Layer{
  void print(){
  System.out.println(super.testStr);//访问父类的成员变量
 
  }
  }
  //另个内部类继承内部类Person
 
  class OfficePerson extends Person{
  void show(){
  System.out.println(name);
  System.out.println(getEmail());
  }
  }
  //外部类的测试方法
 
  publicvoid testFunction(){
  //测试第一个内部类
 
  ChildLayer childLayer = new ChildLayer();
  childLayer.print();
  //测试第二个内部类
 
  OfficePerson officePerson = new OfficePerson();
  officePerson.setName("abner chai");
  //注意此处,必须用对象.new 出来对象的子类对象
  //而不是Person.new Email(...)
  //也不是new Person.Email(...)
 
  officePerson.setEmail(officePerson.new Email("josserchai","yahoo.com"));
  officePerson.show();
  }
  publicstaticvoid main(String[] args) {
  Layer layer = new Layer();
  layer.testFunction();
  }
  }
 
1
 
SECS/GEM协议中的关键指令详解:从S1F1到S9F9的完整指南 本文详细解析了SECS/GEM协议中从S1F1到S9F9的关键指令,涵盖设备状态管理、控制诊断、报警处理等核心功能。通过实际案例和调试技巧,帮助开发者掌握半导体制造设备通信标准,解决SECS/GEM协议在实际工程应用中的通讯难题,提升生产线智能化水平。 阅读详情

相关推荐

三维重建笔记_光束平差法(Bundle Adjustment, BA)

目录 1 光束平差法(Bundle Adjustment, BA) 1.1 SFM (Structure‐from‐Motion) 定义 问题描述 1.2 重投影误差 (Reprojection Error) 目标函数 1.3 使用 Levenberg‐Marquardt Algorithm 进行优化 问题描述 简化目标函数 参考 Gauss‐Newton Method ...

惊鸿一博 2万+

详解Java嵌套类与内部类

一、什么是嵌套类         嵌套类是任意声明在另一个类或接口中的类,最外层的类不是嵌套类。通常可将嵌套类分为两种:静态嵌套类和内部类。如下: class OuterClass { ... class NestedClass { ... } } 嵌套类可以分为两种,静态的和非静态的,即静态嵌套类和非静态嵌套类。非静态嵌套类又叫做内部类(Inne...

Tyella的博客 2580

图形引擎实战:镭射效果制作分享

该方案的优势1.遵循物理的2.可以使用少量的参数去调控镭射的效果。计算相对简单,缺点仍是颜色不能够自定义,还有一种常见的方案是采样一张镭射贴图来模拟,好处是颜色可以自定义同时性能上还很高效没有复杂的公式计算。我查阅了网上普遍的方案,常见的做法是制作一个Ramp图生成工具,然后将生成好的ramp图赋给材质。这两个方案的好处是美术同学可以手动的去控制镭射的颜色。最后就是Shader中对Ramp图的采样的部分,Ramp图的UV坐标是使用fresnel作为Ramp的U轴坐标,0.5作为V轴坐标。

qq_41166022的博客 1353

Java基础第15讲:嵌套类和内部类

一、什么是嵌套类 嵌套类分为两种类型:静态嵌套类和非静态嵌套类。平常我们使用的最多的是非静态嵌套类,也就是被称为内部类,其中内部类又可以分为三种: 在一个类(外部类)中直接定义的内部类 在一个方法(外部类的方法)中定义的内部类 匿名内部类 二、在外部类中定义内部类 对于内部类,通常在定义类的class关键字前,不加public或private等修饰词。内部类的成员只在内部类可见,若外部类或同层次的内部类需要访问,需要创建类的对象,不可以直接访问内部类的变量 public class Test2

分享日常工作技术 617

某银行大数据分析平台之云原生架构

软考架构师论文

doudoudouy的博客 768

驾驶行为检测数据集准备与处理详解

本文详细介绍了构建"未系安全带/打电话"检测模型的数据集准备流程。首先分析公开数据集(如StateFarm、AICityChallenge)的优缺点,并提供格式转换脚本。重点推荐自行采集+半自动标注方案:1)视频关键帧提取;2)使用预训练模型生成伪标签;3)人工修正标注;4)数据增强(光照变化、运动模糊等)。文章还包含数据配置文件编写指南,并针对类别不平衡、小目标检测等常见问题提出解决方案,如过采样、切片训练和负样本挖掘。通过这套流程可构建高质量数据集,为模型训练奠定基础。

u010117029的博客 356

嵌套类和内部类

1、嵌套类和内部类的说明   可以在类的内部定义另外一个类,这种类就是所谓的嵌套类。嵌套类的作用域被限制在包含它的类之中。因此,如果类B是在类A中定义的,那么类B不能独立于类A存在。嵌套类可以访问包含它的类的成员,包括私有成员,但是包含类不能访问嵌套类的成员。嵌套类直接在包含类中作为成员进行声明。也可以在代码块中声明嵌套类。   嵌套类有两种类型:静态的和非静态的,静态的嵌套...

487

【研发日记】Matlab/Simulink自动生成代码(二)——五种选择结构实现方法

相比C文本类编程语言,Simulink图形化编程语言的优势是逻辑思路和数据流清晰了很多,劣势是程序执行的时序不明确,而且各个模块的配置使编程的灵活度下降了不少,在使用习惯上面总感觉有各种限制。本文就是拆解Simulink中最基础的几个编程模块,发扬它的优势,避开劣势。

Mr.Cssust的博客 3849

内部类与嵌套类

一、概述我们知道,Java是一种完全的面向对象的语言,作为对象的灵魂,类的种类是多种多样的。类大致可以分外部类和内部类两种,外部类就是我们通常使用的类,而内部类的使用要比外部类少得多,最常见的是GUI事件侦听器。内部类的应用虽然不多,但是如果能够有效地使用内部类,能达到事半功倍的效果。二、内部类和嵌套类要讨论内部类和嵌套类,首先要分清它们两者的区别与联系。首先,内部类(Inner Classes)和

yqferin 1700

FPGA经验谈系列文章——3、逻辑级数

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 Xilinx FPGA开发tips系列——前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。 提示:以下是本篇文章正文内容,下面案例可供参考 一、pandas是什么? 示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的

gzy0506的博客 1万+

Open3D (C++) 使用点云创建数字高程模型DEM

Open3D (C++) 使用点云创建数字高程模型DEM

点云侠的博客 1391

java的嵌套类(nested class)、内部类(inner class)的区别

java的嵌套类(nested class)、内部类(inner class)的区别

听海边涛声 991

小论文/大论文必备 | YOLO多模态目标检测、绘制曲线对比图 | 引入多种绘制曲线对比图,包括mAP0.5,mAP0.5:0.95,Loss损失变化的曲线对比

本文通过可视化方法分析YOLO多模态模型的训练过程,对比不同实验的检测精度和损失函数变化。主要内容包括:1)绘制mAP@0.5和mAP@0.5:0.95曲线评估检测精度;2)分析边界框回归损失(box_loss)、分类损失(cls_loss)和分布式损失(dfl_loss)的收敛趋势;3)提供完整的Python代码实现,支持多实验对比,可生成高清曲线图。该方法能直观展示模型训练效果,便于优化策略评估和参数调优。

Ai缝合怪、助力小伙伴高效发论文 260

深入理解嵌套类和内部类

一、什么是嵌套类及内部类?    可以在一个类的内部定义另一个类,这种类称为嵌套类(nested classes),它有两种类型: 静态嵌套类和非静态嵌套类。静态嵌套类使用很少,最重要的是非静态嵌套类,也即是被称作为 内部类(inner)。嵌套类从JDK1.1开始引入。其中inner类又可分为三种:    其一

wgogo的专栏 1002

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

转 深入理解嵌套类和内部类

  一、什么是嵌套类及内部类?    可以在一个类的内部定义另一个类,这种类称为嵌套类(nested classes),它有两种类型:静态嵌套类和非静态嵌套类。静态嵌套类使用很少,最重要的是非静态嵌套类,也即是被称作为内部类(inner)。嵌套类从JDK1.1开始引入。其中inner类又可分为三种:    其一、在一个类(外部类)中直接定义的内部类;    其二、在一个方法(外...

Corrinejtt 128

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

java嵌套类和内部类区别_深入理解java嵌套类和内部类

一、什么是嵌套类及内部类可以在一个类的内部定义另一个类,这种类称为嵌套类(nested classes),它有两种类型:静态嵌套类和非静态嵌套类。静态嵌套类使用很少,最重要的是非静态嵌套类,也即是被称作为内部类(inner)。嵌套类从JDK1.1开始引入。其中inner类又可分为三种:其一、在一个类(外部类)中直接定义的内部类;其二、在一个方法(外部类的方法)中定义的内部类;其三、匿名内部类。下面...

weixin_30707165的博客 1456

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

输入理解JAVA嵌套类和内部类

加冰(Java) 413

java 嵌套类 内部类,深入理解Java嵌套类和内部类

一、什么是嵌套类及内部类可以在一个类的内部定义另一个类,这种类称为嵌套类(nested classes),它有两种类型:静态嵌套类和非静态嵌套类。静态嵌套类使用很少,最重要的是非静态嵌套类,也即是被称作为内部类(inner)。嵌套类从JDK1.1开始引入。其中inner类又可分为三种:其一、在一个类(外部类)中直接定义的内部类;其二、在一个方法(外部类的方法)中定义的内部类;其三、匿名内部类。下面...

weixin_39824020的博客 195

理解嵌套类和内部类(转)

1.2 深入理解嵌套类和内部类 1.2.1 什么是嵌套类及内部类? 可以在一个类的内部定义另一个类,这种类称为嵌套类(nested classes),它有两种类型: 静态嵌套类和非静态嵌套类。静态嵌套类使用很少,最重要的是非静态嵌套类,也即是被称作为 内部类(inner)。嵌套类从JDK1.1开始引入。其中inner类又可分为三种: 其一、在一个类(外部类)中直接定义的内部类; ...

chenxiaobin216216的博客 180

java 嵌套类方法_深入理解Java嵌套类和内部类

一、什么是嵌套类及内部类可以在一个类的内部定义另一个类,这种类称为嵌套类(nested classes),它有两种类型:静态嵌套类和非静态嵌套类。静态嵌套类使用很少,最重要的是非静态嵌套类,也即是被称作为内部类(inner)。嵌套类从JDK1.1开始引入。其中inner类又可分为三种:其一、在一个类(外部类)中直接定义的内部类;其二、在一个方法(外部类的方法)中定义的内部类;其三、匿名内部类。下面...

weixin_39539733的博客 296

深入理解java嵌套类和内部类

一、什么是嵌套类及内部类  可以在一个类的内部定义另一个类,这种类称为嵌套类(nested classes),它有两种类型:静态嵌套类和非静态嵌套类。静态嵌套类使用很少,最重要的是非静态嵌套类,也即是被称作为内部类(inner)。嵌套类从JDK1.1开始引入。其中inner类又可分为三种:  其一、在一个类(外部类)中直接定义的内部类;  其二、在一个方法(外部类的方法)中定义的内部类;  其三、...

nicolezhangcheers的博客 1394

Java深入理解嵌套类和内部类

一、什么是嵌套类及内部类?   可以在一个类的内部定义另一个类,这种类称为嵌套类(nested classes),它有两种类型:   静态嵌套类和非静态嵌套类。静态嵌套类使用很少,最重要的是非静态嵌套类,也即是被称作为   内部类(inner)。嵌套类从JDK1.1开始引入。其中inner类又可分为三种:   其一、在一个类(外部类)中直接定义的内部类;   其二、在一个方法(外部类的方法)中定义

續寫經典 1537
上一篇: ORA-01461: can bind a LONG value only for insert into a LONG column
下一篇: META标签详解
daniel112
博客等级 码龄21年 24粉丝 6原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值