您的位置:首页 > 编程语言 > Java开发

内部类与嵌套类

2017-04-12 10:32 155 查看
转载自:从头认识java嵌套类

1.概念

内部类使用static的时候就是嵌套类。

[java] view
plain copy

package com.ray.ch07;  

  

public class Test {  

    private static class MyTest3{}  

      

}  

MyTest3就是嵌套类

2.注意点

(1)只能跟外部类的static部分进行通信

(2)不在持有外部类对象的引用,可以直接使用static特性

[java] view
plain copy

package com.ray.ch07;  

  

public class Test {  

    private int id = 1;  

    private static String name = "aaa";  

  

    private static class MyTest1 {  

        public void say() {  

            // System.out.println(id);//error  

            System.out.println(name);  

        }  

    }  

  

    private class MyTest2 {  

        public void say() {  

            System.out.println(id);  

            System.out.println(name);  

        }  

    }  

  

    public static void main(String[] args) {  

        // new Test().new MyTest1();//error.  

        new Test.MyTest1().say();  

        new Test().new MyTest2();  

    }  

}  

从上面的代码可以看见,MyTest1是不能够访问id,而MyTest2可以。

还有,在new的时候,我们可以看见,MyTest1具备了static的特性,不需要new,但是还是需要多加一个括号,而MyTest2则需要new才能调用里面的方法。

(3)嵌套类没有this这引用

因为嵌套类使用了static,因此不能使用this来引用外部类。

(4)使用场景

一个比较常见的使用场景就是跟main函数结合。

因为在发布项目的时候通过只是发布有用的代码,像测试等代码都不发布的,那么现在这个就比较有用了。

我们来对比一下下面的这两组代码:

[java] view
plain copy

package com.ray.ch08;  

  

public class Test {  

      

    public static void main(String[] args) {  

          

    }  

  

}  

[java] view
plain copy

package com.ray.ch08;  

  

public class Test {  

    private void say() {  

        System.out.println("abc");  

    }  

  

    public static class Tester {  

        public static void main(String[] args) {  

            Test test = new Test();  

            test.say();  

        }  

    }  

  

}  

上面两组代码的功能是一样的,但是生成的文件却有区别。

第一个代码只会生成一个Test.class

但是第二个会生成两个文件Test.class和Test$Tester.class,我们只需要在发布到时候把第二个文件删除,那么这些测试的代码就删掉了,这样比较方便。

个人补充:

内部类中不能定义静态成员(静态成员类似于C语言的全局变量,而内部类通常是用于创建内部对象的。所以,把“全局变量”放在内部类是不正确的)

比如,下面的代码:

class Persion1
{
class Persion2
{
private static String string="";
public static void Set() {

}
}
}
Persion2类中的string变量,Set()方法的定义都是不允许有static修饰的,都必须把static去掉。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 嵌套类 内部类