1.定义:在一个类中定义另外一个类,这个类就叫做内部类或内置类 (inner class)
2几个特性
1.可以访问其外部类用private修饰的变量或是方法
例子:
class Outer
{
private String str="kingtoon";
class Inner
{
void printInner()
{
System.out.println(str);
}
}
Inner getInner()
{
return new Inner();
}
}
class InnerClassTest
{
public static void main(String []args)
{
Outer outer=new Outer();
Outer.Inner inner=outer.getInner();
inner.printInner();
}
}
2.this关键字
“当我们建立一个inner class时,其对象就拥有了与外部类对象之间的一种关系,这是通过一个特殊的this reference形成的,使得内部类对象可以随意的访问外部类中所有的成员”(包括private变量和方法)。
例子:
class Outer
{
private String str="kingtoon";
class Inner
{
String str="hjd";
void printInner()
{
String str="kingtoon_hjd";
System.out.println(str);
System.out.println(this.str);
System.out.println(Outer.this.str);
}
}
Inner getInner()
{
return new Inner();
}
}
class InnerClassTest
{
public static void main(String []args)
{
Outer outer=new Outer();
Outer.Inner inner=outer.getInner();
inner.printInner();
}
}
3.外部类访问内部类成员变量或其函数的两种方法
第一种:
class Outer
{
private String str="kingtoon";
class Inner
{
void printInner()
{
System.out.println(str);
}
}
}
class InnerClassTest
{
public static void main(String []args)
{
Outer outer=new Outer();
Outer.Inner inner= outer.new Inner();
inner.printInner();
}
}
第二种
class Outer
{
private String str="kingtoon";
class Inner
{
void printInner()
{
System.out.println(str);
}
}
Inner getInner()
{
return new Inner();
}
}
class InnerClassTest
{
public static void main(String []args)
{
Outer outer=new Outer();
Outer.Inner inner=outer.getInner();
inner.printInner();
}
}
4.在外部类的某方法内部定义内部类,内部类的某方法里只能访问外部类方法里由final声明的变量或参数。例子:
class Outer
{
void printOuter(final int n)
{
final String str="kingtoon";
class Inner
{
void printInner()
{
System.out.println(str);
System.out.println(n);
}
}
}
}
5.其实,使用内部类,主要和接口同时使用,可以让java实现多继承。
例如:
interface A
{
void printA();
}
class B
{
void printB()
{
System.out.println("b");
}
}
class C extends B
{
A getA()
{
return new A()
{
public void printA()
{
System.out.println("a");
}
};
}
}
class Interface_extends_inner
{
static void fn1(A a)
{
System.out.println("A");
}
static void fn2(B b)
{
System.out.println("B");
}
public static void main(String []args)
{
C c=new C();
A a=c.getA();
a.printA();
c.printB();
fn1(a);//fn1(c.getA());
fn2(new B());
}
}
6.内部类可以解决方法同名的情况
例如:
interface Machine
{
void run();
}
class Person
{
void run()
{
System.out.println("现在,我可以跑了");
}
}
class Robot extends Person
{
private class MachineHeart implements Machine
{
public void run()
{
System.out.println("机器引擎启动了");
}
}
MachineHeart getMachinHeart()
{
return new MachineHeart();
}
}
class Fangfatongming_inner
{
public static void main(String [] args)
{
Robot robot=new Robot();
Machine machine=robot.getMachinHeart();
machine.run();
robot.run();
}
}
此外,内部类可以声明为private或protected;还可以声明为abstract或final(类似于方法的访问权限)。
还有,内部类可以声明为static的,但此时就不能再使用外部类的非static的成员变量和非static的成员方法;非static的内部类中的成员不能声明为static的,只有在顶层类或static的内部类中才可声明static成员.
一点说明:参考资料《java无难事》Author孙鑫