关于内部类

来源:互联网 发布:java类的调用 编辑:程序博客网 时间:2024/06/05 14:10

在学习数据结构的过程中,我发现一些算法的实现(例如二叉树)创建一个类后,里面还包含了一个类,然后查了一下百度,发现这样的操叫做内部类。

   什么叫内部类?顾名思义是内部的类,即一个类在另一个类中,外部类需要与文件名字相同且外部类必须是用public或者default来限定,而内部类不需要与文件名相同且可以使用public,private,default,protected,并且内部了还可以是static(静态的)。内部类是一个编译时的概念,当编译成功了过后就是一个单独的类了。所以内部类的属性(域)和方法可以和它所在的外部类相同。

内部类可以大概分为四种:
1.成员内部类
2.局部内部类
3.嵌套内部类
4.匿名内部类

1.首先是成员内部类,其作为外部类的成员存在。所以内部类可以访问外部类的一切成员和方法(即使这个方法是私有的)。但是外部类若是想使用内部类的变量和方法则需要使用内部类的对象来获取。

一定要记住成员内部类不能含有静态变量和方法(不是绝对的)

public class InnerClassDemo {      class InnerClass{          //1、这样是可以的,这样编译器会在编译的时候就将这种语句变成常量值(也就是说可以定义所有的static final + 基本数据类型)          static final int i = 50;          //2、这样不可以,虽然也为static final 但是说到底还是个变量对象,所以不可以这样          static final String str = new String("");          //3、与上相同          static InnerClass innerClass = new InnerClass();      }  } //代码出自:http://blog.csdn.net/sinat_31311947/article/details/58588704

因为作为一个内部类,应该首先创建外部类然后才存在内部类。静态方法是在类被加载的时候就被初始化了,那么内部类也就被同时加载了,那么不要外部类就可以创建内部类对象了,因为成员内部类是外部类的成员,内部类的创建必须依赖于外部类。所以有了静态变量和方法就使得成员内部类脱离了外部类的掌控。这就违背了成员内部类的定义。所以成员内部类不允许有静态变量和方法。

我们上面说了内部类对象的创建依赖外部类:
所以使用outer.inner obj = outerobj.new inner();创建内部类。

public class outer{    outer out=new outer();    outer.Inner inner = out.new Inner();     in.print();    in=out.getInner();    in.print();    public class Inner{        public void print(){        System.out.println("创建Inner对象!")        }    }    public inner getInner(){        return new Inner(); }      }

2.局部内部类,是指内部类定义在方法和作用域内,且只在所在的方法和作用域内可以应用。

3.嵌套内部类
嵌套内部类,就是修饰为static的内部类。
声明为static的内部类,不需要内部类对象和外部类对象之间的联系,就是说我们可以直接引用outer.inner,即不需要创建外部类,也不需要创建内部类。
嵌套类和普通的内部类还有一个区别:普通内部类不能有static变量和static方法,也不能包含嵌套类,但嵌套类可以。而嵌套类不能声明为private,一般声明为public,方便调用。

4.匿名内部类
何为匿名内部类?就是没有名字,只有返回Inner对象的方法。
我们之前的成员内部类提供了两种创建内部类的方法:
outer out=new outer();

outer.Inner inner = out.new Inner();

in=out.getInner();

第二种方法就是我们想要的,可以在getInner方法内部添加上属性和方法,这样就可以产生一个匿名内部类。

public Inner getInner(final String name, String city) {         return new Inner() {             private String nameStr = name;             public String getName() {                 return nameStr;             }         };     } 

以上就是关于内部类的简单介绍,如果错误欢迎指正。

原创粉丝点击