Thinking in java 之 内部类
2016-05-23 16:46
387 查看
1.引言:
最近看thinking in java 正好看到内部类得,看得过程中发现自己以前对内部类的理解是多么肤浅,在此与大家分享下。2.内容
在开始之前我先例举一个最常见的内部类的例子:代码如下:public class A { int i=1; public class B{ public void printf() { System.out.print(i); } } public static void main(String args[]) { } }
知识点1:
以前在学习java的时候,没认真思考过,为什么内部类 B,可以直接用类A里面的常量i? 那是因为内部类对象 里面有一个指向外部类的引用,因为这个引用的存在,因此可以访问外部的成员和方法。
知识点2:
在另外一个包里面有一个类c,c中需要new 一个 类B的对象,那应该怎么做呢?。具体代码如下:
import com.A.B; public class C { public static void main(String args[]) { A a=new A(); B b=a.new B(); } }
可以看到 要得到,A中的内部类B。必须要先得到类A的实例,然后根据.new的方式 获取到内部类B。前面说过 内部类里面有一个指向外部类的引用。因此必须要有外部类才能有内部类这一说。所以这里必须要先new一个实例 a,然后根据实例a 得到内部类B.
知识点3:
匿名内部类,实现代码如下:
public class Test3 { public bean getbean() { return new bean() { int i=2; public void seti() { i=6; } }; } public static void main(String args[]) { } }
注意:return后面 : “ bean” 是一个接口它的定义如下:
package com; public interface bean { }
匿名类顾名思义是没得类名的。我记得最初学习java时候因为不懂匿名类还多次请教过老师。匿名类就是实现了接口bean,或者其他抽象的类。大概样式和正常的类差不多 只不过没得名字。
常见的匿名类:
Thread a=new Thread(new Runnable() { public void run() { } });
以前写这段代码的时候,只知道这样搞,只知道要new thread对象,必须要实现里面的Runnable接口,看了这章之后,忽然发现 不知不觉我已经用到过匿名类。使用匿名内部类的时候,必须要实现某一个接口或者抽象类,因此有的时候 匿名内部类存在向上转型的情况。
例如下面的 代码:
public Runnable test() { return new Runnable() { public void run() { } }; }
方法返回值要求是接口Runnable,然而返回的是实现了接口的匿名类,然后向上转型生成一个Runnable对象。
匿名内部类在访问变量的时候要在参数前面 加上final,例如
public Runnable test(final String i) { return new Runnable() { public void run() { System.out.print(i); } }; }
知识点4:嵌套内部类
所谓的嵌套内部类,就是在一般的内部类前加一个 static修饰。嵌套类不需要与外部类关联;不能从嵌套类的对象中访问非静态的外围类对象。
看报错了。注意:嵌套类中不能访问非静态的外围变量。
关于内部类的知识点,就总结到这里,实际上书上讲的还有很多,而且长篇大论,人就看糊涂了,索性就没看了,在这里我就把我认为常用,简单,易理解的写上来了,具体还有什么问题,可以买一本看看,这本书你绝对值得拥有。
今天就写到这里了,希望能帮助到大家。
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树