内部类(Inner Class)学习知识点总结:
1、概念
把一个类定义到另一个类的内部的类就叫内部类,内部类可以看作是外部类的一个成员(与类的属性和方法类似)。
内部类一样可以有自己的子类,可以被继承。
2、分类
①静态内部类(static inner class)
静态内部类是指被static修饰的内部类,它可以不依赖与外部OuterClass类的实例而实例化,类似与静态函数,静态变量一样,随着类加载而被创建。另外静态内部类不能与外部类有相同的名字,不能访问外部类的普通成员变量,只能访问外部类中静态成员和静态方法(根据静态成员不能访问非静态成员的规则)。静态内部类的成员方法(包含类方法和实例方法)不能访问外部类的实例方法。(实例方法指非静态方法)
②成员内部类(member inner class)
成员内部类中可以访问外部类的所有成员变量和方法,包括静态和非静态。
成员内部类(非静态内部类)的使用权限:
- ①private修饰:只能在外部类的内部使用
- ②默认修饰:只能被与外部类处于同一包中的其他类所访问
- ③protected修饰:可以被与外部类处于同一包的其他类以及外部类的子类访问
- ④public修饰:可以在任何地方使用
③局部内部类(local inner class)
局部内部类中可以访问外部类的所有成员变量和方法,包括静态和非静态。
④匿名内部类(anonymous inner class)
匿名内部类可以访问外部类的静态成员变量和静态方法,不能访问非静态成员变量和方法。
3、匿名内部类同时需要注意几个方面:
1)匿名内部了不能有构造函数
2)匿名内部类不能定义静态成员、静态方法和类
3)匿名内部类不能是 public、protected、private、static。
4)只能创建匿名内部类的一个实例。
5)一个匿名内部类一定是在new 的后面,这个匿名内部类必须集成一个父类或是实现一个接口。(下面的代码实例是实现了一个接口的方式定义匿名内部类)
4、各个内部类定义实例如下:
interface Inner {
void say();
}
class OuterClass {
int a;
static int b = 10;
String name = "OuterName";
static class StaticInnerClass {
void test(){
// System.out.println("a="+a);//不可以访问非静态变量
System.out.println("b="+b);
}
}//静态内部类
class MemberInnerClass {
private String name = "InnerClass";
void test(){
System.out.println("a="+a);
System.out.println("b="+b);
}
public void setName(String name){
System.out.println(name);//调用形参的name属性
System.out.println(this.name);//调用内部类的name同名属性
System.out.println(OuterClass.this.name);//调用外部类的同名属性
}
}//成员内部类
public void method() {
class LocalInnerClass {
void test(){
System.out.println("a="+a);
System.out.println("b="+b);
}
}//局部内部类
}
public void method1(Inner inner1) {
System.out.println("实体函数");
}
public static void main(String[] args) {
new OuterClass().method1(new Inner() {//匿名内部类
@Override
public void say() {}
void test(){
// System.out.println("a="+a);//不可以访问非静态变量
System.out.println("b="+b);
}
});
}
}
5.内部类在外部类外使用方法:
①非静态内部类:
-
在外部类的内部:In in = new In();//与平常用的类没有太大区别
-
在外部类的外部:Out.In in = new Out().new In();//因成员内部类是外部类的成员,因此要依附外部类的对象上使用
②静态内部类:
- 在外部类的内部:In in = new In();//与平常用的类没有太大区别
- 在外部类的外部:Out.In in = new Out.In();//因成员内部类是外部类的成员,因此要依附外部类的对象上使用