内部类的定义:在一个类的内部定义的类称为内部类。并且内部类不能与外部类重名。/d5x
外部类的定义:把内部类所在的类称为外部类。V~>
内部类包括:成员内部类和局部内部类。s
成员内部类包括:实例内部类和静态内部类。y)
©海岸线网络安全技术论坛 -- 自由,开放,免费,共享 htJ+
1.实例内部类:z01)4_
1)在创建实例内部类的实例时,外部类的实例必须已经存在。/
2)实例内部类的实例自动持有外部类实例的引用。在内部类中,可以直接访问外部类的所有成员(成员方法和成员变量)。q_)S
在多重嵌套中,内部类可以访问所有外部类的成员。]$zz
代码:
--------------------------------------------------------------------------------
RW
class A{ wv."M
private void methodA() {}kp=Hx@
class B {.~~
private void methodB() {}&--
class C {s.A
private void method() {X*
methodA();^~b"
methodB();fI>
}^LN="
}zL4
}©海岸线网络安全技术论坛 -- 自由,开放,免费,共享 ~Kj+9K
}©海岸线网络安全技术论坛 -- 自由,开放,免费,共享 "x
8yT)S_
3)外部类实例与内部类实例之间是一对多的关系。在外部类中不能直接访问内部类的成员,必须通过内部类的实例去访问。通过实例的访问,即使是处于private外部类也能够访问。?o{
4)在实例内部类中不能定义静态成员,只能定义实例成员。)sl;I
5)如果实例内部类B和外部类A包含同名的成员(如变量v),则在类B中,this.v表示B的成员,A.this.v表示A的成员。tX^
©海岸线网络安全技术论坛 -- 自由,开放,免费,共享 .=xxO0
2.静态内部类.V
1)静态内部类的实例不会自动持有外部类的特定实例的引用,在创建内部类的实例时,不必创建外部类的实例。tss=:
2)静态内部类可以直接访问外部类的静态成员,如果访问外部类的实例成员,就必须通过外部类的实例去访问。}3
代码:
--------------------------------------------------------------------------------
-.;
class A{1#gEm
private int a1;W9s9Gb
private static int a2;Dh
I|P
public static class B{whP6
int b1 = new A().a1;b=
int b2 = a2-mjM<
}b
}©海岸线网络安全技术论坛 -- 自由,开放,免费,共享 ^%3Yh$
r=fqg
3)在静态内部类中可以定义静态成员和实例成员。而实例内部类中只能定义实例成员。+SF
4)客户类可以通过完整的类名直接访问静态内部类的静态成员。_cVi0B
©海岸线网络安全技术论坛 -- 自由,开放,免费,共享 /krzd4
3.局部内部类)K
局部内部类是在一个方法中定义的内部类,它的可见范围是当前方法。~f%8<`
1)局部内部类只能在当前方法中使用。UZ
2)局部内部类也不能含有静态成员。am.ph'
3)局部内部类中定义的内部类只能用默认的修饰,不能被public protected和private修饰。C
4)局部内部类和实例内部类一样,可以访问所有外部类的所有成员。此外,局部内部类还可以访问所在方法中的final类型的参数和变量。N
代码:
--------------------------------------------------------------------------------
jpa
class A{t
int a^?
public void method(final int p1,int p2)4
{pyK@X
int localV1=1;BO+Qx)
final int localV2=2;=Y
class B{?m=18
int b1=a;s
int b2=p1;pwW`
int b3=localV2;+19[
}0u-RUV
}UriT
}©海岸线网络安全技术论坛 -- 自由,开放,免费,共享 lc1
4
©海岸线网络安全技术论坛 -- 自由,开放,免费,共享 T4dM
4.子类与父类中内部类的同名ra472
内部类并不存在覆盖的概念,假如子类与父类中存在同名的内部类,那么这两个类也会分别在不同的命名空间中,因此不会发生冲突。N
©海岸线网络安全技术论坛 -- 自由,开放,免费,共享 5AkSiy
5.匿名类Yn7u
匿名类是一种特殊的内部类,这种类没有名字。78
1)匿名类本身没有构造方法,但是会调用父类的构造方法。}FA
代码:
--------------------------------------------------------------------------------
{I3 oX
public class A{K2
A() {System.out.println(“default constructor”);}oO^h
void method () {System.out.println(“from A”);}3
public static void main(String args[])W#1q
{b
new A().method();UN5Dd
A a=new A(){ //匿名类3
void method() {ACX
System.out.println(“from anonymous”);}z|^v)
};'+v
a.method();'S
}Em
}©海岸线网络安全技术论坛 -- 自由,开放,免费,共享 DOg2h
Eh
2)匿名类可以提供一段实例初始化代码,Java虚拟机会在调用父类的构造方法后,执行这段代码。但只能创建一次实例。:
3)除了可以在外部类的方法内定义匿名类,还可以在申明一个成员变量时定义匿名类。i
4)匿名类可以继承类,也可以实现接口5TgQx
5)匿名类和局部内部类一样,可以访问外部类所有的成员,如果匿名类位于一个方法中,还能访问所在方法的final类型的变量和参数。Avy