文章目录
- 1. 概念
- 2. 内部类特性
- 3. 内部类实现多重继承的应用
1. 概念
(1)在 Java 中,允许一个类的定义位于另一个类的内部,前者称为内部类,后者称为外部类。
(2)Inner class 一般用在定义它的类或语句块之内,在外部引用它时必须给出完整的名称。
注:Inner class 的名字不能与包含它的类名相同。
(3)Inner class 可以使用外部类的私有数据,因为它是外部类的成员,同一个类的成员之间可相互访问。而外部类要访问内部类中的成员需要 : new 内部类.成员
或者new 内部类对象.成员
。
下面举个例子来说明:
package day09;
public class Test3 {
int i;
public int z;
private int k;
class A {//内部类
int i;//内部类可以有自己的属性
public void setTest3Fileds() {
Test3.this.i = 1;//设置外部类的属性
Test3.this.z = 2;
Test3.this.k = 3;
}
public void set() {//内部类可以有自己的方法
this.i = 10;
}
}
public void setInfo() {//通过内部类设置外部属性
new A().setTest3Fileds();//外部的类要想使用自己的内部类的方法,得先new内部类的对象
}
public void showInfo() {//显示属性
System.out.println(this.i);
System.out.println(this.z);
System.out.println(this.k);
}
public static void main(String[] args) {
Test3 t = new Test3();
t.setInfo();
t.showInfo();
}
}
2. 内部类特性
Inner class 作为类的成员:
(1)可以声明为 final 的
(2)和外部类不同, Inner class 可声明为 private 或 protected ;
(3)Inner class 可以声明为 static 的,但此时就不能再使用外层类的非 static 的成员变量;
Inner class 作为类:
(1)可以声明为 abstract 类 ,因此可以被其它的内部类继承
【注意】非 static 的内部类中的成员不能声明为 static 的,只有在外部类或 static 的内部类中才可声明 static 成员。
核心作用:内部类最大的作用是实现多重继承
package day09;
public class Test3 {
int i;
public int z;
private int k;
//声明内部类:A、B、C、D、E
class A {//内部类
int i;
public void setTest3Fileds() {
Test3.this.i = 1;
Test3.this.z = 2;
Test3.this.k = 3;
}
public void set() {
this.i = 10;
}
}
final class B {//除了声明为final。与外部类不同,内部类还可以声明为private、protected类
}
static class C {//如果内部类是static的,就不能使用外部类的非static的成员
}
abstract class D {//可以声明为 abstract 类,被其它的内部类继承
}
class E extends D {//E类继承D抽象类
}
}
3. 内部类实现多重继承的应用
内部类主要是解决java不能多重继承的问题:
举例:
代码如下
package day09;
public class Test4 {
public static void main(String[] args) {
A a = new A();
a.testB();
a.testC();
}
}
/**
* 现在类A想同时获得类B和类C的方法(java无法进行多继承),并且重写
* 可以使用内部类来变相的实现类的多重继承,可以继承多个类
* @author 14532
*
*/
class A {
public void testB() {
new InnerB().testB();
}
public void testC() {
new InnerC().testC();
}
private class InnerB extends B{
@Override
public void testB() {
System.out.println("这是重写之后的testB方法");
}
}
private class InnerC extends C{
@Override
public void testC() {
System.out.println("这是重写之后的testC方法");
}
}
}
class B {
public void testB() {
}
}
class C {
public void testC() {
}
}
运行结果: