java的内部类与匿名内部类

author author     2023-05-10     726

关键词:

参考技术A

  public interface Contents

  int value();

  

  public interface Destination

  String readLabel();

  

  public class Goods

  private class Content implements Contents

  private int i = ;

  public int value()

  return i;

  

  

  protected class GDestination implements Destination

  private String label;

  private GDestination(String whereTo)

  label = whereTo;

  

  public String readLabel()

  return label;

  

  

  public Destination dest(String s)

  return new GDestination(s);

  

  public Contents cont()

  return new Content();

  

  

  class TestGoods

  public static void main(String[] args)

  Goods p = new Goods();

  Contents c = nt();

  Destination d = p dest( Beijing );

  

  

  在这个例子里类Content和GDestination被定义在了类Goods内部 并且分别有着protected和private修饰符来控制访问级别 Content代表着Goods的内容 而GDestination代表着Goods的目的地 它们分别实现了两个接口Content和Destination 在后面的main方法里 直接用 Contents c和Destination d进行操作 你甚至连这两个内部类的名字都没有看见!这样 内部类的第一个好处就体现出来了——隐藏你不想让别人知道的操作 也即封装性

  同时 我们也发现了在外部类作用范围之外得到内部类对象的第一个方法 那就是利用其外部类的方法创建并返回 上例中的cont()和dest()方法就是这么做的 那么还有没有别的方法呢?当然有 其语法格式如下

  outerObject=new outerClass(Constructor Parameters);

  outerClass innerClass innerObject=outerObject new InnerClass(Constructor Parameters);

  注意在创建非静态内部类对象时 一定要先创建起相应的外部类对象 至于原因 也就引出了我们下一个话题——

  非静态内部类对象有着指向其外部类对象的引用

  对刚才的例子稍作修改

  public class Goods

  private valueRate= ;

  private class Content implements Contents

  private int i = *valueRate;

  public int value()

  return i;

  

  

  protected class GDestination implements Destination

  private String label;

  private GDestination(String whereTo)

  label = whereTo;

  

  public String readLabel()

  return label;

  

  

  public Destination dest(String s)

  return new GDestination(s);

  

  public Contents cont()

  return new Content();

  

  

  修改的部分用蓝色显示了 在这里我们给Goods类增加了一个private成员变量valueRate 意义是货物的价值系数 在内部类Content的方法value()计算价值时把它乘上 我们发现 value()可以访问valueRate 这也是内部类的第二个好处——一个内部类对象可以访问创建它的外部类对象的内容 甚至包括私有变量!这是一个非常有用的特性 为我们在设计时提供了更多的思路和捷径 要想实现这个功能 内部类对象就必须有指向外部类对象的引用 Java编译器在创建内部类对象时 隐式的把其外部类对象的引用也传了进去并一直保存著 这样就使得内部类对象始终可以访问其外部类对象 同时这也是为什么在外部类作用范围之外向要创建内部类对象必须先创建其外部类对象的原因

  有人会问 如果内部类里的一个成员变量与外部类的一个成员变量同名 也即外部类的同名成员变量被屏蔽了 怎么办?没事 Java里用如下格式表达外部类的引用

  outerClass this

  有了它 我们就不怕这种屏蔽的情况了

  静态内部类

  和普通的类一样 内部类也可以有静态的 不过和非静态内部类相比 区别就在于静态内部类没有了指向外部的引用 这实际上和C++中的嵌套类很相像了 Java内部类与C++嵌套类最大的不同就在于是否有指向外部的引用这一点上 当然从设计的角度以及以它一些细节来讲还有区别

  除此之外 在任何非静态内部类中 都不能有静态数据 静态方法或者又一个静态内部类(内部类的嵌套可以不止一层) 不过静态内部类中却可以拥有这一切 这也算是两者的第二个区别吧

  局部内部类

  是的 Java内部类也可以是局部的 它可以定义在一个方法甚至一个代码块之内

  public class Goods

  public Destination dest(String s)

  class GDestination implements Destination

  private String label;

  private GDestination(String whereTo)

  label = whereTo;

  

  public String readLabel() return label;

  

  return new GDestination(s);

  

  public static void main(String[] args)

  Goods g= new Goods ();

  Destination d = g dest( Beijing );

  

  

  上面就是这样一个例子 在方法dest中我们定义了一个内部类 最后由这个方法返回这个内部类的对象 如果我们在用一个内部类的时候仅需要创建它的一个对象并创给外部 就可以这样做 当然 定义在方法中的内部类可以使设计多样化 用途绝不仅仅在这一点

  下面有一个更怪的例子

  public class Goods

  private void internalTracking(boolean b)

  if(b)

  class TrackingSlip

  private String id;

  TrackingSlip(String s)

  id = s;

  

  String getSlip() return id;

  

  TrackingSlip ts = new TrackingSlip( slip );

  String s = ts getSlip();

  

  

  public void track() internalTracking(true);

  public static void main(String[] args)

  Goods g= new Goods ();

  g track();

  

  

  你不能在if之外创建这个内部类的对象 因为这已经超出了它的作用域 不过在编译的时候 内部类TrackingSlip和其他类一样同时被编译 只不过它由它自己的作用域 超出了这个范围就无效 除此之外它和其他内部类并没有区别

  匿名内部类

  java的匿名内部类的语法规则看上去有些古怪 不过如同匿名数组一样 当你只需要创建一个类的对象而且用不上它的名字时 使用内部类可以使代码看上去简洁清楚 它的语法规则是这样的

  // 有点js中 return function() ;的意思

  new interfacename() ; 或 new superclassname() ;

  // 接口的名字或者父类的名字

  下面接着前面继续举例子

  public class Goods

  public Contents cont()

  return new Contents()

  private int i = ;

  public int value()

  return i;

  

  ;

  

  

  这里方法cont()使用匿名内部类直接返回了一个实现了接口Contents的类的对象 看上去的确十分简洁

  在java的事件处理的匿名适配器中 匿名内部类被大量的使用 例如在想关闭窗口时加上这样一句代码

  frame addWindowListener(new WindowAdapter()

  public void windowClosing(WindowEvent e)

  System exit( );

  

  );

  有一点需要注意的是 匿名内部类由于没有名字 所以它没有构造函数(但是如果这个匿名内部类继承了一个只含有带参数构造函数的父类 创建它的时候必须带上这些参数 并在实现的过程中使用super关键字调用相应的内容) 如果你想要初始化它的成员变量 有下面几种方法

  如果是在一个方法的匿名内部类 可以利用这个方法传进你想要的参数 不过记住 这些参数必须被声明为final

  将匿名内部类改造成有名字的局部内部类 这样它就可以拥有构造函数了

  在这个匿名内部类中使用初始化代码块

  为什么需要内部类?

  java内部类有什么好处?为什么需要内部类?

  首先举一个简单的例子 如果你想实现一个接口 但是这个接口中的一个方法和你构想的这个类中的一个方法的名称 参数相同 你应该怎么办?这时候 你可以建一个内部类实现这个接口 由于内部类对外部类的所有内容都是可访问的 所以这样做可以完成所有你直接实现这个接口的功能

  不过你可能要质疑 更改一下方法的不就行了吗?

  的确 以此作为设计内部类的理由 实在没有说服力

lishixinzhi/Article/program/Java/hx/201311/26601

内部类与匿名内部类

内部类:*什么是内部类:就是在一个类的里面,在定义一个类*一般用来描述事物之间的所属关系,比如:汽车事物里面需要描述发动机,可以使用内部类.* 比如:怀宝宝的动物**成员变量:定义在类的里面,方法的外面*局部变量:定义在... 查看详情

内部类与匿名内部类

内部类不是很好理解,但说白了其实也就是一个类中还包含着另外一个类如同一个人是由大脑、肢体、器官等身体结果组成,而内部类相当于其中的某个器官之一,例如心脏:它也有自己的属性和行为(血液、跳动)显然,此处... 查看详情

“全栈2019”java第一百零六章:匿名内部类与抽象类接口注意事项

...DEAv2018.3文章原文链接“全栈2019”Java第一百零六章:匿名内部类与抽象类接口注意事项下一章“全栈2019”Java第一百零七章:匿名内部类与构造方法注意事项学习小组加入同步学习小组,共同交流与进步。方式一:关注头条号Gorh... 查看详情

java匿名内部类

匿名内部类: 匿名内部类与正规的继承相比有些受限,因为匿名内部类既可以扩展类,也可以实现接口,但不能两者兼备,而且如果实现接口,也只能实现一个接口一.contents()方法将返回值的生成与表示这个返回值的类的定义结合在... 查看详情

“全栈2019”java第一百零七章:匿名内部类与构造方法注意事项

...DEAv2018.3文章原文链接“全栈2019”Java第一百零七章:匿名内部类与构造方法注意事项下一章“全栈2019”Java第一百零八章:匿名内部类与final关键字学习小组加入同步学习小组,共同交流与进步。方式一:关注头条号Gorhaf,私信... 查看详情

java内部类与匿名内部类作用分别是啥?

参考技术AJava内部类\\x0d\\x0a分四种:成员内部类、局部内部类、静态内部类和匿名内部类。\\x0d\\x0a1、成员内部类:即作为外部类的一个成员存在,与外部类的属性、方法并列。\\x0d\\x0a注意:成员内部类中不能定义静态变量,但... 查看详情

“全栈2019”java第一百零四章:匿名内部类与外部成员互访详解

...DEAv2018.3文章原文链接“全栈2019”Java第一百零四章:匿名内部类与外部成员互访详解下一章“全栈2019”Java第一百零五章:匿名内部类覆盖作用域成员详解学习小组加入同步学习小组,共同交流与进步。方式一:关注头条号Gorhaf... 查看详情

匿名内部类

匿名内部类:没有类名的类就称作为匿名内部类匿名内部类的好处:简化书写。匿名内部类的使用前提:必须存在继承或者实现关系才能使用。//继承:简单使用:abstractclassAnimal{publicabstractvoidrun();}//匿名内部类:匿名内部类只... 查看详情

函数式接口的匿名内部类与lambda表达式的实现(代码片段)

文章目录函数式接口一、函数式接口:二、Lambda表达式:三、常用函数式接口:实现代码:函数式接口一、函数式接口:函数式接口主要指只包含一个抽象方法的接口,如:java.lang.Runnable、java.util.Comparator接口等Java8提供@... 查看详情

java-内部类

1.内部类与外部类的区别内部类比外部类可以多使用三个修饰符:private、protected、static非静态内部类不能拥有静态成员2.内部类的分类成员内部类静态内部类非静态内部类局部内部类匿名内部类3.内部类的编译  编译产生:Outer... 查看详情

#2019-2020-4《java程序设计》第六周总结(代码片段)

2019-2020-4《Java程序设计》第六周知识总结第七章:内部类与异常类1.内部类(1)类可以有两种重要的成员:成员变量和方法,类还可以有一种成员:内部类。(2)java支持在一个类中声明另一个类,这样的类称为内部类,而包含内部... 查看详情

java内部类的匿名内部类

参考技术A顾名思义,没有名字的内部类。表面上看起来它们似乎有名字,实际那不是它们的名字。当程序中使用匿名内部类时,在定义匿名内部类的地方往往直接创建该类的一个对象。匿名内部类的声明格式如下:newParentName(... 查看详情

java学习笔记3.8.4内部类-匿名内部类

文章目录零、本讲学习目标一、内部类概述二、匿名内部类(一)匿名内部类定义(二)匿名内部类说明(三)访问局部变量注意事项(四)创建匿名内部类对象的语法格式(五)匿名内部类案例演示1、创建动物接口2、创建学... 查看详情

对java的匿名内部类理解

对Java的匿名内部类理解JAVA面向对象三大特性:封装、继承、多态。多态:可以理解为大千世界中的对象在不同的环境下可能会有多种形态。Java中多态存在的前提:必须存在继承、父类的引用指向子类的对象。匿名内部类:就是... 查看详情

java教程:什么是匿名内部类?怎样创建匿名内部类?

本期java教程要为大家分享的是关于java中的匿名内部类,相信很多同学在学java技术的时候有了解过,下面我们就来详细的看一下。java教程:什么是匿名内部类?怎样创建匿名内部类?匿名内部类是没有名称的内部类。在... 查看详情

java-匿名内部类

匿名内部类1.定义:  实现一个接口,或者继承一个父类,并返回new好的实例。2.语法:  new类名或者接口名类的实现体3.什么情况下使用匿名内部类:  类在创建后马上被使用,且只使用一次4.注意点:  ·匿名内部类... 查看详情

学号201753292018-2019-3《java程序设计》第六周学习总结(代码片段)

...019-3《Java程序设计》第六周学习总结教材学习内容第七章内部类与异常类内部类与外嵌类之间的重要关系如下:内部类的外嵌类的成员变量在内部类中仍然有效,内部类中的方法也可以调用外嵌类中的方法。内部类的类体中不可... 查看详情

java匿名内部类

内部类定义在局部时:  1.不可以被成员修饰符修饰  2.可以直接访问外部类中的成员,因为还持有外部类的引用,但是不可以访问他所在的局部中的变量。只能访问被final修饰的局部变量。匿名内部类:  1.其实就是内部... 查看详情