我们都知道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. 【Bzoj3527】【Luogu3338】[Zjoi2014]力(FFT)

    题面 Bzoj Luogu 题解 先来颓柿子 $$ F_i=\sum_{j<i}\frac{q_iq_j}{(i-j)^2}-\sum_{j>i}\frac{q_iq_j}{(i-j)^2 ...

  2. Eclipse line number

  3. 【stl小记】list

    list相当于双向链表,所以快插快删比较方便(链式数据结构的性质),但是随机读取较慢 用一道luogu的水题做一做list,code如下 #include <cstdio> #includ ...

  4. 2017 icpc 西安网络赛

    F. Trig Function 样例输入 2 0 2 1 2 2 样例输出 998244352 0 2 找啊找啊找数列和论文.cosnx可以用切比雪夫多项式弄成(cosx)的多项式,然后去找到了相关 ...

  5. 【枚举】Petrozavodsk Summer Training Camp 2016 Day 6: Warsaw U Contest, XVI Open Cup Onsite, Sunday, August 28, 2016 Problem G. Equation

    f(n)定义为n的十进制表示下所有位的平方和. 问你方程K*f(n)=n在a<=n<=b中的解的个数. 发现f(n)最大不超过2000,可以直接枚举f(n),然后判断K*f(n)的位的平方 ...

  6. 【set】【Splay】【pb_ds】bzoj1208 [HNOI2004]宠物收养所

    每次来的如果是人,且宠物数不为零,就从宠物中选出一个与其差距最小的,累加答案:若为零,就把他放入另一个集合里. 如果是宠物,则同上. 各种平衡树都可过,我蛋疼地用了pb_ds. Code: #incl ...

  7. 【穷竭】POJ3187-Backward Digit Sums

    [思路] 利用杨辉三角形,每一个数字被加的次数等于它在杨辉三角形中对应的那个数字.注意这道题的意思是,最底层是N的全排序,而不是指1..10都可以.生成杨辉三角形的时候第一次我用了二重循环模拟生成,后 ...

  8. Problem E: 调用函数,整数逆序输出

    #include<stdio.h> int reverse(int number)//定义函数 { ;//result用于储存结果 ) { result=result*; i=number ...

  9. [Bug]IE11下,forms认证,出现无法保存cookie的问题

    目录 ie11 解决方案 ie11 在ie11下,访问服务器上的网站地址,莫名其妙的多出一串东西,这一串字符串是由于客户端禁用cookie造成sessionid无法写入cookie,所以就拼在url上 ...

  10. TSQLTableJSON解析JSON

    TSQLTableJSON解析JSON uses mormot rocedure TTestTableContent.SynopseTableVariant;var json: RawUTF8; pe ...