我们都知道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. 并发系列3-大白话聊聊Java并发面试问题之谈谈你对AQS的理解?【石杉的架构笔记】

  2. Xamarin XAML语言教程模板视图TemplatedView(一)

    Xamarin XAML语言教程模板视图TemplatedView(一) 模板视图TemplatedView 与模板页面相对的是TemplatedView,它被称为模板视图,它的功能和模板页面类似,也 ...

  3. A/B Problem(大数)

    描述 做了A+B Problem,A/B Problem不是什么问题了吧! 输入 每组测试样例一行,首先一个号码A,中间一个或多个空格,然后一个符号( / 或者 % ),然后又是空格,后面又是一个号码 ...

  4. [BZOJ4859][BJOI2017]机动训练(DP)

    4859: [BeiJing2017]机动训练 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 105  Solved: 63[Submit][Stat ...

  5. POJ3480 John 博弈论 anti-nim anti-SG

    http://poj.org/problem?id=3480 anti-nim其实是anti-SG的一种,就像nim是sg的一种一样.(或者说sg是nim推广?) 看名字就是规则和nim相反,取到最后 ...

  6. 【DFS】【DP】岳麓山上打水

    [vijos1159]岳麓山上打水 描述 今天天气好晴朗,处处好风光,好风光!蝴蝶儿忙啊,蜜蜂也忙,信息组的同学们更加忙.最近,由于XX原因,大家不得不到岳麓山去提水.55555555~,好累啊. 信 ...

  7. BZOJ 3083 遥远的国度(树链剖分+线段树)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3083 [题目大意] 链修改,子树最小值查询和换根操作 [题解] 树链剖分练习题. [代 ...

  8. 【区间dp】【四边形不等式】CDOJ1653 最小生成树?

    四边形不等式优化的资料去网上找下吧!很多. 可以证明,这个题里面,合并的代价满足较小区间+较大区间<=交错区间. 可以自己画个图看看. #include<cstdio> #inclu ...

  9. http请求 url 传递参数(特殊字符)解决方法

    有些符号在URL中是不能直接传递的,如果要在URL中传递这些特殊符号,那么就要使用他们的编码了.下表中列出了一些URL特殊符号及编码       十六进制值 1. + URL 中+号表示空格 %2B ...

  10. codevs 1779 单词的划分

    1779 单词的划分 时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题目描述 Description Problem有一个很长的由小写字母组成字符串.为了便于对 ...