Java入门(十八)——内部类
目录
内部类
- 在类的内部又定义一个新的类
* 分类:
- 静态内部类:类似于静态变量
- 实例内部类:类似于实例变量
- 局部内部类:类似于局部变量
- 内部类编写的代码,可读性差,尽量不用
- 匿名内部类是内部类的一种
非静态成员内部类
- 作为类的成员可以使用4种权限修饰符来进行修饰,相比于外部类,外部类只能使用两个权限修饰符(public和默认)来修饰。
- 非静态成员内部类可以有自己的成员变量,构造方法,成员函数。但不能有静态的方法,从时间角度上理解,静态方法创建是内部类还没有被初始化。
- 在非静态成员内部类的方法中可以直接访问外部类的成员:成员变量,成员方法,构造方法
- 外部类不可以直接访问内部类的成员,必须先创建一个内部类对象,使用对象名来访问内部类成员。OutClass.IntClass a=new OutClass.new IntClass
- 创建内部类对象的前提是,先创建外部类的对象
- 外部类的静态方法不可以访问非静态内部类,包括不能创建内部类的实例,也就不能访问内部类的成员方法,成员变量。
静态内部类
- 静态成员内部类像其他的静态成员一样,是属于类的。
- 静态成员内部类可以有静态方法。
- 静态成员内部类(静态方法和非静态方法)只能访问外部类静态的成员。
- 静态成员内部类的方法中可以通过外部类的类名直接调用外部类的静态成员,也可通过对象名来调用。
- 在Test类中可以通过类名直接创建内部类对象。
匿名内部类
- 表示这个类没有名字,没有办法重复使用,代码太乱,可读性太差
- 使用方法见例子
范例代码
public class InnerClass{
public static void main(String[] args) {
Math sum1=new Math();
//sum1.sum(???, 100, 200);//无法直接使用引用数据类型
//一般情况
Computerout c=new Computerout();//对接口的实现类进行建立对象
sum1.sum(c, 100, 200);//对象的调用
//内部类
sum1.sum(new Computer(){//new Computer(){}相当于接口的实现类,只是在方法的调用上将方法具体
public int sum(int a,int b) {
int sum=0;
sum=a+b;
return sum;
}
}, 100, 200);
}
}
class Computerout implements Computer{//Computer接口的实现类
public int sum(int a,int b) {
int sum=0;
sum=a+b;
return sum;
}
}
interface Computer{//接口
int sum(int a,int b);
}
class Math{//基本外部类实现
public void sum(Computer c,int x,int y) {
int sum=c.sum(x, y);
System.out.println("实验结果是:"+sum);
}
}