定义在一个类里面,或者一个方法里面的类,叫做内部类。内部类一般可以分为四类:成员内部类,静态内部类、局部内部类和匿名内部类。
使用内部类的原因(好处),通常有三种:
1. 内部类可以使用外部类的数据;
2. 对同一个包的其他类、方法实现隐藏;
3. 定义一个回调函数时不需要编写大量的代码。
内部类是一个编译时的概念,一旦编译成功,就会成为完全不同的两类。对于一个名为outer的外部类和其内部定义的名为inner的内部类。编译完成后出现outer.class和outer$inner.class两类。
public class Test
{
int num = 1;
class Test1
{
int num;
void print()
{
System.out.print(num);
}
void set(int num)
{
this.num = Test.this.num;
}
}
}
Test1是Test的一个内部类,它可以访问Test里面的属性,也可以使用Test类中的其他方法。换句话说,它拥有了访问外围类的属性、方法的权限,无论是否是private,对内部类来说都是可视可访问的。
num相对于Test1是一个外部私有属性,但是Test1作为内部类是可以访问这个属性的。
public class Test{
public static void main(String[] args)
{
Test test = new Test();
Test.Test1 t1 = test.new Test1();
t1.printName("云都小生");
}
public class Test1
{
public void printName(String name)
{
System.out.println(name);
}
}
}
创建成员内部类对象的一般形式为: 外部类类名.内部类类名 xxx = 外部类对象名.new 内部类类名()
静态内部类其实跟私有内部类类似,只不过,这个类前面加了一个修饰符static,它不能再访问外部类的非静态属性。
public class Test
{
static int num = 1;
int data = 0;
static class Test1
{
int num;
void print()
{
System.out.print(num);
System.out.print(data);
}
void set(int num)
{
this.num = Test.this.num;
}
}
}
上面这个代码会出错,因为Test1是一个内部静态类,没办法访问外部非静态的属性。创建静态内部类对象的一般形式为: 外部类类名.内部类类名 xxx = new 外部类类名.内部类类名()
局部内部类是存在于方法里面的类,这个类只能使用该外围方法里面的final修饰的常量。
public class Test{
int data2 = 1;
public void Test1(){
final int data1=0;
class Demo{
void print()
{
System.out.println(data1);
System.out.println(data2);
Test2();
}
}
}
public void Test2()
{
System.out.println("Test");
}
}
这个例子可能会有点复杂,这个内部类Demo有一个方法,可以访问它外围方法的常量,但是它可以访问外围类的所有属性和方法。
ClassName className = new ClassName()
{
public void run()
{
System.out.println("Test");
}
}
类名 对象 = new 类名(参数列表)
{
代码块···
}
以上就是匿名类的定义与创建。匿名类在定义类的同时就创建它的对象,能访问它外部方法的final属性,也能访问外部类的所有属性、方法。
2017/9/28 16:08:02 @Author:云都小生(Cloudking)