定义
把类写在其他类的内部,和Ecmascript的闭包很相似,可以理解为类的私有类。 为何拥有访问外部类方法和属性的原理:当外围类的对象创建了一个内部类对象时,此内部类会秘密捕获一个指向外围类对象的引用,通过引用来访问外部类的属性和方法,这是think in java 中的原话。 内部类强大之处:每个内部类都能独立地继承一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响。 内部类的作用:在我们程序设计中有时候会存在一些使用接口很难解决的问题,这个时候我们可以利用内部类提供的、可以继承多个具体的或者抽象的类的能力来解决这些程序设计问题。可以这样说,接口只是解决了部分问题,而内部类使得多重继承的解决方案变得更加完整。 更多请参考这篇文章:详解内部类
基础使用和创建对象
package cn.com.github;
public class DotThis {
void f() {
System.out .println("DontThis.f()" );
}
public class Inners {
public DotThis outer () {
return DotThis.this ;
}
}
public Inners inners (){
return new Inners();
}
private class privateClass{
private int i = 11 ;
public int value (){
return i;
}
}
protected class protectedClass{
private int i = 10 ;
public int value (){
return i;
}
}
public static void main (String[] args) {
DotThis oDotThis = new DotThis();
DotThis.Inners dti = oDotThis.inners();
dti.outer().f();
DotThis.Inners dts = oDotThis.new Inners();
dts.outer().f();
privateClass class1 = oDotThis.new privateClass();
int s = class1.value ();
System.out .println(s);
protectedClass class2 = oDotThis.new protectedClass();
s = class2.value ();
System.out .println(s);
}
}
使用内部类来实现多重继承
package cn.com.github;
interface A {
}
interface B {
}
class X implements A , B {
}
class Y implements A {
B makeb() {
return new B() {
};
}
}
public class PowerInner {
static void taskesA(A a) {
}
static void taskesB(B b) {
}
public static void main(String[] args) {
X x = new X();
Y y = new Y();
taskesA(x);
taskesA(y);
taskesB(x);
taskesB(y.makeb());
}
}
多重继承
package cn.com.github;
class D {
}
abstract class E {
}
class Z extends D {
E makeE() {
return new E() {
};
}
}
public class PowerInner2 {
static void taskesD(D d) {
}
static void taskesE(E e) {
}
public static void main(String[] args) {
Z z = new Z();
taskesD(z);
taskesE(z.makeE());
}
}
参考