您的位置:首页 > 编程语言 > Java开发

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