内部类
一、定义:把一个类定义在另一个类中,对里面的那个类就称为内部类(内置类、嵌套类)。
二、特点:
- 内部类可以直接访问外部类中的成员,包括私有的成员;外部类访问内部类中的成员必须建立内部类的对象;
- 静态内部类只能访问外部类的静态变量;
- 接口里可以定义内部接口和抽象类,抽象类里可以定义接口和抽象类。
三、 代码;
class JavaDemo
{
public static void main(String[] args)
{
//System.out.println(new Outer().getInner());
//new Outer().getInner().test();
Outer out = new Outer();
Outer.Inner in = out.new Inner();//先要创建外部实例
in.test();
new Outer.Heart().test();
}
}
//内部类
class Outer
{
private static String outInfo = "好人";
public void test(){
System.out.println("outer_test");
}
class Inner
{
public void test(){
System.out.println("Inner"+outInfo);
}
}
//静态内部类只能访问外部的静态变量
static class Heart
{
public void test(){
System.out.println("Heart"+outInfo);
}
}
/*
public Inner getInner(){
return new Inner();
}
*/
}
四、局部内部类:将内部类写在方法中,这种情况,如果内部类想要访问方法中的参数,那么参数必须是final定义的(jdk1.8就可以不写final)。
Eg:
//定义外部类:
class Outer{
private String info = "hello world!!";
public void fun(final int temp){
//在方法中定义内部类:
class Inner{
public void print(){
System.out.println("类中的属性:"+info);
System.out.println("方法中的参数:"+temp);
}
};
new Inner().print();
}
}
五、匿名内部类:
- 前提:内部类可以继承或者实现一个外部类或接口。
- 格式:new 外部类名/接口名(){覆盖类或接口中的代码/自定义内容}
Eg:
class NoNameDemo
{
public static void main(String[] args)
{
Do d = new Do();
//d.print(new B());
d.print(
new A(){public void test(){
System.out.println("haha");
}});
}
}
interface A
{
void test();
}
/*
class B implements A
{
public void test(){
System.out.println("hahah");
}
}
*/
class Do
{
public void print(A a){
a.test();
}
}
六、
- 实例内部类:new Outer.new Inner();
- 内部类的表示方法:Outer.Inner
- 静态内部类:new Outer.Inner().test(); //只能访问外部的静态变量