Java 中的静态类

yufei       5 年, 6 月 前       11933

Java 语言中可以定义一个静态类吗?

答案是显而易见的:YES ,Java 语言存在静态类。

我们都知道,Java 语言中存在 静态变量 、存在 静态方法 、也存在 静态块。其实,Java 语言还存在 静态类

Java 语言中的静态类

Java 语言允许我们在一个类中定义另一个类。类中的类我们称之为嵌套类。而包含嵌套类的类,我们则称之为 外部类

Java 语言中,我们不能定义顶级的外部静态类。但我们可以定义静态的内部嵌套类。

也就是说,我们不能定义下面这中形式的静态类

public static class JavaTester
{
}

当我们可以在类中定义一个静态的嵌套类,比如

public class JavaTester
{
    static class NestedStaticClass
    {
    }
}

那么,你会不会有另一个疑问:静态和非静态的嵌套类有什么区别呢

对了,忘记说了,非静态嵌套类也被称为内部类

静态和非静态的嵌套类的区别

静态嵌套类和非静态嵌套类的区别好多条,我们陈述下几个主要的区别:

  1. 静态嵌套类使用时并不需要引用外部类。但非静态嵌套类 (内部类) 则必须引用外部类。

  2. 非静态嵌套类(内部类) 可以访问外部类的静态和非静态成员。但静态嵌套类只能访问到外部类的静态成员,不可以访问外部类的非静态成员(实例成员)。

  3. 非静态嵌套类(内部类) 不能单独实例化。必须先实例化外部类,才能实例化内部类。内部类可以引用外部类的数据和方法。因此,我们并不需要将外部类的引用传递给内部类的构造方法。这种机制,使得内部类更加简单明了。

范例

我们写一个范例来演示下静态嵌套类和非静态嵌套类的区别

public class JavaTester
{ 
   private static String msg = "简单教程,简单编程"; 

   // 静态嵌套类
   public static class NestedStaticClass{ 

       // 静态嵌套类只能访问外部类的静态成员  
       public void printMessage()
       { 

         // 如果将 msg 变量设为静态的,则下面的语句会报错
         System.out.println("Message from nested static class: " + msg);  
       } 
    } 

    // 非静态嵌套类,也称之为内部类
    public class InnerClass{ 

       // 嵌套类可以访问外部类的静态和非静态成员 
       public void display(){ 
          System.out.println("Message from non-static nested class: "+ msg); 
       } 
    } 

    // 如何创建静态嵌套类和内部类的实例?
    public static void main(String args[]){ 

       // 创建一个静态嵌套类的实例
       JavaTester.NestedStaticClass printer = new JavaTester.NestedStaticClass(); 

       // 调用静态嵌套类的成员方法 
       printer.printMessage();    

       // 为了创建一个内部类的实例,我们必须先创建一个外部类的实例
       // 然后再创建内部类的时候
       JavaTester outer = new JavaTester();         
       JavaTester.InnerClass inner  = outer.new InnerClass(); 

       // 调用内部类的非静态成员 
       inner.display(); 

       // 我们可以将上面的两步合并为一步 
       JavaTester.InnerClass innerObject = new JavaTester().new InnerClass(); 

       // 现在,我们可以调用内部类的方法
       innerObject.display(); 
    } 
}

编译运行以上代码,输出结果如下

[yufei@www.twle.cn java]$ javac JavaTester.java && java JavaTester
Message from nested static class: 简单教程,简单编程
Message from non-static nested class: 简单教程,简单编程
Message from non-static nested class: 简单教程,简单编程
目前尚无回复
简单教程 = 简单教程,简单编程
简单教程 是一个关于技术和学习的地方
现在注册
已注册用户请 登入
关于   |   FAQ   |   我们的愿景   |   广告投放   |  博客

  简单教程,简单编程 - IT 入门首选站

Copyright © 2013-2022 简单教程 twle.cn All Rights Reserved.