review07
java类可以有两种重要的成员:成员变量和方法,实际上java还允许有一种成员:内部类。内部类是在一个类中定义另一个类。内部类和外嵌类的关系如下:
(1)内部类的外嵌类的成员变量在内部类中仍然有效,内部类中的方法可以调用外嵌类中的方法。
(2)内部类的类体中不可以声明类变量和类方法。外嵌类的类体中可以用内部类声明对象,作为外嵌类的成员。
(3)内部类仅供它的外嵌类使用,其他类不可以用某个类的内部类声明对象。
java编译器生成的内部类的字节码文件的名字和通常的类不同,内部类对应的字节码文件的名字格式是“外嵌类名$内部类名”。复制字节码文件时,不要忘记内部类的字节码文件。
类是一种数据类型,那么static内部类就是外嵌类中的一种静态数据类型,程序就可以在其他类中使用static内部类来创建对象。
static内部类不能操作外嵌类的实例成员变量。
非内部类不能是static。
匿名类
假设没有显式地声明一个类的子类,而又想用子类创建一个对象,java允许我们直接使用一个类的类体创建一个子类对象,创建子类对象时,除了使用父类的构造方法外还有类体,此类体被认为是一个子类去掉类声明后的类体,称作匿名类。由于无名可用,所以不可能用匿名类声明对象,却可以直接使用匿名类创建一个对象。
匿名类的特点如下:
(1)匿名类可以继承父类的方法也可以重写父类的方法。
(2)使用匿名类时,必然是在某个类中直接用匿名类创建对象,因此匿名类一定是内部类。
(3)匿名类可以访问外嵌类中的成员变量和方法,匿名类的类体中不可以声明static成员变量和方法。
(4)由于匿名类时一个子类,但没有类名,所以在用匿名类创建对象时,要直接使用父类的构造方法。
OutputAlphabet.java
public interface OutputAlphabet {
public abstract void output();
}
OutputEnglish.java
public class OutputEnglish implements OutputAlphabet {
@Override
public void output() {
// TODO Auto-generated method stub
for(char c = 'a'; c <= 'z'; c++)
{
System.out.printf("%3c", c);
}
}
}
ShowBoard.java
public class ShowBoard {
void showMess(OutputAlphabet show)
{
show.output();
}
}
Test01.java
public class Test01 {
public static void main(String[] args) {
// TODO Auto-generated method stub
ShowBoard board = new ShowBoard();
board.showMess(new OutputEnglish());
board.showMess(new OutputAlphabet() {//底下的output()是自动生成的
@Override
public void output() {
// TODO Auto-generated method stub
for(char c = '1'; c <= '9'; c++)
{
System.out.printf("%3c", c);
}
}
});
}
}
运行结果如下所示:

和接口有关的匿名类
假设Computable是一个接口,那么java允许直接用接口名和一个类体创建一个匿名对象。此类被认为是实现了Computable接口的类去掉类声明后的类体,称作匿名类。
如果某个方法的参数是接口类型,那么可以使用接口吗和类体组合创建一个匿名对象传递给方法的参数,类体必须要重写接口中的全部方法。展示代码如下所示:
public class Test01 {
public static void main(String[] args) {
// TODO Auto-generated method stub
HelloMachine machine = new HelloMachine();
machine.turnOn(new SpeakHello(){
@Override
public void speak() {
// TODO Auto-generated method stub
System.out.println("hello,you are welcome");
}
});
}
}
interface SpeakHello{
void speak();
}
class HelloMachine{
public void turnOn(SpeakHello hello)
{
hello.speak();
}
}
运行结果如下:

review07的更多相关文章
随机推荐
- 巨蟒python全栈开发django8:基于对象和基于双下划线的多表查询
1.编辑删除&&多对多关系的其他方法 提交,数据,得到结果 查看运行 给编辑和删除,添加样式 我们点击删除,可以成功删除 打印sql语句的,在settings.py里边的配置 LOGG ...
- POJ 1789 Truck History【最小生成树简单应用】
链接: http://poj.org/problem?id=1789 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=22010#probl ...
- the core of Git is a simple key-value data store The objects directory stores all the content for your database
w https://git-scm.com/book/en/v1/Git-Internals-Plumbing-and-Porcelain Git is a content-addressable f ...
- FW 配置一个私有的Docker仓库
思维 66 3月1日 发布 建分支 0 分支 收藏 0 收藏 我们在本地开发时,如果内网能部署一台Docker服务器,无疑会极大的方便镜像的分享发布,有些私有镜像就是可以直接放到内网服务器上,省去了不 ...
- spring security原理
spring security通过一系列过滤器实现其功能,入口过滤器如下(web.xml): <filter> <filter-name>springSecurityFilte ...
- 江卓尔与比特币增发,谣言or先知-千氪
最近,很多圈内人都在讨论比特币是否应该增发,但等等,比特币真的会增发吗?到底是真有增发计划还是某些人别有用心地在散布谣言? 那么消息是从哪里出来的?北京时间 2 月 10 日晚,莱比特矿池创始人江卓尔 ...
- 高可用Redis服务架构分析与搭建(单redis实例)
原文地址:https://www.cnblogs.com/xuning/p/8464625.html 基于内存的Redis应该是目前各种web开发业务中最为常用的key-value数据库了,我们经常在 ...
- sorted 、 filter 、 map
sorted 排序函数 内置函数中提供了一个通用的排序方案 ,返回一个新的列表,不会改变原数据 语法: sorted(iterable, key, reverse) key: 排序方案, sort ...
- iOS 关于自动更新的分阶段发布(灰度发布)的相关简介
前言: AppStore 发布应用方式除了自动和手动,如今添加了分阶段发布(灰度发布).目的很明确,降低新版本骤然上升的bug率,不能挽回,只能发布新版本的风险.也也是针对禁止使用热修复,推出的相对 ...
- iOS 反射 学习 和 运用
iOS 反射 学习 和 运用 反射: 通过 类名来获得生成的相应的类的实例 的这种机制 叫 反射 常用的反射方式 把 NSDictionary 转成 自定义 model 自定义 model 转 ...