我们都知道java的类能够由public、default(缺省、不写)来修饰,分别表示的含义是同意公开訪问以及仅仅同意包内其他类訪问,而同一包内的类一般是为完毕同一个功能而协作。

     除此之外,我们还会遇到一些类,它们仅仅是其他某个类的实现或组成的一部分,它们不应该被独立的创建出来。当它们创建的时候须要跟"宿体"连在一块,这就是内部类。就好像人类的心脏。你没法单独的new一个出来,它仅仅能依赖于人体而存活(这本来就是它存在的目的),至少现代医学做不到离体存活。现代医学能做的仅仅是把一个心脏取出来,立刻换到另外一个人身上。


内部类

     内部类一般是宿主类实现的一部分或者是宿主对外提供的一种工具。

假设内部类仅仅是为宿主的实现服务,能够将内部类修饰为private,这样也就限制了外部类的訪问。而作为工具的内部类。一般訪问修饰符为public或default。

     为了使用方便。java同意在内部类中直接訪问宿主类的成员(这也就决定你没法在宿主类外单独直接new一个内部类对象)。
     以下是一个简易的用内部类实现容器迭代器的样例。

interface Selector {
boolean end();
Object current();
void next();
} public class Sequence {
private Object[] items;
private int next = 0;
public Sequence(int size) {
items = new Object[size];
}
public void add(Object x) {
if(next < items.length) {
items[next++] = x;
}
}
private class SequenceSelector implements Selector {
private int i = 0;
@Override
public boolean end() { return i == items.length; }
@Override
public Object current() {
return items[i];
}
@Override
public void next() {
if( i < items.length ) i++;
}
}
public Selector selector() {
return new SequenceSelector();
}
public static void main(String[] args) {
Sequence sequence = new Sequence(10);
for(int i = 0; i < 10;i++) {
sequence.add(Integer.toString(i));
}
Selector selector = sequence.selector();
while( !selector.end() ) {
System.out.println(selector.current());
selector.next();
}
}
}
.this和.new
     因为内部类能够直接訪问宿主类的成员,所以它自身就拥有对宿主类的引用。假设你须要生成对外部类对象的引用。能够使用外部类的名字后面紧跟圆点和this。
public class DotThis {
void f() {System.out.println("DotThis.f()");}
public class Inner{
public DotThis outer() {
return DotThis.this;
}
}
public Inner inner() {return new Inner(); };
public static void main(String[] args) {
DotThis dt = new DotThis();
DotThis.Inner dti = dt.inner();
dti.outer().f();
}
}
     有时你须要创建其某个内部类的对象,而非通过成员方法返回,在这样的情况下必须直接使用某个外部类的对象来创建该内部类的对象。使用.new语法。

public class DotNew {
public class Inner{};
public static void main(String[] args) {
DotNew dn = new DotNew();
DotNew.Inner dni = dn.new Inner();
}
}

匿名内部类

     匿名内部类与内部类最大差异在于,因为它是匿名的,你没法在任何位置,任意的去new这样一个对象。所以它经常使用于仅仅使用一次的类或者说仅仅在某个地方(方法、对象成员)能new的类,从这个角度来看它是类訪问最严格的控制:仅仅在某个位置能够创建类。而内部类至少能在宿主类中任意创建。

     匿名内部类支持直接訪问所在方法的局部引用,因为引用和基本类型出了方法就无法訪问到了,所以要求在匿名内部类中訪问的在方法中的外部对象必须是final的。可是。匿名内部类訪问的类成员对象不必是final的。
     由于匿名类中不可能有命名构造器(由于它根本没有名字),但通过初始化代码段,就行达到为匿名内部类创建一个构造器的效果。
abstract class Base{
public Base(int i) {
System.out.println("Base constructor, i = " + i);
}
public abstract void f();
} public class AnonymousConstructor {
private static int w = 7;
public static Base getBase(int i,final int j) {
return new Base(i) {
{ System.out.println("Inside instance initial"); }
private int pj = j;
private int pw = w;
public void f() {
System.out.println("In anonymous f()");
}
};
}
public static void main(String[] args) {
Base base = AnonymousConstructor.getBase(47, 39);
base.f();
}
}

嵌套类

     嵌套类也是定义在一个类中的类。只是它和宿主类除此之外并没有特别直接的关系。在使用形式上。一个内部类用static来改动就成为了一个嵌套类。在嵌套类中你不能直接訪问宿主类中的非静态成员。嵌套类在实际工作中,使用非常少,既然它跟一个普通类对宿主类的訪问权限相似又何必放在一个宿主类中定义呢?而通常嵌套类又同意外部类直接定义该嵌套类的对象。这和普通类也就更相似了。

java 内部类、匿名内部类、嵌套类的使用的更多相关文章

  1. java#内部类和嵌套类

    内容思路来自Java编程思想,个人读书做的笔记,仅个人复习之用,故他人参考请自行辨别内容是否有错误. 在类的类部可以定义类,叫做内部类.如果这个内部类被static修饰,此时内部的类叫做嵌套类. 内部 ...

  2. “全栈2019”Java第六十七章:内部类、嵌套类详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  3. Kotlin——最详细的抽象类(abstract)、内部类(嵌套类)详解

    如果您对Kotlin很有兴趣,或者很想学好这门语言,可以关注我的掘金,或者进入我的QQ群大家一起学习.进步. 欢迎各位大佬进群共同研究.探索QQ群号:497071402 进入正题 在前面几个章节中,详 ...

  4. Java中的嵌套类和内部类

    以前看<Java编程思想>的时候,看到过嵌套类跟内部类的区别,不过后来就把它们的概念给忘了吧.昨天在看<数据结构与算法分析(Java语言版)>的时候,又遇到了这个概念,当时就很 ...

  5. Java开发笔记(五十四)内部类和嵌套类

    通常情况下,一个Java代码文件只定义一个类,即使两个类是父类与子类的关系,也要把它们拆成两个代码文件分别定义.可是有些事物相互之间密切联系,又不同于父子类的继承关系,比如一棵树会开很多花朵,这些花儿 ...

  6. java内部类以及匿名类

    内部类 一个类内部定义的类称为内部类. 内部类允许把逻辑相关的类组织在一起,并控制内部代码的可视性. 内部类与外部类的结构层次如下. 顶层类:最外层的类 外部类:内部类所在的类 内部类:类内部定义的类 ...

  7. Java学习笔记-嵌套类

    嵌套类 嵌套类有两种类别:static and non-static,分别对应为静态嵌套类和内部类. class OuterClass { ... static class StaticNestedC ...

  8. Java进阶07 嵌套类

    到现在为止,我们都是在Java文件中直接定义类.这样的类出现在包(package)的级别上.Java允许类的嵌套定义. 这里将讲解如何在一个类中嵌套定义另一个类. 嵌套 内部类 Java允许我们在类的 ...

  9. java内部类和异常类的概念

    1.内部类的外嵌类的成员变量在内部类中任然有效,内部类中的方法也可以调用外嵌类中的 方法,内部类中不可以声明类的变量和方法,外嵌的类体可以用内部类声明对象,作为外嵌类的成员.内部类仅供他的外嵌类使用. ...

  10. EffectiveJava(22)JAVA四种嵌套类的特点及用法

    嵌套类: 1.静态成员类 静态成员类是外围类的一个静态成员,遵守同样的可访问性规则 用法:a.作为公有的辅助类 内部类: 2.非静态成员类 语法上只和静态成员类的唯一区别是少一个static修饰符 a ...

随机推荐

  1. 只安装自己需要的Office2016组件的方法

    转自:https://www.ithome.com/html/office/178814.htm http://www.orsoon.com/news/184524.html

  2. nio案例一:个简单的客户-服务的案例

    <Java NIO文档>非阻塞式服务器 原文连接 原文作者:Jakob Jenkov 译者:higher 即使你知道Java NIO 非阻塞的工作特性(如Selector,Channel, ...

  3. BestCoder Round #65 (ZYB's Biology)

    ZYB's Biology Accepts: 848 Submissions: 1199 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 13 ...

  4. 【BZOJ 2186】 2186: [Sdoi2008]沙拉公主的困惑 (欧拉筛,线性求逆元)

    2186: [Sdoi2008]沙拉公主的困惑 Description 大富翁国因为通货膨胀,以及假钞泛滥,政府决定推出一项新的政策:现有钞票编号范围为1到N的阶乘,但是,政府只发行编号与M!互质的钞 ...

  5. 【动态规划技巧题】POJ2229-Sumsets

    [题目大意] 把一个数n分成2的指数幂相加的形式,问有几种情况. [思路] 如果当前i为奇数,则必定有至少一个1,可以看作i-1的情形再加上一个1.即f[i]=f[i-1]. 如果当前i为偶数,假设没 ...

  6. RMI(Remote Method Invocation ) 概念恢复

    1.RMI是远程方法调用的简称,像其名称暗示的那样,它能够帮助我们查找并执行远程对象,通俗的说,远程调用就像一个class放在A机器上,然后在B机器中调用这个class的方法. 2.EMI术语 在研究 ...

  7. Word中向左缩进

    除了调节标线外(有时候不知道会不会改动其他),还可以shift+tab.

  8. CSS3技巧:fit-content水平居中

    当我们让一个模块水平居中首先想到的肯定是margin:0 auto;有木有?那么今天给大家介绍一个fit-content属性,不知道有没有同学用过,如果用过那么你可以略过这篇文章,没用过的同学就继续了 ...

  9. ArcGIS Engine10.2与VS2017的环境设置

    首先,在安装ArcGIS Engine 10.2之前,大家应该了解的事是:AE10.2推荐与VS2010或VS2012匹配使用,AE10.3推荐与VS2013匹配使用.除上述的推荐匹配版本之外的方法, ...

  10. 你可能从未听过的 Linux 发行版

    Hanthana Linux 官方主页:http://www.hanthana.org Hanthana Linux 基于 Fedora,主要面向 IT 教育,默认包含额外的编/解码器及多媒体播放器. ...