1.内部类定义
可以将一个类的定义放在另一个类的定义内部,这就是内部类。广泛的说,目前内部类可以被分成四种,分别是成员内部类、静态内部类、局部内部类、匿名内部类。
2内部类分类
2.1成员内部类
它可以访问它的外部类的所有成员变量和方法,不管是静态的还是非静态的都可以。内部类和外部类的实例变量可以共存。在内部类中访问实例变量:this.属性;在内部类访问外部类的实例变量:外部类名.this.属性。在外部类的外部访问内部类,使用out.inner.属性。
示例:
class Outer //外部类;
{
private int x=3;
private static int y=4;
//成员内部类
class Inner{
private int x=6;
void function(){
int x=8;
System.out.println(x);//
System.out.println(this.x);//访问内部类实例变量
System.out.println(Outer.this.x);//在内部类中访问外部类的非静态成员
System.out.println(Outer.this.y);//在内部类中访问外部类的静态成员
}
}
}
public class InsideClassDemo
{
public static void main(String[] args)
{
// 创建成员内部类的对象,首先需要先创建外部类的实例 ,格式是:外部类.内部类 变量名=new 外部类().new 内部类()
Outer.Inner inner=new Outer().new Inner();
inner.function();
}
}
2.2 静态内部类
内部类定义时加上static关键字。只可以访问外部类的静态成员和静态方法,包括了私有的静态成员和方法。
示例:
class Outer //外部类;
{
private int x=3;
private static int y=4;
//成员内部类
static class Inner{
void function(){
//System.out.println(x);编译出错—不能访问外部类的非静态成员或非静态函数
System.out.println(y);//只能访问外部类的静态成员或静态函数
}
}
}
public class InsideClassDemo
{
public static void main(String[] args)
{
// 创建成员内部类的对象,首先需要先创建外部类的实例 ,格式是:外部类.内部类 变量名=new 外部类.内部类()
Outer.Inner inner=new Outer.Inner();
inner.function();
}
}
2.3 局部内部类
在方法中定义一个内部类 ,这个类就是局部内部类
class Outer //外部类;
{
int x=3;
//局部内部类
void function(final int a){
int m=4;
class Inner{
void method(){
System.out.println(x);//这个地方需要注意一下:访问x的顺序是:看看内部///类中是否有变量x,有就返回该值,没有去看看外部类的的成员方法是否有变量x,有就输出该值,没有就输出外部类的成员变量x;这里面输出3;
System.out.println(m);
System.out.println(a);
}
new Inner().method();//局部内部类在方法中定义,所以只能在方法中使用,即只能在方法当中生成局部内部类的实例并且调用其方法。
}
/*private class Inner1{
} 像局部变量一样,不能被public, protected, private和static修饰。
*/
}
}
public class InsideClassDemo
{
public static void main(String[] args)
{
new Outer().function(7);
new Outer().function(8);
}
}
2.4匿名内部类
1.匿名内部类其实就是内部类的简写格式。
2.定义匿名内部类的前提:
内部类必须继承一个类或者实现接口。(内部类可以直接继承外部类或者外部其他类。)
3.匿名内部类的格式:
new 父类名()
{
//定义子类的内容,例如:
void 抽象方法的方法名()
{
System.out.println("x="+x);
}
}.方法名();
4.其实,匿名内部类就是一个匿名子类对象,而且这个对象有点“胖”,也可以理解为带内容得对象。
5.匿名内部类中定义的方法最好不要超过3个。
示例:
class Outer //外部类;
{
int x=3;
//匿名内部类
void function(){
new Inner (){
void method(){
System.out.println(x);
}
}.method();
}
}
abstract class Inner{
abstract void method();
}
public class InsideClassDemo
{
public static void main(String[] args)
{
new Outer().function();
}
}