Java static内部类疑惑
Java里面static一般用来修饰成员变量或函数。但有一种特殊用法是用static修饰内部类,普通类是不允许声明为静态的,只有内部类才可以。被static修饰的内部类可以直接作为一个普通类来使用,而不需实例一个外部类(见如下代码)
主要是比较 静态内部类 和 非静态内部类 的区别 代码走起
- public class OuterClass {
- public static class InnerClass{
- InnerClass(){
- System.out.println("============= 我是一个内部类'InnerClass' =============");
- }
- }
- }
- public class TestStaticClass {
- public static void main(String[] args) {
- // 不需要new一个OutClass
- new OuterClass.InnerClass();
- }
- }
如果没有用static修饰InterClass,则只能按如下方式调用:
- package inner_class;
- public class OuterClass {
- public class InnerClass{
- InnerClass(){
- System.out.println("============= 我是一个内部类'InnerClass' =============");
- }
- }
- }
- public class TestStaticClass {
- public static void main(String[] args) {
- // OutClass需要先生成一个实例
- OuterClass oc = new OuterClass();
- oc.new InnerClass();
- }
- }
//转载第二部分
静态内部类和非静态内部类之间到底有什么不同呢?下面是两者间主要的不同。
(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的方法是属于某个对象的方法,在这个对象创建时,在对象的内存中拥有这个方法的专用代码段;
(1)引用这个方法时,可以使用对象名做前缀,也可以使用类名做前缀;
(2)static方法不能被覆盖,也就是说,这个类的子类,不能有相同名、相同参数的方法;
(3)static方法只能访问static方法,不能访问非static方法,但非static方法可以访问static方法;
(4)static方法只能访问static数据成员,不能访问非static数据成员,但非static方法可以访问static数据成员;
(5)main方法是静态方法。在Java的每个Application程序中,都必须有且只能有一个main方法,它是Application程序运行的入口点。
(6)static方法是属于整个类的,它在内存中的代码段将随着类的定义而分配和装载。而非static的方法是属于某个对象的方法,在这个对象创建时,在对象的内存中拥有这个方法的专用代码段;