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全栈开发django6: FBV&CBV&&单表查询的其他方法
练习CBV用法 截图中的action="/cbv/",应该是这样 上边红图,说明mysql有问题,需要重启一下 返回,输入的内容 @wrapper==>cbv=wrapper ...
- JS+PHP瀑布流效果(二)
<!-- 加载商品 --><script> //用户拖动滚动条,达到底部时ajax加载一次数据 var loading = $("#loading&quo ...
- python基础知识回顾[1]
1.声明变量 # 声明一个变量name用来存储一个字符串'apollo' name = 'apollo' # 声明一个变量age用来存储一个数字20 age = 20 # 在控制台打印变量name中存 ...
- 获取JDBC响应做接口关联
1:从sql表中将需要取的数据查出来 2:我们需要把这个id为4451的数据从sql里面取出来,传到下一个sql里面,执行删除 3:写一个接口的传参有些不同,变成了var_id_1.var_id是之前 ...
- Log图文详解(Log.v,Log.d,Log.i,Log.w,Log.e)
android.util.Log常用的方法有以下5个:Log.v() Log.d() Log.i() Log.w() 以及 Log.e() .根据首字母对应VERBOSE,DEBUG,INFO, WA ...
- 20170401 错了两天的-XML解析
你不找到的话,错误就在那里.你找到了错误才会成为财富! Strans XML 解析3要素:1.源xml 格式正常, eg. '<?xml version="1.0" enco ...
- shell方式切割tomcat日志
#!/bin/bash while true do cd /usr/local/tomcat/logs d=`date +%Y%m%d` d15=`date -d'15 day ago' +%Y%m% ...
- VIMTUTOR 1.7中文版
文章来源:http://waterxfire.blog.hexun.com/4106986_d.html =============================================== ...
- Python之异常处理(Day27)
一.错误和异常 part1: 1.语法错误(这种错误,根本过不了python解释器的语法检测,必须在程序执行前就改正) #语法错误示范一 if #语法错误示范二 def test: pass #语法错 ...
- MySQL 8.0的十大新特性
今天,让我们看一下MySQL8.0提升数据库管理员工作效率的十大改进. 从一大堆特性你们找出十点并不太容易,以下是这十大特性: 1.临时表的改进 2.持续的全局变量 3.取消默认MyISAM系统表 4 ...