内部类:将一个类定义在另一个类里。对里面的那个类就是内部类。
访问特点:
1.内部类可以直接访问外部类的成员,包括私有。之所以可以直接访问外部类中的成员,是因为内部类中持有了一个外部的引用,格式 外部类名.this
外部类要访问内部类,必须建立内部类对象。
2.当内部类定义在外部类的成员位置上,而且为非私有,可以在外部类或者外部其他类中直接建立内部类对象。
格式为:外部类名.内部类名 变量名 = 外部类对象。内部类对象;
Outer.Inter i1=new Outer().new Inter();
3.当内部类在成员位置上,就可以被成员修饰符修饰。
比如private:将内部类在外部类中进行封装
static:内部就具备了static的特性.
当内部类被static修饰后,只能直接访问外部类的static成员,出现了访问的局限性。
在外部其他类中,如何直接访问static内部类的非静态成员?
new Outer.Inter().function();
在外部其他类中,如何直接访问static内部类的静态成员?
Outer.Inter.function();
4.当内部类定义了静态成员,该内部类必须是static的。当外部类的静态方法访问内部类时,内部类也必须是static的。
class Outer
{
private int x=1;
private int num=3;
class Inter//内部类
{
int x=4;
void function()
{
int x=6;
System.out.println("i am inter : "+num);
System.out.println("inter x1 : "+Outer.this.x);//外部类名.this方式直接访问外部类成员
System.out.println("inter x2 : "+this.x);//访问内部类成员
Outer.this.show();//外部类名.this方式直接访问外部类成员
}
}
void show()
{
System.out.println(num);
}
}
class InterDemo
{
public static void main(String[] args)
{
Outer o1=new Outer();
o1.show();
Outer.Inter i1=new Outer().new Inter();//外部类要访问内部类,必须建立内部类对象。
i1.function();
}
}
匿名内部类:
1.匿名内部类实际就是内部类的简写格式。
2.定义匿名内部类的前提:
内部类必须是继承一个类或者实现接口
3.匿名内部类的格式:
new 父类或者接口(){定义子类的内容}
4.其实匿名内部类就是一个匿名子类对象。可以理解为带内容的对象
5.匿名内部类中定义的方法最好不要超过3个
interface Inter
{
void show(int a,int b);
void func();
}
class Demo
{
public static void main(String[] args)
{
//补足代码;调用两个函数,要求用匿名内部类
Inter in = new Inter()
{
public void show(int a,int b)
{
}
public void func()
{
}
};
in.show(4,5);
in.func();
}
}