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. Maven国内高速镜像

    大家都知道国外Maven中央仓库下载jar 没谁了速度, 给大家分享个国内666的Maven镜像 阿里云Maven镜像  希望能帮到大家: 配置下setting.xml即可: <mirrors& ...

  2. checkmarx使用笔记、原理

    checkmarks是一款商业的代码静态分析工具,和pmd类似的地方是他分析的是java文件,而非class文件.checkmarks使用 .net开发,必须安装在windows上,它的规则也是类似. ...

  3. 我的Android进阶之旅------>百度地图学习:BDLocation.getLocType ( )值分析

    BDLocation类,封装了定位SDK的定位结果,在BDLocationListener的onReceive方法中获取.通过该类用户可以获取error code,位置的坐标,精度半径等信息.具体方法 ...

  4. C++ Primer笔记14_面向对象程序设计

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/scottly1/article/details/31371611 OOP概述 面向对象程序设计(ob ...

  5. 002-JVM运行时数据区【内存模型】

    一.概述 JVM定义了不同运行时数据区,他们是用来执行应用程序的.某些区域随着JVM启动及销毁,另外一些区域的数据是线程性独立的,随着线程创建和销毁. 1.1.jvm自身物理结构 1.2.java内存 ...

  6. 3.2 使用STC89C52控制MC20发送短信

    需要准备的硬件 MC20开发板 1个 https://item.taobao.com/item.htm?id=562661881042 GSM/GPRS天线 1根 https://item.taoba ...

  7. 剑指offer 面试15题

    面试15题: 题目:二进制中1的个数 题:输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 解题思路一: 最佳方法:把一个整数减去1,再和原整数做“与运算”,会把该整数最右边的1变成0 ...

  8. IMG图片下面出现空格、下边距的解决办法

    放图片的时候总有一个间隔,加上div看,是图片未充满div.最后父级元素加了一个 font-size:0,去掉了间隔. <div class="cut-img" style= ...

  9. echarts3.8.4实现模拟迁移

    动态接受城市的经纬度https://zhidao.baidu.com/question/1384875311724922940.html 调用百度api获得ip对应的城市https://www.cnb ...

  10. PHP/Yii2操作Cookie,常见问题以及注意事项

    设置Cookie PHP setcookie("name", "Larry",time()+3600 Yii2 $cookies = Yii::$app-> ...