------- android培训、java培训、期待与您交流! ----------
1.内部类:
如果A类要访问B类的成员,不要直接单纯的使用继承。
而B类又需要建立A类的对象,这时为了方便访问。
直接将A类定义在B类中。A类就称为内部类。
内部类是可以直接访问外部类中的成员,而外部类要想访问内部类,必须建立内部类的对象。
内部类是定义在外部类的成员位置,所以可以使用成员修饰符来修饰,private,static
1.默认修饰符
访问形式: 外部类名。内部类名 变量名 = 外部类对象。内部类对象
Outer.Inner in = new Outer.new Inner();
因为内部类之所以定义在内部就是为了封装,想要获取内部类的对象通常都通过外部类的方法来获取。
2.私有修饰符
内部类被封装都会私有化,然后提供一个外部公共访问方法进行控制
3.静态修饰符
如果被静态修饰。就相当于外部类了,只能访问外部类中的静态成员
如果内部类中定义了静态成员,则该内部类必须是静态
内部类编译后的文件名为: 外部类名$内部类名.java
为什么内部类可以直接访问外部类中的成员?
因为内部中都有一个外部类的引用。这个引用是外部类名.this
如果内部类定义在局部位置上,只能访问局部中被final修饰的局部变量
匿名内部类
没有名字的内部类,跟匿名对象一样,只能用一次。
而要定义匿名内部类的前提:内部类必须继承一个类或者实现接口
这样匿名内部类的功能也就体现出来了:
当函数的参数是接口类型引用时,接口方法不超过三个,可以直接使用匿名内部类来复写该接口完成参数的传递。更加的方便
匿名内部类的格式: new 父类名&接口名(){定义子类成员或者复写父类方法}.方法
注意 这时必须加上.方法
因为匿名对象就是调用方法而用,这时匿名内部类复写后相当于创建了一个匿名对象。
实例1
1.new Object()
{
void show()
{
System.out.println("show run");
}
}.show();
2.
Object obj = new Object()
{
void show()
{
System.out.println("show run");
}
};
obj.show();
这两种方法哪种是正确的?
第一种是标准的匿名内部类写法,创建匿名对象,复写抽象方法,再直接调用方法
第二种是先将其创建对象引用来引用这个匿名内部类复写方法后的对象,但是使用时忽略了多态的问题。在成员函数中,编译器会先判断引用是否有此调用方法,若没有就报错
这里的Object类中并没有show方法,所以错误
实例2
class InnerClassDemo6
{
staitc class Inner{
void show(){}
}
public void method()
{
new Inner().show();//普通方法要通过对象的形式来访问内部类的方法,这里使用了匿名对象
}
public static void main(String[] args) // 此主方法为static,静态方法是在对象创建之前得,所以不能有this
{
this.new Inner().show(); //错误1.this //错误2 静态
//Inner是一个普通的内部类,那么静态方法是不能访问普通成员的。所以要在这里给Inner加上static
}
}