java內(nèi)部類2
1.定義:在一個類中定義另外一個類,這個類就叫做內(nèi)部類或內(nèi)置類 (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關(guān)鍵字
“當我們建立一個inner class時,其對象就擁有了與外部類對象之間的一種關(guān)系,這是通過一個特殊的this reference形成的,使得內(nèi)部類對象可以隨意的訪問外部類中所有的成員”(包括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.外部類訪問內(nèi)部類成員變量或其函數(shù)的兩種方法
第一種:
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.在外部類的某方法內(nèi)部定義內(nèi)部類,內(nèi)部類的某方法里只能訪問外部類方法里由final聲明的變量或參數(shù)。例子:
class Outer
{
void printOuter(final int n)
{
final String str="kingtoon";
class Inner
{
void printInner()
{
System.out.println(str);
System.out.println(n);
}
}
}
}
5.其實,使用內(nèi)部類,主要和接口同時使用,可以讓java實現(xiàn)多繼承。
例如:
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.內(nèi)部類可以解決方法同名的情況
例如:
interface Machine
{
void run();
}
class Person
{
void run()
{
System.out.println("現(xiàn)在,我可以跑了");
}
}
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();
}
}
此外,內(nèi)部類可以聲明為private或protected;還可以聲明為abstract或final(類似于方法的訪問權(quán)限)。
還有,內(nèi)部類可以聲明為static的,但此時就不能再使用外部類的非static的成員變量和非static的成員方法;非static的內(nèi)部類中的成員不能聲明為static的,只有在頂層類或static的內(nèi)部類中才可聲明static成員.
一點說明:參考資料《java無難事》Author孫鑫