java核心技术之内部类
来源:互联网 发布:pkg install java 编辑:程序博客网 时间:2024/04/29 08:14
内部类的概念:
把类B定义在类A中,类B就被称为内部类。
内部类的分类:
A.成员内部类(定义在类的成员中,方法外)
B.局部内部类(定义在类的方法中)
内部类定义在类中的局部位置上时,只能访问该局部被final修饰的局部变量。成员内部类没有权限访问局部变量。
为什么局部内部类只能访问被final修饰的局部变量?
是变量的作用域的问题,因为虽然匿名内部类在方法的内部,但实际编译的时候,内部类编译成Outer.Inner,这说明内部类所处的位置和外部类中的方法处在同一个等级上,内部类里面使用外部类的局部变量时,其实就是内部类的对象在使用它,内部类对象生命周期中都可能调用它,而内部类试图访问外部方法中的局部变量时,外部方法的局部变量很可能已经不存在了,那么就得延续其生命,拷贝到内部类中,而拷贝会带来不一致性,从而需要使用final声明保证一致性,而使用final修饰符不仅会保持对象的引用不会改变,而且编译器还会持续维护这个对象在回调方法中的生命周期.所以这才是final变量和final参数的根本意义.,所以方法中的变量或参数只有为final,内部类才可以引用,当访问成员变量时即使不是final也没任何问题。
内部类常见的标识符:
A.private 为了数据的安全性。
B.static 方便调用
实际开发中最常用的:匿名内部类:
new 类名或者接口名() { //这个类名一般是抽象类名当然也可不是
重写类中接口的方法。
或者自己定义方法。(一般肯定不会自己定义方法)
};
理解:本质是继承了类或者实现了接口的子类匿名对象。
abstract class Fu{ public abstract void show();}class Outer{ public void method(){ //本质是继承了类或者实现了接口的子类匿名对象 new Fu(){ public void show(){ System. out.println("show" ); } }.show(); //这一个整体是一个对象,通过这个对象来调用方法 }}
调用:
Outer o = new Outer();o.method();
但这样也有一个弊端。比如当抽象类中有很多抽象方法都要要所有的都要写一遍。注意 new Fu(){….}的本质是继承了类或者实现了接口的子类匿名对象。
也可以 Fu f = new Fu(){….} 然后 f.show();
abstract class Fu{ public abstract void show();}class Outer{ public void method(){ //本质是继承了类或者实现了接口的子类匿名对象 Fu f = new Fu(){ public void show(){ System. out.println("show" ); } }; //不要忘了这里的 ; 号 f.show(); }}
匿名内部类的最最常用的方法:作为一个参数来传递而不需要生成类的实例。
//定义接口一个抽象方法show();interface Inter{public abstract void show();} //实现接口class InterImp implements Inter{public void show(){System.out.println("Dream!");}}//该类的一个参数为Inter iclass InterDemo{public void method(Inter i){ i.show();}}//主类省略 InterImp ii = new InterImp();InterDemo id = new InterDemo();id.method(new InterImp());id.method(ii);//这两种方法都没问题还有一种方法不需要实现继承即可id.method(new Inter(){ public void show(){ System. out.println("Dream" ); } });
- java核心技术之内部类
- Java基础之内部类
- Java之内部类
- java 之内部类
- JAVA之内部类
- Java反射之内部类
- java基础之内部类
- Java基础之内部类
- java基础之内部类
- java基础之内部类
- Java基础之内部类
- java笔记之内部类
- java之内部类
- java基础之内部类
- java基础知识之内部类
- java基础之内部类
- java面试之内部类
- Java之内部类
- 138Copy List with Random Pointer
- Markdown语言入门
- 最近一段时间经历的事情即做事方式的总结
- 图片切换器ImageSwitcher
- Python爬虫入门八之Beautiful Soup的用法
- java核心技术之内部类
- 基于Node.js+Express4+MongoDb制作的微博客网站程序
- c++11新特性 lambda
- ViewPager的某些性质
- uva 10716——Evil Straw Warts Live
- 如何在终端显示中文
- DialogFragment 去掉左右两边留白
- webpack安装和配置
- 欢迎使用CSDN-markdown编辑器