Java学习个人备忘录之内部类
内部类: 将一个类定义在另一个类的里面,对里面那个类就称为内部类.
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学习个人备忘录之内部类的更多相关文章
- java面向对象、构造方法 之内部类
UML类图 UML Unified Modeling Language (UML)又称统一建模语言或标准建模语言 在一个类中 属性表示这类事物的性质(描述它的数据) 方法表示这类 ...
- Java学习个人备忘录之线程间的通信
线程间通讯多个线程在处理同一资源,但是任务却不同. class Resource { String name; String sex; } //输入 class Input implements Ru ...
- Java学习个人备忘录之多线程
进程:正在进行中的程序(直译). 线程:就是进程中一个负责程序执行的控制单元(执行路径) 一个进程中可以有多个执行路径,称之为多线程. 一个进程中至少要有一个线程. 开启多个线程是为了同时运行多部分代 ...
- Java学习个人备忘录之异常
概述 异常:是在运行时期发生的不正常情况. 在java中用类的形式对不正常情况进行了描述和封装对象. 描述不正常的情况的类,就称为异常类. 以前正常流程代码和问题处理代码相结合,现在将正常流程代码和问 ...
- Java学习个人备忘录之接口
abstract class AbsDemo { abstract void show1(); abstract void show2(); } 当一个抽象类中的方法都是抽象的时候,这时可以将该抽象类 ...
- Java学习个人备忘录之继承
继承的好处1. 提高了代码的复用性.2. 让类与类之间产生了关系,给第三个特征多态提供了前提. java中支持单继承,不直接支持多继承,但对C++中的多继承机制进行改良.java支持多层继承. C继承 ...
- Java学习个人备忘录之文档注释
文档注释 单行注释用 // 多行注释有两种,第一种是 /* 内容 */,第二种是/** 内容 */. 这两种多行注释的区别是/** 内容 */这种注释可以生成一个该文件的注释文档,下面是演示代码. A ...
- Java学习个人备忘录之数组工具类
下面主要讲解一个针对数组操作的工具类. a.java -- 工具类文件 //按理来说要先编译本文件, 然后再编译主函数 class ArrayTool { /* 获取整型数组的最大值 */ publi ...
- Java学习个人备忘录之关键字static
被static标记的东西会放在内存中被共享的,对象用到时,就会来取的. class Person { String name; //成员变量,实例变量 static String country = ...
随机推荐
- JQuery制作网页—— 第七章 jQuery中的事件与动画
1. jQuery中的事件: ●和WinForm一样,在网页中的交互也是需要事件来实现的,例如tab切换效果,可以通过鼠标单击事件来实现 ●jQuery事件是对JavaScript事件的封装,常用事件 ...
- PHP中$a && $b = $c 语法的用法
$a && $b = $c 表示:如果$a为真,则执行$b = $c,否则不执行. 可以用if语句替代: if ($a) { $b = $c; } 实例: $a = true; $b ...
- mysql 导出行数据到txt文件,指定字符分割
select id,name, concat('tel:',phone) from user order by time INTO outfile 'user.txt' FIELDS terminat ...
- Oracle之单表查询及常用函数
1.语法: select 字段列表 from 表名 [where 查询条件] [group by 分组] [having 分组条件] [order by 排序] select * 代表查询所有的字段 ...
- SpaceVim 发布 v0.8.0
This project exists thanks to all the people who have contributed. The last release v0.7.0 is target ...
- [Real World Haskell翻译]第27章 网络通信和系统日志 Sockets and Syslog
第27章 网络通信和系统日志 Sockets and Syslog 基础网络 在本书的前面几章,我们讨论了运转在网络上的服务.其中的两个例子是客户端/服务器架构的数据库和Web服务.当需要制定一个新的 ...
- MySQL入门第一天——概述、数据表与约束操作
一.概述 1.安装 初学MySQL,我们下载msi的安装版:http://dev.mysql.com/downloads/file.php?id=457403 安装的过程文字简述可以参考之前随笔:ht ...
- hugepages_settings.sh
#!/bin/bash## hugepages_settings.sh## Linux bash script to compute values for the# recommended HugeP ...
- python删除文本中的所有空字符
import re import os input_path = 'G:/test/aa.json' output_path ='G:/test/bb.json' with open(input_pa ...
- andriod学习一
1.Android软件栈 2.Android模拟器 Android SDK 可以通过ADT+Eclipse或者命令行开发,调试,测试应用程序,设备可以使用模拟器或者真实设备, ...