什么是内部类

内部类是指在一个外部类的内部再定义一个类。内部类作为外部类的一个成员,并且依附于外部类而存在的。内部类可为静态,可用protected和private修饰(而外部类只能使用public和缺省的包访问权限)。内部类主要有以下几类:成员内部类、局部内部类、静态内部类、匿名内部类

为什么要使用内部类

①内部类提供了更好的封装,除了该外围类,同一个包下的其他类都不能访问

②内部类并没有令人迷惑的“is-a”关系,他就是一个独立的实体

③内部类可以对同一个包中的其他类隐藏起来,一般的非内部类,是不允许有 private 与protected权限的,但内部类可以

④可以实现多继承

⑤当想要定义一个回调函数且不想编写大量代码时,使用匿名内部类比较便捷

内部类特性

①内部类仍然是一个独立的类,在编译之后内部类会被编译成独立的.class文件,但是前面冠以外部类的类名和$符号

②内部类声明成静态的,就不能随便的访问外部类的成员变量了,此时内部类只能访问外部类的静态成员变量

③外部类不能直接访问内部类的的成员,但可以通过内部类对象来访问

④内部类可以自由地访问外部类的成员变量,无论是否是private的

⑤因为当某个外围类的对象创建内部类的对象时,此内部类会捕获一个隐式引用

实现多重继承

class Eat {
public void eat() {
System.out.println("eat()");
}
} class Drink {
public void drink() {
System.out.println("drink()");
}
} public class MutiExtend {
private EatExtra eat = null;
private DrinkExtra drink = null; MutiExtend() {
eat = new EatExtra();
drink = new DrinkExtra();
} public void drink() {
drink.drink();
System.out.println("drinkExtra()");
} public void eat() {
eat.eat();
System.out.println("eatExtra()");
} private class EatExtra extends Eat { // inner class can not have static declaration
// static int age;
// allowed,因为在compile阶段就已经确定了
static final int name = 123;
@Override
public void eat() {
super.eat();
}
} private class DrinkExtra extends Drink {
@Override
public void drink() {
super.drink();
}
}
}

注意事项

①内部类不能定义静态成员变量和方法

②内部类访问外部类实例用: 外部类名.this.变量名

③创建内部类: outerClassInstane.new InnerClass()

局部内部类

①不能范围该方法的非final局部变量

②不可以定义静态变量

静态内部类

①要创建嵌套类的对象,并不需要其外围类的对象

一种比较好的用法

public class AuthModule {

//    private static int SUCCESS = 200;
// private static int FAIL = 400; // 比这种实现要好很多吧,但是只限于是该类的状态,这样可以有命名空间Status
private static class Status {
private static int SUCCESS = 200;
private static int FAIL = 400;
} public void doSomething() {
System.out.println(Status.SUCCESS);
System.out.println(Status.SUCCESS);
}
}

3)Java学习笔记:内部类的更多相关文章

  1. Java学习笔记-内部类

    内部类在Android中有着大量的运用 内部类 内部类提供了更好的封装:内部类可以直接访问外部类的私有数据:匿名内部类适合那些只需要使用一次的类.非静态内部类不能拥有静态成员.内部类比外部类可以多使用 ...

  2. Java学习笔记——内部类及其调用方法

    一.static内部类的static方法 public class Test0719_Inner_Test { public static void main(String[] args) { //s ...

  3. Java学习笔记之---内部类

    Java学习笔记之---内部类 (一)成员内部类 内部类在外部使用时,无法直接实例化,需要借助外部类信息才能实例化 内部类的访问修饰符可以任意,但是访问范围会受到影响 内部类可以直接访问外部类的成员, ...

  4. 0035 Java学习笔记-注解

    什么是注解 注解可以看作类的第6大要素(成员变量.构造器.方法.代码块.内部类) 注解有点像修饰符,可以修饰一些程序要素:类.接口.变量.方法.局部变量等等 注解要和对应的配套工具(APT:Annot ...

  5. 0028 Java学习笔记-面向对象-Lambda表达式

    匿名内部类与Lambda表达式示例 下面代码来源于:0027 Java学习笔记-面向对象-(非静态.静态.局部.匿名)内部类 package testpack; public class Test1{ ...

  6. 《Java学习笔记(第8版)》学习指导

    <Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...

  7. 0013 Java学习笔记-面向对象-static、静态变量、静态方法、静态块、单例类

    static可以修饰哪些成员 成员变量---可以修饰 构造方法---不可以 方法---可以修饰 初始化块---可以修饰 内部类(包括接口.枚举)---可以修饰 总的来说:静态成员不能访问非静态成员 静 ...

  8. Java学习笔记4

    Java学习笔记4 1. JDK.JRE和JVM分别是什么,区别是什么? 答: ①.JDK 是整个Java的核心,包括了Java运行环境.Java工具和Java基础类库. ②.JRE(Java Run ...

  9. 【Java学习笔记之二十六】深入理解Java匿名内部类

    在[Java学习笔记之二十五]初步认知Java内部类中对匿名内部类做了一个简单的介绍,但是内部类还存在很多其他细节问题,所以就衍生出这篇博客.在这篇博客中你可以了解到匿名内部类的使用.匿名内部类要注意 ...

  10. java学习笔记9--内部类总结

    java学习笔记系列: java学习笔记8--接口总结 java学习笔记7--抽象类与抽象方法 java学习笔记6--类的继承.Object类 java学习笔记5--类的方法 java学习笔记4--对 ...

随机推荐

  1. CentOS6下配置Django+Apache+mod_wsgi+Sqlite3过程

    0. 安装环境: CentOs版本:      VMWare中CentOs 6.4 Apache版本:      Httpd 2.2.15 http://httpd.apache.org/ Sqlit ...

  2. 从内存溢出看Java 环境中的内存结构(转)

    作为有个java程序员,我想大家对下面出现的这几个场景并不陌生,倍感亲切,深恶痛绝,抓心挠肝,一定会回过头来问为什么为什么为什么会这样,嘿嘿,让我们看一下我们日常在开发过程中接触内存溢出的异常: Ex ...

  3. 逆序一个8bit的2进制数

  4. [转]修改hosts文件不起作用

    http://wayne173.iteye.com/blog/1876565 今天遇到个很奇怪的问题,在hosts文件里添加了一些域名指向后,发现根本没起作用,后来还发现个细节,就是hosts文件左下 ...

  5. Windows API 之 ReadProcessMemory

    ReadProcessMemory: BOOL WINAPI ReadProcessMemory( _In_ HANDLE hProcess, _In_ LPCVOID lpBaseAddress, ...

  6. 编译filezilla

    编译zilla的时候,需要用到与mysql连接的地方(这里先忽略zila的编译) VC听过mysql connector c++, 下载了1.1.3版本,然后飞安装包,之后从官网上下载boost 把库 ...

  7. MFC乱七八糟笔记

    1.CBitmap------------------------------------------------------------------------------------- 1.类层次 ...

  8. HDU 3715 Go Deeper

    二分答案 + 2-SAT判断 #include<cstdio> #include<cstring> #include<cmath> #include<vect ...

  9. HDU 3201 Build a Fence

    水题 #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> us ...

  10. Qt5:无边框窗口拖动

    在窗口程序中,无边框窗口程序一般需要特殊处理才能拖动 Qt中,要实现无边框窗口的拖动,需要重新实现 mousePressEvent 和 mouseMoveEvent 俩虚函数 void Widget: ...