Java 四大内部类 总结

(成员)内部类-常用


特点:可以把内部类当作是外部类的一个【成员】
  • 同外部类的成员一样,内部类可被private、protected等权限修饰符修饰
  • 同外部类的成员一样,private修饰的内部类仅对外部类是可见的【public Inner in=new Inner();】,对外部类以外的地方不可见
  • 同外部类的成员一样,内部类中也可以访问外部类的private成员(当然包括static成员)
  • 同外部类的成员不一样的是,成员内部类中不能定义静态变量(否则就要定义为静态内部类),但是可以定义 static final 变量(即常量)
  • 同外部类的成员不一样的是,编译完成后,内部类会被编译成一个独立的类【Outer$Inner.class】,而不是Outer类的一个域

特殊使用场合: 通过使用内部类可以间接实现多继承,可以解决实现的多个接口之间,或继承的类与接口之间方法同名的冲突
例如 class Robot extends People implement Machine { } 而若 class People 和 interface Machine 都有一个同名的方法 run()  此时若按以上结构是无法区分 Robot 中的 run() 到底是继承的还是实现的 此时的解决方式为:让 Robot 仅继承或仅实现,再在 Robot 中定义一个内部类仅实现或仅继承即可

外部类访问内部类的方式:
  • 1.1、在外部类及其[非静态]方法中可以直接访问内部类【 new Inner().内部类的成员】
  • 1.2、在外部类的[静态]方法中需要先创建外部类对象,才访问内部类【new Outer(). new Inner().内部类的成员】
  • 1.3、其他地方访问内部类也是【new Outer(). new Inner().内部类的成员】
内部类访问外部类的方式:
  • 2.1、外部类的成员变量如果和内部类的变量不同名,则内部类可直接用【变量名】访问外部类的成员变量
  • 2.2、若同名,则内部类可用【Outer.this.变量名】来访问外部类的实例变量(注意不是Outer.Inner.变量名)
  • 2.3、在内部类中直接用【变量名】或【this.变量名】访问的都是内部类自己的实例变量

// 外部类之外的其他类 class InnerClassDemo {     public static void main(String[] args) {         new Outer().new Inner().innerSpeak(); //1.3、其他地方访问内部类     } }
//外部类 class Outer {     private static int age = 1;     private String name = "外部类";     private Inner ooo = new Inner(); //1.1、在外部类中可以直接访问内部类     public void method() {         new Inner().innerSpeak(); //1.1、在外部类的非静态方法中可以直接访问内部类     }     public static void method2() {         new Outer().new Inner().innerSpeak();//1.2、在外部类的静态方法中访问内部类     }
    //内部类     class Inner {         private String name = "普通内部类";         void innerSpeak() {             System.out.println(age++ + "..." + name); //2.1、不同名,可直接用变量名访问外部类的成员变量         }         void hello() {             String name = "局部变量";             System.out.println(Outer.this.name + "..." + this.name + "..." + name); //2.2、同名,可用Outer.this.变量名 访问             }     } }

静态内部类-较麻烦


特点:可以把静态内部类当作外部类的一个【静态成员】
  • 和静态成员一样,静态内部类用 static 定义,可以用 public,protected,private修饰
  • 和静态成员一样,静态内部类随着外部类的加载而产生,可以用外部类类名+静态成员名直接获得
  • 和静态方法不一样的是,静态内部类中可以定义静态的也可以定义非静态的成员

外部类访问内部类方式:
  • 1.1、外部类可以直接访问静态内部类【 new Inner().静态内部类的成员】
  • 1.2、外部类的[静态和非静态]成员都可以用【Outer.Inner.成员】访问内部类的[静态]成员
  • 1.3、外部类的[静态和非静态]成员都可以用【new Outer.Inner().成员】访问内部类的[非静态]成员
  • 1.4、其他地方访问内部类可用【new Outer.Inner().成员】,其中访问静态成员还可以用【Outer.Inner.成员】
内部类访问外部类方式:
  • 2.1、若内部类的[静态和非静态]成员和外部类的[静态]成员不同名,可以直接用【成员名】访问
  • 2.2、同名时,内部类的[静态和非静态]成员可以用【Outer.成员】访问外部类的[静态]成员
  • 2.3、内部类的[静态和非静态]成员可以用【new Outer().成员】访问外部类的[非静态]成员

// 外部类之外的其他类 class InnerClassDemo {     public static void main(String[] args) {         new Outer.Inner2().innerSpeak(); //1.4         new Outer.Inner2().innerSpeak2(); //1.4        Outer.Inner2.innerSpeak(); //1.4     } }
//外部类 class Outer {     private static int age = 1;     private String name = "外部类";    private Inner2 ooo = new Inner2(); //1.1     public void method() {       new Inner2().innerSpeak();//1.1       new Outer.Inner2().innerSpeak(); //1.1       Outer.Inner2.innerSpeak();//1.2             new Outer.Inner2().innerSpeak2(); //1.3     }
    //静态内部类     static class Inner2 {         private static String name = "静态内部类";         static void innerSpeak() {            System.out.println(age + "..." + Outer.age + "..." + name + "..." + new Outer().name);//2.1、2.2、2.3         }         void innerSpeak2() {             System.out.println("静态内部类的非静态方法");         }     } }

匿名内部类-最简单


典型使用场景:
  • 若一个类继承于某个类(不般是一个抽象类),或是实现了某个接口,那么此类一般是需要重写或实现某些抽象方法的
  • 除此之外,若此类并不需要增加额外的成员,且我们不需要知道此类的实际类型(只是为了获得一个对象,且用完之后没有任何一个地方会再用到),则适合使用匿名内部类
 注意:
  • 匿名内部类是唯一一种【无构造方法类】,匿名内部类中不能定义构造方法
  • 匿名内部类在编译的时候由系统自动起名Out$1.class

常用格式一(单一引用):         new Fu() {    //或接口             void show(){} //子类【重写或隐藏】的父类的方法         }.show();
常用格式二(多引用):         Fu f = new Fu() {             void show1(){}             void show2(){}         };         f.show1();         f.show2();
常用格式三(参数传递):    obj.show(new InterfaceDemo(){ //函数参数是接口类型         public void show1(){}   //接口中的方法通常不超过2个         public void show2(){}     });

局部内部类-不常用


特点:可以把局部内部类当作外部类方法中的一个局部变量
  • 与局部变量一样,局部内部类是在方法(当然可以是静态方法)中定义的
  • 与局部变量一样,局部内部类只能在其所在方法中使用,且不能被public、static等修饰
  • 与局部变量一样,只有定义局部内部类之后的代码,才可访问局部内部类(即先定义后使用)
  • 与局部变量一样,局部内部类可以访问外部类的任何成员
  • 与局部变量不一样的是,局部内部类中不可定义静态变量(不管外部方法是不是静态的)
  • 与局部变量不一样的是,局部内部类只能访问 final 修饰的局部变量(也即只能访问常量)
外部类不能访问局部内部类 内部类访问外部类的方式:
  • 1.1、局部内部类的变量若和外部类的成员变量不同名,则可直接用【变量名】访问外部类的成员
  • 1.2、若同名,则局部内部类可用【Outer.this.变量名】来访问外部类的成员
  • 1.3、在局部内部类中可以直接用【变量名】或【this.变量名】来访问内部类自己的成员

// 外部类之外的其他类 class InnerClassDemo {     public static void main(String[] args) {         new Outer().method(3);     } }
// 外部类 class Outer {     private int s = 1;     private static int o = 2;     private static int oo = 3;     public void method(final int k) {         final int s = 100;         final int oo = 200;         int i = 300;         //局部内部类         class Inner {             Inner(int k) {                 method();//我是外部类的方法                 System.out.println(o);//2                 System.out.println(oo);//200                 System.out.println(s);//100                 System.out.println(Outer.this.s);//1                 //System.out.println(i);//错误             }         }         new Inner(k);     }     private void method() {         System.out.println("我是外部类的方法");     } }

来自为知笔记(Wiz)

时间: 2024-10-07 17:22:35

Java 四大内部类 总结的相关文章

java 四大内部类-----转载

(成员)内部类-常用 特点:可以把内部类当作是外部类的一个[成员] 同外部类的成员一样,内部类可被private.protected等权限修饰符修饰 同外部类的成员一样,private修饰的内部类仅对外部类是可见的[public Inner in=new Inner();],对外部类以外的地方不可见 同外部类的成员一样,内部类中也可以访问外部类的private成员(当然包括static成员) 同外部类的成员不一样的是,成员内部类中不能定义静态变量(否则就要定义为静态内部类),但是可以定义 sta

Java的内部类

提起Java内部类(Inner Class)可能很多人不太熟悉,实际上类似的概念在C++里也有,那就是嵌套类(Nested Class),关于这两者的区别与联系,在下文中会有对比.内部类从表面上看,就是在类中又定义了一个类(下文会看到,内部类可以在很多地方定义),而实际上并没有那么简单,乍看上去内部类似乎有些多余,它的用处对于初学者来说可能并不是那么显著,但是随着对它的深入了解,你会发现Java的设计者在内部类身上的确是用心良苦.学会使用内部类,是掌握Java高级编程的一部分,它可以让你更优雅地

JAVA的内部类学习总结

这几天看书,开始在前面看到了JAVA的内部类,开始以为往后看,可以看懂,结果看到了时间监听那里也没有看懂. 再说自己写JAVA代码有个毛病,可能是写C++和C语言写多了,就是喜欢把每一个类都单独的写在一个文件里面. 根本就不存在嵌套或者是一个文件写有几个类的问题. 接下俩给大家总结内部类的含义,以及使用. 这里还分享几个不错的博客: http://www.cnblogs.com/nerxious/archive/2013/01/24/2875649.html http://android.blo

java:内部类

内部类定义方法: class A { class B { } } 编译后将生成:A.class 和 A$B.class 内部类B可以使用外部类A的成员变量和成员属性 生成内部类对象: 先生成外部类对象.再生成内部类 class Test { public static void main(String args[]){ A a = new A(); A.B b = new A().new B(); // 或 a.new B(); } } 匿名内部类:没有名字 interface A { publ

Java面向对象㈢ -- 内部类

内部类必须要依赖于继承或实现一个接口.内部类可以实现Java多继承,内部类访问外表类的局部变量或参数时,则该局部变量或参数必须被final修饰.内部类不能包含有static的变量和方法,原因是因为内部类依赖于外部类,它才能创建自己.内部类可以任意的访问外部类的成员,即使以private修饰,内部类需要通过外部类来访问.内部类的形式可以有继承,实现和参数式.访问外部类时使用外部类名.this.内部类编译后文件名是外部类$内部类.同时还有一个匿名内部类,直接new()加所要使用的函数.内部类可以出现

黑马程序员——java基础——内部类

 黑马程序员--java基础--内部类 ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 内部类 如果A类需要直接访问B类中的成员,而B类又需要建立A类的对象.这时,为了方便设计和访问,直接将A类定义在B类中.就可以了.A类就称为内部类.内部类可以直接访问外部类中的成员.而外部类想要访问内部类,必须要建立内部类的对象. 内部类的访问规则 1,内部类可以直接访问外部类中的成员,包括私有. 之所以可以直接访问外部类中的成员,是因为内部类中持有

java中内部类的创建四种情况,三种方式,及内部数据访问权限

内部类和外部类的关系,及内部静态类的数据访问权限,声明方式. 第一种,在外部类内部声明使用内部类,内部类的类型为static和非 static类型,内部类数据类型为private,protected,public 类型的访问权限.外部类为非静态声明和权限如下: package com; public class Test1 { //@author 张春蕾 private class Name{ private int i =1; public int s = 2; protected int m

Java中内部类

内部类的规则: 1.内部类可以直接访问外部类中的成员,包括私有. 之所以可以直接访问外部类中的成员,是因为内部类中持有一个外部类的引用,格式:外部类名.this 2.外部类要访问内部类,必须建立内部类对象 访问格式: 1.当内部类定义在外部类的成员位置了,而且非私有,可以在外部其他类中. 可以直接建立内部类对象. 格式: 外部类类名.内部类名  变量名= new 外部类对象.new 内部类对象. Outer.inner out = new Outer().new inner(); 2.当内部类在

java:内部类与外部类的区别和联系

注意事项一:在内部类中可以随意使用外部类的成员方法以及成员变量. 众所周知,在定义成员方法或者成员变量的时候,可以给其加上一些权限的修饰词,以防止其他类的访问.如在成员变量或者成员方法前面,加上Private 关键字,则其他类就无法调用这个类中的成员方法或则和成员变量.但是,如果这个类有成员内部类,则不受这方面的限制.也就是说,在成员内部类中可以随意引 用外部类的成员方法以及成员变量,即使这些类成员方法或者成员变量被修饰了private.如在成员外部类中定义了一个i变量,并且利用private关