`

静态内部类与非静态内部类比较

阅读更多

最近复习了一下内部类的相关知识
以前基础文章中有介绍过内部类的相关知识及在外部类和其它类中访问内部类的方法
现贴出两个测试实例如下:
例一:内部类声明为static时

  1. package com.bytecode.openexcel.util;

  2. public class TestStaticInnerClass {

  3.     private String name = "lsfslfs";        //Member variable
  4.     public static int num = 3;              //static Member variable
  5.     
  6.     public static class InnerClass{         //static innerclass
  7.         private String name = "sfeee";      //inncerclass Member variable
  8.         private int num = 4;                //inncerclass Member variable
  9.     
  10.         public void getStr(){
  11.             String name = "ddd";            
  12.             System.out.println(name);       //Visit local variable
  13.             System.out.println(this.name);  //Visit innerclass member variable
  14.             //System.out.println(TestInnerClass.this.name); //couldn't visit not static outclass member variable
  15.             System.out.println(TestStaticInnerClass.num); //visit out class static member variable
  16.             getMn();    //visit out class static method
  17.             //getString(); couldn't visit out class not static method
  18.         }
  19.     }

  20.     public void getString(){
  21.         InnerClass ins = new InnerClass();
  22.         ins.getStr();//out class's method visit static innerclass method
  23.         getMn();    //visit outclass static method
  24.         getDe();    //visit outclass not static method
  25.         System.out.println(num);//visit outclass static member variable
  26.         System.out.println(name);//visit outclass not static member variable

  27.     }
  28.     
  29.     public void getDe(){
  30.         System.out.println("this date");
  31.     }
  32.     
  33.     public static void getMn(){
  34.         System.out.println("static method");
  35.     }
  36.     
  37.     public InnerClass getInner(){
  38.         return new InnerClass(); 
  39.     }
  40.     
  41.     public static void main(String[] args) {
  42.         
  43.         // method one to create innerclass object in outclass
  44.         InnerClass ins = new InnerClass();
  45.         ins.getStr();
  46.         
  47.         // method two to create innerclass object in outclass
  48.         TestStaticInnerClass ts = new TestStaticInnerClass();
  49.         InnerClass ins2 = ts.getInner();
  50.         ins2.getStr();
  51.     }
  52.     

  53. }

  54. class View{
  55.     
  56.     public static void main(String[] args){
  57.         
  58.         // method one to create innerclass object in other class
  59.         TestStaticInnerClass.InnerClass ind = new TestStaticInnerClass.InnerClass();
  60.         ind.getStr();
  61.         //visit outclass.innerclass's method as the innerclass has been declared static
  62.         
  63.         // method two to create innerclass object in other class
  64.         TestStaticInnerClass out = new TestStaticInnerClass();
  65.         TestStaticInnerClass.InnerClass ind2 = out.getInner();
  66.         ind2.getStr();
  67.         
  68.     }
  69. }


上面演示了分别在外部类TestStaticInnerClass 的main方法及其它类View中的两种方法实例化内部类并访问内部类的方法的情况。第一种方法是通过外部类中提供的方法返回内部类InnerClass的实例;第二种方法则通过实例化的外部类引用out直接实例化内部类实例ind2再调用方法getStr;

例二:
内部类声明为非static时

  1. package com.bytecode.openexcel.util;

  2. import com.bytecode.openexcel.util.TestStaticInnerClass.InnerClass;

  3. public class TestNoStaticInnerClass {

  4.     private String name = "lsfslfs"// Member variable
  5.     public static int num = 3; // static Member variable

  6.     public class InnerClass2 { // not static innerclass
  7.         private String name = "sfeee"// inncerclass Member variable
  8.         private int num = 4; // inncerclass Member variable

  9.         public void getStr() {
  10.             String name = "ddd";
  11.             System.out.println(name); // Visit local variable
  12.             System.out.println(this.name); // Visit innerclass member variable
  13.             System.out.println(TestNoStaticInnerClass.this.name);  // visit out class not static member variable
  14.             System.out.println(TestNoStaticInnerClass.num); // visit out class static member variable
  15.                                                             
  16.             getMn(); // visit out class static method
  17.             getString(); //could  visit out class not static method
  18.         }
  19.     }

  20.     public void getString() {
  21.         InnerClass2 ins = new InnerClass2();
  22.         ins.getStr();// out class's method visit innerclass method
  23.         getMn(); // visit outclass static method
  24.         getDe(); // visit outclass not static method
  25.         System.out.println(num);// visit outclass static member variable
  26.         System.out.println(name);// visit outclass not static member variable

  27.     }

  28.     public void getDe() {
  29.         System.out.println("this date");
  30.     }

  31.     public static void getMn() {
  32.         System.out.println("static method");
  33.     }

  34.     public InnerClass2 getInner() {
  35.         return new InnerClass2();
  36.     }

  37.     public static void main(String[] args) {

  38.         // method one to create innerclass object in outclass
  39.         TestNoStaticInnerClass tss = new TestNoStaticInnerClass();
  40.         InnerClass2 ins = tss.new InnerClass2();
  41.         ins.getStr();

  42.         // method two to create innerclass object in outclass
  43.         TestNoStaticInnerClass ts = new TestNoStaticInnerClass();
  44.         InnerClass2 ins2 = ts.getInner();
  45.         ins2.getStr();
  46.     }

  47. }

  48. class View2 {

  49.     public static void main(String[] args) {

  50.         // method one to create innerclass object in other class
  51.         TestNoStaticInnerClass tss = new TestNoStaticInnerClass();
  52.         TestNoStaticInnerClass.InnerClass2 ind= tss.new InnerClass2();
  53.         ind.getStr();
  54.         // visit outclass.innerclass's method as the innerclass has not been declared static

  55.         // method two to create innerclass object in other class
  56.         TestNoStaticInnerClass out = new TestNoStaticInnerClass();
  57.         TestNoStaticInnerClass.InnerClass2 ind2 = out.getInner();
  58.         ind2.getStr();

  59.     }
  60. }

注意两个示例的区别:两个示例中通过第一种方法调用getStr方法基本相同,但第二种方法时有所不同,比较两个类中的main方法就一切明白了:
main1:

  1. // method one to create innerclass object in other class
  2.         TestStaticInnerClass.InnerClass ind = new TestStaticInnerClass.InnerClass();
  3.         ind.getStr();
  4.         //visit outclass.innerclass's method as the innerclass has been declared static
  5.         
  6.         // method two to create innerclass object in other class
  7.         TestStaticInnerClass out = new TestStaticInnerClass();
  8.         TestStaticInnerClass.InnerClass ind2 = out.getInner();
  9.         ind2.getStr();

main2:

  1. // method one to create innerclass object in other class
  2.         TestNoStaticInnerClass tss = new TestNoStaticInnerClass();
  3.         TestNoStaticInnerClass.InnerClass2 ind= tss.new InnerClass2();
  4.         ind.getStr();
  5.         // visit outclass.innerclass's method as the innerclass has not been declared static

  6.         // method two to create innerclass object in other class
  7.         TestNoStaticInnerClass out = new TestNoStaticInnerClass();
  8.         TestNoStaticInnerClass.InnerClass2 ind2 = out.getInner();
  9.         ind2.getStr();

值得注意的是上面两例中在外部类的方法getString中都直接实例化了内部类,再访问内部类的方法,而在外部类的main方法和其它类view中实例化内部类才需先实例化一个外部类再通过外部类的引用实例化内部类再调用方法。如上面两个示例代码中
以下方法内容完全一样:

  1. public void getString(){
  2.         InnerClass ins = new InnerClass();
  3.         ins.getStr();//out class's method visit static innerclass method
  4.         getMn();    //visit outclass static method
  5.         getDe();    //visit outclass not static method
  6.         System.out.println(num);//visit outclass static member variable
  7.         System.out.println(name);//visit outclass not static member variable

  8.     }


分享到:
评论

相关推荐

    浅谈内部类与静态内部类的应用

    与普通成员内部类不同,静态内部类不持有对外部类的引用,因此不能直接访问外部类的非静态成员。静态内部类需要通过外部类名.静态内部类名的方式来创建对象,这与访问任何其他静态成员的方式相同。这种特性使得静态...

    静态内部类

    根据内部类是否声明为static,它们被分为非静态内部类(也称为成员内部类)和静态内部类。 #### 二、静态内部类的特点 静态内部类具有以下特点: 1. **独立性**:静态内部类与外部类之间没有依赖关系,即使外部类...

    Handler对象中使用匿名内部类或非静态内部类正确地释放消息避免内存泄漏或增加Native内存

    然而,不当使用Handler,尤其是结合匿名内部类或非静态内部类,可能导致内存泄漏和Native内存增加,这对应用性能和稳定性造成负面影响。 首先,我们要理解内存泄漏的概念。内存泄漏是指程序中已分配的内存没有被...

    深入浅析Java中Static Class及静态内部类和非静态内部类的不同

    这种类的声明前面带有`static`关键字,与普通的内部类(非静态内部类)有所不同,它们在使用和行为上存在显著的差异。 首先,让我们来探讨一下静态内部类与非静态内部类的主要区别: 1. **引用关系**: - 静态...

    java 静态内部类的使用规范

    Java语言中的静态内部类,也称为嵌套类,是内部类的一种特殊形式,它与非静态内部类(也称为成员内部类)相比有着独特的特点和使用场景。在深入探讨其使用规范之前,我们先理解静态内部类的基本概念。 静态内部类不...

    java静态内部类(嵌套类)

    2. **不能访问外部类的非静态成员**:由于静态内部类与外部类的静态属性和方法处于相同的静态上下文中,因此静态内部类无法访问外部类的非静态成员变量或方法。 3. **命名空间独立**:静态内部类有自己的命名空间,...

    java代码笔记2010-06-01:Java内部类 静态内部类 局部内部类 明明内部类;StringBuffer reverse的使用;

    内部类可以分为四种类型:静态内部类、成员内部类(非静态内部类)、局部内部类和匿名内部类。 1. **静态内部类**: 静态内部类与普通的成员内部类不同,它不持有对外部类的引用。因此,可以像其他静态成员一样,...

    内部类的相关知识-静态内部类,匿名内部类……

    与静态内部类不同的是,非静态内部类依赖于外部类的实例。因此,创建非静态内部类实例时,必须首先创建一个外部类的实例。 ##### 3.1 创建实例内部类 创建非静态内部类实例通常需要以下步骤: 1. 定义外部类。 2....

    Java中的静态内部类详解及代码示例

    静态内部类与其它内部类的区别在于非静态内部类在编译完成之后会隐含地保存一个引用,该引用是指向创建它的外部类,但是静态内部类却没有。静态内部类只是嵌套在外部类中,因此也被称为嵌套内部类。 静态内部类的...

    Java SE 静态内部类的使用(csdn)————程序.pdf

    Java SE中的静态内部类是一种特殊的内部类,它与非静态内部类(也称为成员内部类)有着显著的区别。静态内部类并不需要外部类的实例来创建它的对象,而是可以直接通过类名进行实例化,就像普通的类一样。在给定的...

    Java内部类应用之静态内部类应用示例

    因此,静态内部类可以包含静态成员,也可以包含非静态成员。 二、静态内部类的访问规则 静态内部类不能访问外部类的实例成员,只能访问外部类的类成员。即使是静态内部类的实例方法也不能访问外部类的实例成员,...

    Java 深入理解嵌套类和内部类

    非静态嵌套类也即内部类,是指在一个类的内部定义的非静态嵌套类。非静态嵌套类可以访问外部类的所有成员变量和方法,包括私有成员变量和方法。例如,在上面的代码中,非静态嵌套类 Inner 可以访问外部类的成员变量 ...

    内部类分类及应用

    静态嵌套类可以访问外部类的静态成员变量,但不能访问非静态成员变量。静态嵌套类可以独立于外部类实例化,可以使用外部类的名称和$符号来访问静态嵌套类。 三、方法内部类 方法内部类是指定义在方法中的内部类。...

    内部类与异常类.doc

    内部类可以分为两种:静态内部类和非静态内部类。 1. 静态内部类 静态内部类是指在一个静态上下文中定义的内部类。静态内部类可以访问外部类的静态成员变量和方法,但不能访问非静态成员变量和方法。静态内部类的...

    从零开始学JAVA第12章_内部类.ppt

    内部类可以分为非静态内部类、局部内部类、静态内部类和匿名内部类四种。 非静态内部类是指定义在另一个类的非静态成员中的类。非静态内部类可以访问外部类的成员变量和成员方法,同时也可以被外部类访问。在外部类...

    Java4Android 35_内部类和匿名内部类

    - 静态内部类可以独立于外部类对象存在,但非静态内部类不能。 - 内部类可以访问外部类的所有成员,包括私有成员,这是因为内部类对象拥有对外部类对象的隐式引用。 - 匿名内部类不能包含静态成员(除了final static...

    java内部类详解

    静态内部类与普通的类类似,只是它们定义在外部类中,并且前面带有 `static` 关键字。它们不会隐含持有外部类的引用,因此无法直接访问外部类的非静态成员。静态内部类可以看作是外部类的静态成员,与外部类的其他...

    java内部类总结(含概念和实例)

    * 静态内部类不能访问外部类的非静态成员 匿名内部类的特点: * 匿名内部类是指没有名字的内部类 * 匿名内部类通常用在创建实例时使用 * 匿名内部类可以访问外部类的所有成员 在 Java 中,内部类是一种非常重要的...

    JAVA内部类总结

    3. **外部类访问静态内部类**:静态内部类可以通过“外部类.静态内部类”的方式创建对象实例。 4. **静态内部类成员**:静态成员内部类的成员变量和方法都是静态的。 #### 四、局部内部类 局部内部类是在方法或...

    java 内部类 局部内部类 匿名类 实例代码

    静态内部类不能直接访问外部类的非静态成员,但可以通过外部类的实例来访问。以下是一个静态内部类的例子: ```java public class Outer { private static int outerStaticValue = 200; static class Static...

Global site tag (gtag.js) - Google Analytics