内部类: 将一个类定义在另一个类的里面,对里面那个类就称为内部类.

class Outer
{
private int num = 3;
class Inner //它想访问Outer中的num, 如果在外面就需要创建一个对象,然后通过公开的接口访问,但是现在Outer内部, 就可以直接访问了.这样方便
{
void show()
{
System.out.println("show run..." + num);
}
}
//如果现在想访问Inner就需要这样
public void method()
{
Inner in = new Inner();
in.show();
}
//内部类由于在内部, 相当于定义在了成员的位置上, 所以可以用成员修饰符, 如:
//private class Test{}
static class Inner
{
static void function()
{
System.out.println("function run......"+num);
}
}
}

内部类访问特点:
1. 内部类可以直接访问外部类中的成员.
2. 外部类要访问内部类, 必须建立内部类的对象.

一般用于类的设计。

分析事物时, 发现该事物描述中还有事物,而且这个事物还在访问被描述事物的内容。
这时就把还有的事物定义成内部类来描述。

class InnerClassDemo
{
public static void main(String[] args)
{
Outer out = new Outer();
out.method();
//直接访问外部类中的内部类中的成员.
Outer.Inner in = new Oouter().new Inner();
in.show();
//如果内部类是静态, 那就相当于一个外部类了.
Outer.Inner in = new Outer.Inner();
in.show();
//如果内部类是静态的,成员是静态的.
Outer.Inner.function(); //如果内部类中定义了静态成员,该内部类也必须是静态的. }
}

细节

class Outer
{
int num = 3;
class Inner
{
int num = 4;
void show()
{
int num = 5;
System.out.println(num);//5
System.out.println(this.num);//4
System.out.println(Outer.this.num);//3
}
}
void method()
{
new Inner().show();
}
} class InnerClassDemo2
{
public static void main(String[] args)
{
new Outer().method();
}
}

为什么内部类能直接访问外部类中成员呢?
那是因为内部类持有了外部类的引用-----外部类名.this

内部类可以存放在局部位置上

class Outer
{
int num = 3;
Object method()
{
final int x = 9;
class Inner
{
void show()
{
System.out.println("show..."+num);
}
}
Object in = new Inner();
return in;//0x0045
}
}
class InnerClassDemo3
{
public static void main(String[] args)
{
Outer out = new Outer();
Object obj = out.method();//0x0045
}
}

内部类在局部位置上只能访问局部中被final修饰的局部变量。

匿名内部类, 就是内部类的简写格式.
必须有前提:
内部类必须继承或者实现一个外部类或者接口.

匿名内部类: 其实就是一个匿名子类对象.

格式: new 父类or接口(){子类内容}

abstract class Demo
{
abstract void show();
} class Outer
{
int num = 4;
class Inner extends Demo //这是正常情况
{
void show()
{
System.out.println("show...."+num);
}
}
public void method()
{
new Demo()//这个就叫匿名内部类
{
void show()
{
System.out.println("show...."+num);
}
}
}
}

匿名内部类的应用

interface Inter
{
void show1();
void show2();
} class Outer
{
public void method()
{
new Inter()
{
public void show1()
{}
public void show2()
{}
}.show1(); //调用了show1的方法, 相当于 new Inner().show1(); //或者用下面的方法
Inter in = new Inter()
{
public void show1()
{}
public void show2()
{}
}
in.show1();
in.show2();
}
}

通常的使用场景之一:
当函数参数是接口类型时,而且接口中的方法不超过三个.
可以用匿名内部类作为实际参数进行传递.

class InnerClassDemo5
{
public static void main(String[] args)
{
show(new InterImpl());
}
public static void show(Inter in)
{
in.show1();
in.show2();
}
}
class InterImpl implements Inter
{
}

对象的初始化过程

class Fu
{
int num = 9;
{
System.out.println("Fu");
} Fu()
{
super();
//显示初始化
//构造代码块初始化
show();
}
void show()
{
System.out.println("fu show..."+num); //被覆盖,运行子类
}
}
class Zi extends Fu
{
int num = 8;
{
System.out.println("Zi");
}
Zi()
{
super();
//显示初始化
//构造代码块初始化
show();
}
void show()
{
System.out.println("zi show..."+num);
}
} class Inner
{
public static void main(String[] args)
{
new Zi();
}
}
/*
Fu
zi show...0
Zi
zi show...8
*/

Java学习个人备忘录之内部类的更多相关文章

  1. java面向对象、构造方法 之内部类

    UML类图 UML  Unified Modeling Language (UML)又称统一建模语言或标准建模语言 在一个类中      属性表示这类事物的性质(描述它的数据)      方法表示这类 ...

  2. Java学习个人备忘录之线程间的通信

    线程间通讯多个线程在处理同一资源,但是任务却不同. class Resource { String name; String sex; } //输入 class Input implements Ru ...

  3. Java学习个人备忘录之多线程

    进程:正在进行中的程序(直译). 线程:就是进程中一个负责程序执行的控制单元(执行路径) 一个进程中可以有多个执行路径,称之为多线程. 一个进程中至少要有一个线程. 开启多个线程是为了同时运行多部分代 ...

  4. Java学习个人备忘录之异常

    概述 异常:是在运行时期发生的不正常情况. 在java中用类的形式对不正常情况进行了描述和封装对象. 描述不正常的情况的类,就称为异常类. 以前正常流程代码和问题处理代码相结合,现在将正常流程代码和问 ...

  5. Java学习个人备忘录之接口

    abstract class AbsDemo { abstract void show1(); abstract void show2(); } 当一个抽象类中的方法都是抽象的时候,这时可以将该抽象类 ...

  6. Java学习个人备忘录之继承

    继承的好处1. 提高了代码的复用性.2. 让类与类之间产生了关系,给第三个特征多态提供了前提. java中支持单继承,不直接支持多继承,但对C++中的多继承机制进行改良.java支持多层继承. C继承 ...

  7. Java学习个人备忘录之文档注释

    文档注释 单行注释用 // 多行注释有两种,第一种是 /* 内容 */,第二种是/** 内容 */. 这两种多行注释的区别是/** 内容 */这种注释可以生成一个该文件的注释文档,下面是演示代码. A ...

  8. Java学习个人备忘录之数组工具类

    下面主要讲解一个针对数组操作的工具类. a.java -- 工具类文件 //按理来说要先编译本文件, 然后再编译主函数 class ArrayTool { /* 获取整型数组的最大值 */ publi ...

  9. Java学习个人备忘录之关键字static

    被static标记的东西会放在内存中被共享的,对象用到时,就会来取的. class Person { String name; //成员变量,实例变量 static String country = ...

随机推荐

  1. JQuery制作网页—— 第七章 jQuery中的事件与动画

    1. jQuery中的事件: ●和WinForm一样,在网页中的交互也是需要事件来实现的,例如tab切换效果,可以通过鼠标单击事件来实现 ●jQuery事件是对JavaScript事件的封装,常用事件 ...

  2. PHP中$a && $b = $c 语法的用法

    $a && $b = $c 表示:如果$a为真,则执行$b = $c,否则不执行. 可以用if语句替代: if ($a) { $b = $c; } 实例: $a = true; $b ...

  3. mysql 导出行数据到txt文件,指定字符分割

    select id,name, concat('tel:',phone) from user order by time INTO outfile 'user.txt' FIELDS terminat ...

  4. Oracle之单表查询及常用函数

    1.语法: select 字段列表 from 表名 [where 查询条件] [group by 分组] [having 分组条件] [order by 排序] select * 代表查询所有的字段 ...

  5. SpaceVim 发布 v0.8.0

    This project exists thanks to all the people who have contributed. The last release v0.7.0 is target ...

  6. [Real World Haskell翻译]第27章 网络通信和系统日志 Sockets and Syslog

    第27章 网络通信和系统日志 Sockets and Syslog 基础网络 在本书的前面几章,我们讨论了运转在网络上的服务.其中的两个例子是客户端/服务器架构的数据库和Web服务.当需要制定一个新的 ...

  7. MySQL入门第一天——概述、数据表与约束操作

    一.概述 1.安装 初学MySQL,我们下载msi的安装版:http://dev.mysql.com/downloads/file.php?id=457403 安装的过程文字简述可以参考之前随笔:ht ...

  8. hugepages_settings.sh

    #!/bin/bash## hugepages_settings.sh## Linux bash script to compute values for the# recommended HugeP ...

  9. python删除文本中的所有空字符

    import re import os input_path = 'G:/test/aa.json' output_path ='G:/test/bb.json' with open(input_pa ...

  10. andriod学习一

    1.Android软件栈       2.Android模拟器        Android SDK 可以通过ADT+Eclipse或者命令行开发,调试,测试应用程序,设备可以使用模拟器或者真实设备, ...