内部类:
1、内部类是指在一个外部类的内部再定义一个类。
2、内部类作为外部类的一个成员,并且依附于外部类而存在的。
3、内部类可为static,可用public、protected、private修饰。(外部类只能使用publi和default)。
分类
在一个类(外部类)中直接定义的内部类(成员内部类)、
局部内部类、
静态内部类、
匿名内部类。
使用方法
在一个类中直接定义的内部类 (成员内部类)
1、外部类不能直接访问内部类的的成员,必须通过创建内部类的实例对象访问。
2、内部类作为外部类的成员,可以访问外部类的所有成员。
注:内部类是一个编译时的概念,一旦编译成功,就会成为完全不同的两个类。例:对一个Outer的外部类和其内部定义Inner内部类。编译完成后出现Outer.class和Outer$Inner.class两类。
3成员内部类与普通的成员没什么区别,可以与普通成员一样进行修饰和限制。
4、内部类中不允许定义static变量。
5、内部类类似外部类的属性,因此访问内部类对象时总是需要一个创建好的外部类对象
public class OuterAndInnerTest {
/**
* @param args
*/
private int out_x = 1;
public int out_y =2;
public static void main(String[] args) {
// TODO Auto-generated method stub
OuterAndInnerTest outer = new OuterAndInnerTest();
Inner inner = outer.new Inner(); //此方法适用于外部类的static方法访问内部类
inner.display();
System.out.println("inner_x : " + inner.inner_x);
System.out.println("inner_y : " + inner.inner_y);
/*outer.test();*/
}
/*public void test()
{
Inner inner = new Inner(); //此方法适用于外部类的非static方法访问内部类
System.out.println("inner_x : " + inner.inner_x);
System.out.println("inner_y : " + inner.inner_y);
inner.display();
}*/
class Inner
{
private int inner_x = 3;
public int inner_y =4;
// public static inner_z = 5; 内部类中不能定义静态变量
public void display()
{
System.out.println("out_x : " + OuterAndInnerTest.this.out_x);
//内部类对象通过外部类名.this.xxx’的形式访问外部类的属性与方法
System.out.println("out_x : " + out_x);
System.out.println("out_y : " + out_y);
}
}
}
在一个方法中定义的内部类 (局部内部类)
1、在方法中定义的内部类称为局部内部类。与局部变量类似,在局部内部类前不加修饰符public和private,其范围为定义它的代码块。其他用法和成员内部类相同。
2、内部类需要访问包含它的外部类方法或语句块的局部变量或参数,则该局部变量或参数必须是final
3、外部类的其他方法、其他类无法访问声明在方法内部或块内部的局部内部类
静态内部类
1、不能访问外部类的非静态成员,这是由Java语法中"静态方法不能直接访问非静态成员"所限定。
2、在创建静态内部类对象时不需要外部类对象的存在。其实质是一个放置在别的类内部的普通类。关键字static只是说明其在创建对象时不依赖于外部类对象的存在,并不是说这个类本身是静态的。
3、静态内部类内部类的声明前面要加上static关键字,也不可以用private进行定义。
4、静态内部类与非静态内部类的区别是本质上的。非静态内部类是外部类对象组成的一部分,主要是辅助外部类对象工作的,与外部类对象存在对成员变量的共享关系。
匿名内部类
1、匿名内部类是一种特殊的局部内部类,这种内部类没有类名。该类适用于只使用一次并且不需要多次创建对象的类。
2、匿名内部类是唯一一种没有构造方法的类。因为其没有构造方法,使用范围非常有限。
- 大部分匿名内部类用于接口回调。
- 匿名内部类在编译的时候由系统自动起名为Out$1.class
- 匿名内部类用于继承其他类或是实现接口,并不需要增加额外的方法,只是对继承方法的实现或是重写。
3、语法规则:new <类或接口> <类的主体>
interface Print
{
void print();
}
public class AnonymTest {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
AnonymTest anony = new AnonymTest();
Print pr = anony.display();
pr.print();
}
public Print display()
{
//匿名内部类的用法:创建一个实例对象,并且override它的一个函数
return new Print() {
public void print()
{
System.out.print("Hello World");
}
};
}
}
继承:
如果一个类继承内部类,则创建该类的对象时需提供一个外部类的对象作为构造方法的参数