
内部类
内 部 类

什么是 Java中的内部类·什么是内部类(Inner Class)?一定义在另外一个类里面的类。与之对应,包含内部类的类被称为外部类。·为什么要定义内部类?内部类的主要作用?一1.内部类提供了更好的封装,可以把内部类隐藏在外部类之内,不允许同一个包中的其他类访问一2.内部类的方法可以直接访问外部类的所有数据,包括私有的数据一3.有时使用内部类更方便。·内部类可分为以下几种:一成员内部类、静态内部类、方法内部类、磨名内部类
什么是 Java 中的内部类 • 什么是内部类(Inner Class )? – 定义在另外一个类里面的类。与之对应,包含内部类 的类被称为外部类。 • 为什么要定义内部类?内部类的主要作用? – 1. 内部类提供了更好的封装,可以把内部类隐藏在外 部类之内,不允许同一个包中的其他类访问 – 2. 内部类的方法可以直接访问外部类的所有数据,包 括私有的数据 – 3. 有时使用内部类更方便。 • 内部类可分为以下几种: – 成员内部类、静态内部类、方法内部类、匿名内部类

成员内部类访问外部类中的a:99访问内部类中的b:2·最常见,也称为普通内部类。//外部类Outerpublic class Outerprivateint a =99;//外部类的私有属性//内部类Innerpublic class Innerintb=2;//内部类的成员属性public void test()(System.out.println("访问外部类中的a:"+a)System.out.println("访问内部类中的b:"+b);//测试成员内部类public static void main(String[ args)fOuter o=new Outer();//创建外部类对象,对象名为oInner i=o.new Inner(;//使用外部类对象创建内部类对象,对象名为ii.test();//调用内部类对象的test方法7
成员内部类 • 最常见,也称为普通内部类

成员内部类对举例的说明1、Inner类定义在outer类的内部,相当于outer类的一个成员变量的位置,Inner类可以使用任意访问控制符,如public、protected、private等;2、Inner类中定义的test(方法可以直接访问Outer类中的数据而不受访问控制符的影响,如直接访问outer类中的私有属性a;,3、定义了成员内部类后,必须使用外部类对象来创建内部类对象,而不能直接去new一个内部类对象,即:内部类对象名=外部类对象.new内部类();。4、编译上面的程序后,会发现产生了两个.class文件OutersInner.classCLASS文件2014/6/213:02Outer.class2014/6/213:02CLASS文件其中,第二个是外部类的.class文件,第一个是内部类的.class文件成员内部类的.class文件总是这样:外部类名s内部类名.class
成员内部类 对举例的说明 • 1、 Inner 类定义在 Outer 类的内部,相当于Outer 类的一个成员 变量的位置,Inner 类可以使用任意访问控制符,如public 、 protected 、 private 等; • 2、 Inner 类中定义的 test() 方法可以直接访问 Outer 类中的数据, 而不受访问控制符的影响,如直接访问Outer 类中的私有属性a; • 3、 定义了成员内部类后,必须使用外部类对象来创建内部类对 象,而不能直接去 new 一个内部类对象,即: 内部类对象名= 外部类对象.new 内部类( ); • 4、 编译上面的程序后,会发现产生了两个.class 文件 ⚫ 其中,第二个是外部类的 .class 文件,第一个是内部类的 .class 文件, 成员内部类的.class 文件总是这样:外部类名$内部类名.class

1//外部英Heloworla友情提示public class Helloworld(23/内部类Inner,夹Inner在类outer的内部40public class Inner f5//内部类的方法1、外部类是69publicvoid show)(不能直接使用7System.out.println("welcome to imooc!");8内部类的成员子91和芳法;10public void print()(611show();//外部类调用内部类的或方法子外部类不能直接访问内部类中的成员方法·2、如果外部131类和内部类具有相同的成员//外部类Outerpublic class Outer(变量或方法intb =1;/ /外部类中的成员属性内部类默认访//内部类Inner问首已的成赏public class Inner 变量或方法int b=2//内部类的成员属性b如果要访问外访问外部类中的成员属性bpublic voidtest()(部类的成员变System.out.println("访问外部类中的b:"+Outer.this.b);量,奇饮使角System.out.println("访问内部类中的b:"+b);this 关键字
友情提示 • 1、 外部类是 不能直接使用 内部类的成员 和方法; • 2、 如果外部 类和内部类具 有相同的成员 变量或方法, 内部类默认访 问自己的成员 变量或方法, 如果要访问外 部类的成员变 量,可以使用 this 关键字

静态内部类·静态内部类是static修饰的内部类,特点:,1、静态内部类不能直接访问外部类的非静态成员但可以通过new外部类().成员的方式访问2、如果外部类的静态成员与内部类的成员名称相同,可通过“类名.静态成员”访问外部类的静态成员;如果外部类的静态成员与内部类的成员名称不相同,则可通过“成员名”直接调用外部类的静态成员创建静态内部类的对象时,不需要外部类的对3、1象,可以直接创建:内部类对象名=new 内部类();
静态内部类 • 静态内部类是static 修饰的内部类,特点: • 1、 静态内部类不能直接访问外部类的非静态成员, 但可以通过new 外部类().成员的方式访问 • 2、 如果外部类的静态成员与内部类的成员名称相 同,可通过“类名.静态成员”访问外部类的静态成 员;如果外部类的静态成员与内部类的成员名称不 相同,则可通过“成员名”直接调用外部类的静态 成员 • 3、 创建静态内部类的对象时,不需要外部类的对 象,可以直接创建:内部类 对象名= new 内部类();

静态内部类使用举例//外部类public class souter (private int a =99//外部类的私有变量staticintb=1://外部类的静态变量//静态内部类public static class sInner (int b =2;/ /内部类的变量public void test()System.out.println("访问外部类中的b:"+souter.b);System.out.println("访问内部类中的b:"+b);7子//测试静态内部类public static void main(string[l args) (SInner si =new SInner());//直接创建内部类的对象si.test()://调用test方法7子
静态内部类 使用举例

方法内部类·方法内部类就是内部类定义在外部类的方法中,方法内部类只在该方法的内部可见即只在该方法内可以使用。·注意:由于方法内部类不能在外部类的方法以外的地方使用,因此方法内部类不能使用访问控制符和static修饰符
方法内部类 • 方法内部类就是内部类定义在外部类的方 法中,方法内部类只在该方法的内部可见, 即只在该方法内可以使用。 • 注意:由于方法内部类不能在外部类的方 法以外的地方使用,因此方法内部类不能 使用访问控制符和static 修饰符

//外部类public class Mouterf/外部类中的方法public void show(){final int a=25;//常量intb=13;//变量//方法内部类class MInnerintC=2;//内部类中的变量public void print()(System.out.println("访问外部类的方法中的常量a:"+a);System.out.println("访问内部类中的变量c:"+c);1MInner mi=new MInner();//创建方法内部类的对象mi.print();//调用内部类的方法子//测试方法内部类public static void main(Stringll args) (Mouter mo=newMOuter();//创建外部类的对象mo.show://调用外部类的方法一

名内部类·没有名字的内部类,通常此类型内部类只使用一次。匿名内部类在创建时,必须作为new语句的一部分来声明,这就要采用另一种特殊形式的new语句。·语法:一这种形式的new语句声明一个新的匿名类,它对一个给定的类进行扩展,或者实现一个给定的接口,同时还创建那个类的一个新实例,并把它作为语句的结果而返回
匿名内部类 • 没有名字的内部类,通常此类型内部类只使用 一次。 • 匿名内部类在创建时,必须作为new 语句的 一部分来声明,这就要采用另一种特殊形式的 new 语句。 • 语法 : – 这种形式的new 语句声明一个新的匿名类,它对 一个给定的类进行扩展,或者实现一个给定的接口, 同时还创建那个类的一个新实例,并把它作为语句 的结果而返回