Java static内部类疑惑

来源:互联网 发布:电信手机3g网络连不上 编辑:程序博客网 时间:2024/05/22 07:46

转自:用static关键字修饰类 

Java里面static一般用来修饰成员变量或函数。但有一种特殊用法是用static修饰内部类,普通类是不允许声明为静态的,只有内部类才可以。被static修饰的内部类可以直接作为一个普通类来使用,而不需实例一个外部类(见如下代码)

主要是比较 静态内部类 和 非静态内部类 的区别 代码走起

 

Java代码  收藏代码
  1. public class OuterClass {  
  2.     public static class InnerClass{  
  3.         InnerClass(){  
  4.             System.out.println("============= 我是一个内部类'InnerClass' =============");  
  5.         }  
  6.     }  
  7. }  

 

Java代码  收藏代码
  1. public class TestStaticClass {  
  2.     public static void main(String[] args) {  
  3.         // 不需要new一个OutClass  
  4.         new OuterClass.InnerClass();  
  5.     }  
  6. }  

 

 

如果没有用static修饰InterClass,则只能按如下方式调用:

 

 

 

Java代码  收藏代码
  1. package inner_class;  
  2.   
  3. public class OuterClass {  
  4.     public class InnerClass{  
  5.         InnerClass(){  
  6.             System.out.println("============= 我是一个内部类'InnerClass' =============");  
  7.         }  
  8.     }  
  9. }  

 

 

Java代码  收藏代码
  1. public class TestStaticClass {  
  2.     public static void main(String[] args) {  
  3.         // OutClass需要先生成一个实例  
  4.         OuterClass oc = new OuterClass();  
  5.         oc.new InnerClass();  
  6.     }  
  7. }  

 

//转载第二部分

     静态内部类和非静态内部类之间到底有什么不同呢?下面是两者间主要的不同。

    (1)内部静态类不需要有指向外部类的引用。但非静态内部类需要持有对外部类的引用。(这一点上面的代码已经表示了)

    (2)非静态内部类能够访问外部类的静态和非静态成员。静态类不能访问外部类的非静态成员。他只能访问外部类的静态成员。

这是两种内部类对于内部类的外嵌类的数据访问区别

    (3)一个非静态内部类不能脱离外部类实体被创建(这个跟第一点有些重复,个人感觉),一个非静态内部类可以访问外部类的数据和方法,因为它就在外部类里面。(这个跟第二点也有点重复

基于上面的讨论,我们可以通过这些特性让编程更简单、有效。

复制代码
/* 下面程序演示如何在java中创建静态内部类和非静态内部类 */class OuterClass{   private static String msg = "GeeksForGeeks";   // 静态内部类   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);       }    }} class Main{    // 怎么创建静态内部类和非静态内部类的实例    public static void main(String args[]){       // 创建静态内部类的实例       OuterClass.NestedStaticClass printer = new OuterClass.NestedStaticClass();       // 创建静态内部类的非静态方法       printer.printMessage();          // 为了创建非静态内部类,我们需要外部类的实例       OuterClass outer = new OuterClass();               OuterClass.InnerClass inner  = outer.new InnerClass();       // 调用非静态内部类的非静态方法       inner.display();       // 我们也可以结合以上步骤,一步创建的内部类实例       OuterClass.InnerClass innerObject = new OuterClass().new InnerClass();       // 同样我们现在可以调用内部类方法       innerObject.display();    }}
复制代码

 

参考链接

http://stackoverflow.com/questions/7486012/static-classes-in-java


作者:kissazi2 
出处:http://www.cnblogs.com/kissazi2/ 
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。


//转载第三部分(这里是讲的静态方法,也是第一部分的作者所作
Java中用static修饰符修饰的方法被称为静态方法,本文我们来看看Java中static静态方法的用法特点。Java的static静态方法是属于整个类的类方法。不用static修饰符限定的方法,是属于某个具体类对象的方法。static方法使用特点如下: 

  (1)引用这个方法时,可以使用对象名做前缀,也可以使用类名做前缀; 

 (2)static方法不能被覆盖,也就是说,这个类的子类,不能有相同名、相同参数的方法; 

 (3)static方法只能访问static方法,不能访问非static方法,但非static方法可以访问static方法; 

 (4)static方法只能访问static数据成员,不能访问非static数据成员,但非static方法可以访问static数据成员; 

 (5)main方法是静态方法。在Java的每个Application程序中,都必须有且只能有一个main方法,它是Application程序运行的入口点。 

 (6)static方法是属于整个类的,它在内存中的代码段将随着类的定义而分配和装载。而非static的方法是属于某个对象的方法,在这个对象创建时,在对象的内存中拥有这个方法的专用代码段; 


0 0
原创粉丝点击