目录
1. 什么是内部类
2. 为什么会有内部类的产生
3. 成员内部类
3.1 用法
3.3 成员内部类和外部类的区别和联系
4. 静态内部类
5. 方法内部类
6. 匿名内部类
1. 什么是内部类
嵌套在其他类内部的类,根据出现的位置和关键字可以分为以下四种内部类:成员内部类、静态内部类、方法内部类、匿名内部类。
2. 为什么会有内部类的产生
- 内部类与外部类可以互相访问彼此的私有域:内部类访问外部类的私有域可以直接访问,外部类访问内部类的私有域必须通过内部类对象访问;
- 内部类可以变相的解决 Java 单继承局限;
- 内部类可以对外部隐藏(LinkedList 中的 Node 类)。
3. 成员内部类
成员内部类的用法和成员方法差不多.
3.1 用法
代码示例:
package demo.inner;
public class Outter {
// 外部类私有域 成员变量
private int age = 18;
private String name = "lisi";
// 成员内部类
class Inner {
private String msg = "Inner class";
private int age = 20;
public void test() {
System.out.println(msg);
System.out.println(this.age);
// 内部类访问外部类的私有域
System.out.println(Outter.this.age);
}
}
// 外部类成员方法
public void func() {
// 创建内部类对象
Inner inner = new Inner();
// 外部类通过内部类对象访问内部类私有域
System.out.println(inner.msg);
}
public static void main(String[] args) {
Outter outter = new Outter();
outter.func();
Outter.Inner inner = new Outter().new Inner();
inner.test();
}
}
1. 创建内部类的语法:
a. 在外部类内部创建内部类对象 内部类名 inner = new 内部类名();
b. 在外部类的外部创建内部类对象(前提内部类不是 private)外部类.内部类 inner = new Outter().new Inner();
2. 内部类可以变相的解决 Java 单继承局限。
上述例子中 InnerExtend 类没有直接继承 A类 和 B类,但是通过它的内部类 InnerA 和 InnerB 这两个内部类继承了 A类 和 B类,从而使 InnerExtend 类获取了这两个类的私有域,解决了 Java 中只能单继承的局限。但实际内部类也还是单继承,只是使用了多个内部类。
3. 内部类可以对外部隐藏(LinkedList 中的 Node 类)。
4. 成员内部类类比成员方法,不能拥有静态域,但可以访问外部类的静态域。
5. 成员内部类不能有 main 方法,但是可以有构造方法。
3.3 成员内部类和外部类的区别和联系
- private 不可以用在外部类的声明,但是可以用在内部类的声明。
- 成员内部类的创建需要依赖外部类对象,在没有外部类实例之前无法创建成员内部类对象;
- 内部类和外部类相对独立;
-
内部类与外部类可以互相访问彼此的私有域:内部类访问外部类的私有域可以直接访问,外部类访问内部类的私有域必须通过内部类对象访问。
- 在内部类的内部使用隐藏的外部类变量(与内部类的变量名相同),用外部类类名.this.成员变量。
4. 静态内部类
定义在外部类中的内部使用 static 修饰就是静态内部类。
代码示例:
public class StaticInnerClass {
int age;
static int a;
// 静态内部类
static class Inner {
private String name = "lisi";
static int num = 10;
public void test() {
// 访问外部类的静态域
System.out.println(a);
System.out.println(name);
// 不能访问外部类的非静态域
// System.out.println(age);
}
}
// 成员方法
public void fun() {
// 在外部类内部创建静态内部类对象
Inner inner = new Inner();
// 通过静态内部类对象访问静态内部类私有域
System.out.println(inner.name);
}
}
class Test {
public static void main(String[] args) {
StaticInnerClass staticInnerClass = new StaticInnerClass();
staticInnerClass.fun();
// 在外部类外部创建静态内部类
StaticInnerClass.Inner inner = new StaticInnerClass.Inner();
inner.test();
}
}
1. 静态内部类不能访问外部类的成员域,可以访问外部类的静态域。
2. 静态内部类有自己的成员域。
3. 在外部类的外部创建静态内部类的语法:外部类名称.Inner = new 外部类.Inner();
成员内部类和静态内部类的区别:
1. 成员内部类必须有外部类对象;静态内部类不依赖外部对象.
2. 成员内部类能访问外部的静态域,不能拥有静态域;静态内部类能拥有成员域,也能拥有静态域,但是不能访问外部的成员域。
5. 方法内部类
定义在方法内部的称为方法内部类(又称局部内部类)。
代码示例:
package demo.inner;
public class MethodInner {
// 方法
public void test() {
final int a = 4;
// 方法内部类
class inner {
int b = 10;
private void func() {
// 调用方法内部类外部方法的局部参数
System.out.println(a);
// 调用方法内部类中的变量
System.out.println(b);
}
}
// 使用内部类调用内部类方法
new inner().func();
}
}
class test {
public static void main(String[] args) {
MethodInner methodInner = new MethodInner();
methodInner.test();
}
}
用法:
1. 方法内部类对外部完全隐藏,方法内部类的地位和方法里面的局部变量相似,因此方法内部类不能有任何访问修饰符。
2. 方法内部类只能在声明的方法里面是可见的,请记住,一定要先声明方法,后使用内部类,否则,编译器就会说找不到这个内部类。
3. 方法内部类不能访问其他地方定义的局部变量(就是方法内部类外的地方),除非这个变量是 final 修饰的。
4. 方法内部类只能包含非静态成员。
6. 匿名内部类
匿名内部类也是定义在方法中,没有类名,常用在多线程部分。
要求:
- 必须继承一个抽象类或者实现一个接口;
- 没有构造方法。
代码示例:
package demo.inner;
// 接口
interface IMessage {
void func();
}
// 外部类
public class NoNameInner {
public static void main(String[] args) {
// 实现接口
IMessage msg = new IMessage() {
// 匿名内部类
@Override
public void func() {
System.out.println("匿名内部类");
}
};
// 使用接口对象调用匿名内部类
msg.func();
}
}
ps :匿名内部类只能使用一次就销毁了。
暑期编程PK赛 得CSDN机械键盘等精美礼品!


