内部类

来源:互联网 发布:手机环境监控软件 编辑:程序博客网 时间:2024/06/05 19:29
  • 内部类

    内部类可以直接访问外部类的成员
    外部类想要访问外部类的成员,先需要实例化内部对象也就是(new内部对象)

  • 成员内部类

Outer.Inner inner=new Outer().new Inner()

成员内部类持有外部类对象的引用
* 我的理解:(外部类对象可以引用成员内部类)
要想有成员内部类对象,先要有外部类对象

先创建一个Net类

public class Net {    UI ui;    public void setUi(UI ui){        this.ui = ui;    }    public void loadData( ){        String str="Hello wrold";        ui.updateUI(str);    }}

然后再创建UI类

public class UI {    public void updateUI(String str){        System.out.println("正在更新"+str);    }    class Net{        public void loadData(){        }    }}

UI类里面有Net内部类
再创建一个测试类Test

public class Test {    public static void main(String[] args) {        UI ui=new UI();        Net net=new Net();        net.setUi(ui);        net.loadData();    }}

输出结果为:正在更新Hello wrold
成员内部类可能出现内存泄漏的问题,内存越用越少,有些对象没有释放完毕。(如果你想释放外部类对象,但是成员内部类持有外部对象的引用。因此回收不了。)

  • 静态内部类
    静态内部类不需要有外部类对象,静态内部类不持有外部类的引用,静态内部类不能访问外部的非静态成员,但是可以通过new()外部类 .成员的方法访问

创建静态内部类

public class HelloWorld {   private int dynamic_score = 77;public static class SInner {   int score = 91;public void show() {System.out.println("访问外部类中的非静态变量dynamic_score:" +  new HelloWorld().dynamic_score);System.out.println("访问内部类中的score:" + score);}}

测试静态内部类

public static void main(String[] args) {        // 直接创建内部类的对象        SInner si = new SInner();           // 调用show方法        si.show();}}

输出结果:
访问外部类中的非静态变量dynamic_score:77
访问内部类中的score:91

  • 匿名内部类
    匿名内部类最长用:
Net net=new Net(){loadDate(){}};BufferedReader br=new BufferedReader(new FileReader(""));

注意事项:
1、匿名内部类中是不能定义构造函数的。
2、匿名内部类中不能存在任何的静态成员变量和静态方法。
3、匿名内部类不能是抽象的,它必须要实现继承的类或者实现的接口的所有抽象方法。
4、没有抽象方法的抽象类。

这里定义了一个人吃的抽象方法要想在抽象类中使用匿名内部类,必须实现一个继承或者一个接口abstract class Person {    public abstract void eat();}class Child extends Person {    public void eat() {        System.out.println("eat something");    }}public class Demo {    public static void main(String[] args) {        Person p = new Child();        p.eat();    }}

输出结果为:
eat something

  • 局部内部类
    写在方法中的,一般来说,需要返回对象,之后想什么时候调用就什么时候调用。
    在局部内部类访问方法中的变量的时候,变量需要是final的,(常量)如果不定义成final的,变量就会随着方法的结束从栈内存消失、导致局部内部类不能访问局部变量。
体现局部内部类的代码class Out {    private int age = 12;    public void Print(final int x) {        class In {            public void inPrint() {                System.out.println(x);                System.out.println(age);            }        }        new In().inPrint();    }}
final int x 由上面代码可知: 局部内部类访问方法中的变量的时候,变量需要是final修饰的 
测试类public class Demo {    public static void main(String[] args) {        Out out = new Out();        out.Print(3);    }}

运行结果为:
3
12
在上面的代码中,我们将内部类移到了外部类的方法中

内部类移到了外部类public void Print(final int x) {        class In {在外部类的方法中再生成一个内部类对象去调用内部类方法main方法中的:out.Print(3);

注意事项:
1、此类不能使用public、private修饰。
2、其作用域被限定在声明此类的方法中。
3、和其他内部类相比,它具有可以访问方法参数的优点。
4、被局部内部类使用的方法参数必须是final的。
5、局部类只能访问(使用)这个块中(局部类外)final属性。这里的块包括了上面说的块、构造器、方法。
6、在类外不可直接生成局部内部类,要想使用局部内部类时需要生成对象,对象调用方法,在方法中才能调用其局部内部类。