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的更多相关文章

随机推荐

  1. 巨蟒django之权限9:前端展示修改删除合并&&权限展示

    1.权限组件控制流程(硬核重点) 2.权限组件控制流程 3.角色管理 4.删除合并 5.权限展示

  2. Python3.6全栈开发实例[017]

    17.念数字:给出一个字典,在字典中标识出每个数字的发音,包括相关符号,然后由用户输入一个数字,让程序读出相对应的发音(不需要语音输出.单纯的打印即可). dics = { '-':'fu', ':' ...

  3. (1)sql server 同网段复制

    转自:https://blog.csdn.net/hliq5399/article/details/51678774(文末有复制系列文章链接) 一.背景 在复制的运用场景中,事务发布是使用最为广泛的, ...

  4. (4.4)dbcc checkdb 数据页修复

    转自:http://blog.51cto.com/lzf328/955852 三篇 一.创建错误数据库 以前看Pual写过很多数据恢复的文章,他很多的测试都是自己创建的Corrupt数据库,其实我们自 ...

  5. 免费 SSL 安全证书

    为了保证网上传输信息的安全而在自己的 Linode VPS 上部署 SSL 加密服务.商业 CA 较贵,所以使用了自己签发的 CA.网友神爱的留言提到了 StartSSL 的免费 CA,稍做了一些调查 ...

  6. Java设计模式之《单例模式》及应用场景(转发:http://www.cnblogs.com/V1haoge/p/6510196.html)

    所谓单例,指的就是单实例,有且仅有一个类实例,这个单例不应该由人来控制,而应该由代码来限制,强制单例. 单例有其独有的使用场景,一般是对于那些业务逻辑上限定不能多例只能单例的情况,例如:类似于计数器之 ...

  7. 剑指offer 面试17题

    面试17题: 题目:打印从1到最大的n位数 题:输入数字n,按顺序打印出从1到最大的n位十进制数,比如输入3,则打印出1.2.3一直到最大的3位数999. 解题思路:需要考虑大数问题,这是题目设置的陷 ...

  8. 剑指offer 面试41题

    面试41题: 题目:数据流中的中位数 题:如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值.如果从数据流中读出偶数个数值,那么中位数就是所有数值 ...

  9. Oracle处理Clob类型数据入库(String入库)

    从网上查找一堆参考,要么语焉不详,要么不可行.自己鼓捣了一堆可以正常入库了.请看最后: insert into CP_V_INFO" + "(ID, "+ "P ...

  10. __init__和__new__

    一.__init__方法是什么 __init__方法通常用在初始化一个类实例的时候, class Person(object): """Silly Person" ...