Java内部类

版权所有,禁止匿名转载;禁止商业使用。

1.   成员内部类 Member Inner Class


在一个类中使用内部类,可以在内部类中直接存取其所在类的任何成员变量和方法。


在外部类里面创建成员内部类的实例:


this.new Innerclass();或者new InnerClass();


在外部类之外创建内部类的实例:


(new Outerclass()).new Innerclass();


在内部类里访问外部类的成员:


Outerclass.this.member


2.   静态内部类 Static Inner Class


静态内部类只能使用外部类的静态成员和方法,而不能使用非静态成员和方法。


在外部类里面创建成员内部类的实例:


new Innerclass();


在外部类之外创建内部类的实例:


new Outerclass. Innerclass();


3.   局部内部类 Local Inner Class


局部内部类在方法里面,跟局部变量一样,不能有 public, protected, private等关键词修饰,它不能访问外部类中的成员变量和方法,只能访问其所在方法里面的 final变量。


4.   匿名内部类 Anonymous Inner Class


匿名内部类就是没有名字的局部内部类,不使用关键字 class, extends, implements, 没有构造方法。


匿名内部类隐式地继承了一个父类或者实现了一个接口。


匿名内部类使用得比较多,通常是作为一个方法参数。


OuterClass:

package  javase.innerclass;

public   class  OuterClass {

static   int   x =0;

int   y =0;

public   class  MemberInnerClass{

private   int   y =0;

MemberInnerClass(){

y =5;

}

public   void  fun(){

System. out .println( "fun function from member inner class" );

//调用内部类中的方法,如果内部类不存在此方法。

//而外部类中存在,则调用的是外部类中的方法。

printY(10);

//调用外部类中的方法

OuterClass. this .printY();

}

public   void  printY( int  y){

System. out .println( "printY function from member inner class" );

//输出通过参数传进来的 y

System. out .println( "函数参数 y=" +y);

//输出内部类中的属性 y

System. out .println( "内部类中属性 y=" + this . y );

//输出外部类中的属性 y

System. out .println( "外部类中属性 y=" +OuterClass. this . y );

}

}

public   void  printY(){

System. out .println( "printY function from outter class" );

//在外部类里面新建成员内部类的实例,也可以这样写:

//MemberInnerClass innerClass=new MemberInnerClass();

MemberInnerClass innerClass= this . new  MemberInnerClass();

//在外部类里面新建静态内部类的实例

StaticInnerClass staticClass= new  StaticInnerClass();

//输出成员内部类中的成员变量

System. out .println( "成员内部类属性 y=" +innerClass. y );

//输出外部内中的成员变量

System. out .println( "外部类属性 y=" + y );

//输出静态内部类中的成员变量

System. out .println( "静态内部类属性 x=" +staticClass. x );

}

public   static   class  StaticInnerClass{

private   int   x =10;

public   void  printX(){

System. out .println( "printX function from static inner class" );

//输出内部类中的变量

System. out .println( "静态内部类属性 x=" + x );

//只能调用外部类的静态成员和方法

System. out .println( "外部类属性 x=" +OuterClass. x );

}

}

public   void  testLocalInnerClass(){

final   int  k=1;

//局部内部类

class  LocalInnerClass{

public   void  printK(){

System. out .println( "printK function from local inner class" );

//只能访问方法中的 final变量

System. out .println( "局部内部类所在的方法中的变量 k=" +k);

}

}

LocalInnerClass localClass= new  LocalInnerClass();

localClass.printK();

}

}

TestOuterClass:

package  javase.innerclass;

import  java.util.Date;

public   class  TestOuterClass {

public   static   void  main(String args[]){

OuterClass out= new  OuterClass();

System. out .println( "=====成员内部类 ==========" );

//在外部类外实例化局部内部类对象

OuterClass.MemberInnerClass in= out. new  MemberInnerClass();

in.fun();

System. out .println( "=====静态内部类 ==========" );

//在外部类外实例化静态内部类对象

OuterClass.StaticInnerClass staticInnerClass= new  OuterClass.StaticInnerClass();

staticInnerClass.printX();

System. out .println( "=====局部内部类 ==========" );

//局部内部类

out.testLocalInnerClass();

System. out .println( "=====匿名内部类 ==========" );

//匿名内部类 ,相当于继承 Date类,并且重写了 toString方法

System. out .println( new  Date(){

private   static   final   long   serialVersionUID  = 1L;

@Override

public  String toString(){

return   "hello " + super .toString();

}

}.toString());

}

}


0 0