Java 內部類分爲:成員內部類,靜態嵌套類,方法內部類,匿名內部類。
spa
(1)內部類仍然是一個獨立的類,在編譯以後會被編譯成獨立的.class文件,可是前面冠之外部類的類名和$符號。
code
(2)內部類不能用普通的方式訪問。內部類是外部類的一個成員,所以內部類能夠自由地訪問外部類的成員變量,不管是不是private。htm
(3)內部類聲明成靜態的,就不能隨便的訪問外部類的成員變量了,此時內部類只能訪問外部類的靜態成員變量。繼承
成員內部類:接口
class A{get
class B{}
編譯
}class
編譯上述代碼會產生兩個文件:A.class和B.classtest
方法內部類變量
把類放在方法裏
public class A{
public int f()
{
private class B{
int i=10;
}
return new B().i;
}
public static void main(String[] args)
{
A a= new A();
system.out.printfln(af());
}
}
匿名內部類--用於臨時建立實例,且該實例不但願類的使用者關注
匿名內部類就是沒有名字的內部類。什麼狀況下須要使用匿名內部類?若是知足下面的一些條件,使用匿名內部類是比較合適的:
·只用到類的一個實例 。
·類在定義後立刻用到。
·類很是小(SUN推薦是在4行代碼如下)
·給類命名並不會致使你的代碼更容易被理解。
在使用匿名內部類時,要記住如下幾個原則:
·匿名內部類不能有構造方法。
·匿名內部類不能定義任何靜態成員、靜態方法。
·匿名內部類不能是public,protected,private,static。
·只能建立匿名內部類的一個實例。
·一個匿名內部類必定是在new的後面,用其隱含實現一個接口或實現一個類。
·因匿名內部類爲局部內部類,因此局部內部類的全部限制都對其生效。
(1)繼承式的匿名內部類
abstract class person{
public abstract void eat();
}
public class test{
public static void main(String [] args)
{
person p =new person(){
public void eat(){
system.out.printfln("吃");
};
p.eat;
}
}
}
(2)接口式的匿名內部類
interface
Person {
public
void
eat();
}
public
class
Demo {
public
static
void
main(String[] args) {
Person p =
new
Person() {
public
void
eat() {
System.out.println(
"eat something"
);
}
};
p.eat();
}
}
(3)參數式的匿名內部類
class Bar{
void doStuff(Foo f){
f.foo();
}
}
interface Foo{
void foo();
}
class Test{
static void go(){
Bar b = new Bar();
b.doStuff(new Foo(){
public void foo(){
System.out.println("foofy");
}
});
}
}
靜態嵌套類