掌握内部类

来源:互联网 发布:sql like 编辑:程序博客网 时间:2024/05/22 04:44
内部类,顾名思义,大家就可知道,它是一种定义在某个类内部的类。所以,一定要给它下个定义的话,那么就是:定义在一个类内部的类,就是内部类。那么内部类有哪些分类呢?主要的内部类有:成员内部类,静态内部类,局部内部类,匿名内部类这几种;而成员内部类就是指定义在类的内部,类方法的外面,与成员方法和成员变量处于同一位置的类,可以简单的将成员内部类看成是一个类中的成员;那么静态内部类就是指在类中与成员内部类同级,但被static关键字所修饰的内部类;局部内部类是指定义在类中,但是被定义在类中方法里的内部类,可以将其简单的看成某个方法里的变量,当然 ,这只是一种比较性的理解说法,二者还是有区别的;匿名内部类是指没有名字的类,但必须要知道这个类的父类或者这个类实现的接口。
接下来就对这些类逐一进行举例说明,先来看成员内部类的用法。局部内部类定义在了成员变量的位置,但不是静态的。内部类可以直接访问外部类的私有成员,因为内部类本身持有外部类的引用对象地址,但是,如果内部类和外部类有了相同名称的成员时,那么,使用变量就会根据就近原则,选择局部变量进行访问;并且可以通过this.成员变量的方式来区别类成员和局部成员的访问,但是外部类的同名成员又如何去访问呢?那么就要用外部类类名.this.同名成员名来访问外部类的成员;下面举个例子:
class  Outer{
private String name="Outer";
private intnum=12;
class Inner{
private String name="Inner";
public void print(){
String name="Inner Paramaters";
System.out.println("name="+name);
System.out.println("Inner.name="+this.name);
System.out.println("Outer.name="+Outer.this.name);
System.out.println("Outer.num="+num);
}
}
}
用上面例子中的访问方式,就可以分别去访问外部类和内部类的同名成员了,对于方法也是如此;不同名的成员直接访问就可以了。那么如何去实例化一个内部类的对象呢?首先要对外部类进行实例化:Outer outer=new Outer();然后再利用外部类的对象对内部类对象进行实例化:Outer.Inner inner=outer.new Inner()
实例化完外部类和成员内部类的对象后就可以去调用各自的方法了。总之,内部类可以访问外部类的成员,但外部类要访问内部类的成员,那么就必须实例化内部类的对象。
接着来说说静态内部类,静态内部类就是在成员内部类的前面加上static关键字,那么这个类就成了静态内部类了。静态内部类的特点:静态内部类不持有外部类的引用地址,所以静态内部类不能直接访问外部类的非静态成员,如果要访问就要实例化外部类对象进行访问;静态内部类可以访问外部类的静态成员(静态方法和静态变量);实例化静态内部类,不需要实例化外部类对象,可以直接利用外部类和内部类就进行实例化,基本格式为:外部类类名.静态内部类类名  静态内部类对象名=new 外部类类名.静态内部类类名(); 接下来看个举例:
class Outer{
private static name="Outer";
private int num=10;
static class Inner{
public void print(){
System.out.println("Outer.name="+name);
System.out.println("Outer.num="+new Outer().num);
}
}
}
相信以上的例子应该可以说明静态内部类究竟在类中是如何被访问的了,那么接着说局部内部类。局部内部类,顾名思义就是定义在方法中的内部类,它的位置就是局部变量的位置;局部内部类的特点:局部内部类可以访问外部类的静态成员;局部内部类不能用private,protected,public,default等修饰词来修饰;最后最主要的一点是,如果局部内部类要访问外部类的局部变量时,那么这个变量就必须声明成为常量。下面具体看举例:
class Outer{
private String name="Outer";
public void show(final int i){
final int num=i;
}
public void print(){
class Inner{
String name="Inner";
public void diaplay(){
String name="display method";
System.out.println("name="+name);
System.out.println("Outer.this.name="+Outer.this.name);
System.out.println("Inner.name="+this.name);

System.out.println("num="+num);
}
}
}
}
好了,想必谈到这感觉这些类的使用也就是大同小异;那么最后咱们再谈一个内部类---匿名内部类。匿名内部类,一看就知道,这个类就没有具体的名称,但是在用它之前,必须得有个条件:必须知道它的父类或它实现的接口。那么匿名内部类是如何定义的呢?其定义格式:
匿名内部类父类名称   其父类对象名称=new 匿名内部类父类或接口名(){
重写父类或接口中的要实现的方法,以及自己特有的方法;
};
例如:
String str1=new Object().toString();

System.out.println("str1="+str1);

String str1=new Object(){

public String toString(){

return "我是重写Object类后的子类对象的成员信息";

}

}.toString();

System.out.println("str1="+str1);

内部类最大的优点就是,减少了类文件(字节码文件)的大小。但是会使整个程序的结构变得不是特别清楚,失去条理性。

关于内部类的见解我就谈这么多,本人学术不精,忘见谅。



0 0
原创粉丝点击