一、 在内部类前添加修饰符static,这个内部类就变为静态内部类。一个静态内部类中可以声明static成员,但是在非静态内部类中不可以声明静态成员。静态成员内部类有一个最大的特点,就是不可以使用外部类的非静态成员,所以静态内部类在程序开发中比较少见。
可以这样认为,普遍的内部类对象隐式的在外部保存了一个引用,指向创建它的外部类对象,但如果内部类被定义为static时,它应该具有更多的限制。静态内部类具有以下两个特点:
(1)创建静态内部类的对象,不需要其外部类的对象。
(2)不能从静态内部类的对象中访问非静态外部类的对象。
例如:定义一个静态内部类StaticInnerClass
public class StaticInnerClass{
int x=100;
static class Inner{
void doitInner(){
systerm.out.printin("外部类"+x); //调用外部类的成员变量X,<span style="color:#FF0000;">非法</span>
}
}
}
二、静态内部类的应用:进行程序调试时,如果在每一个Java文件中都设置一个主方法,将出现很多额外代码,而程序本身并不需要这些主方法,为了解决这个问题,可以将主方法写入静态内部类中。
实例:在静态内部类中定义主方法,并访问内部类中的方法。
public class StaticInnerClass {
static int x = 100;
static class Inner {
static void doit(){
System.out.println("静态内部类中的方法调用外部类的成员变量x="+x); //调用外部类的成员变量x
}
public static void main(String args[]){ //定义主方法
doit(); //访问内部类的方法
}
}
}
运行结果如下所示:
静态内部类中的方法调用外部类的成员变量x=100
如果编译上面的类,将编译生成一个名称为StaticInnerClass$Inner的独立类(静态内部类)和一个StaticInnerClass类(外部类),只要使用Java StaticInnerClass$Inner就可以运行主方法中的内容,这样当测试完成需要将所有的.class文件打包时,只要删除StaticInnerClass$Inner独立类(静态内部类)即可。
静态内部类的应用:静态内部类求极值
创建一个MaxMin类,再给类中定义一个静态内部类Result,然后在Result类中定义两个浮点型属性,一个是Max,一个是Min,再用构造函数将其初始化,并提供getXXX()方法来获得这两个值。最后定义一个静态方法getResult(),该方法的返回值是Result类型,这样既可以保存最大值,又保存了最小值。
package neibulei;
import javax.xml.transform.Result;
public class MaxMin {
public static class Result {
private double max;
private double min;
public Result(double max,double min){
this.max = max;
this.min = min;
}
public double getMax(){
return max;
}
public double getMin(){
return min;
}
}
public static Result getResult(double[] array) {
double max = Double.MIN_VALUE;
double min = Double.MAX_VALUE;
for(double i:array){
if(i>max){
max = i;
}
if(i<min){
min = i;
}
}
return new Result(max, min);
}
}
package neibulei;
public class TestMaxMin {
public static void main(String[] args){
double[] array = new double[5];
for(int i=0;i<array.length;i++){
array[i]=100*Math.random();
}
System.out.println("源数组:");
for(int i=0;i<array.length;i++){
System.out.println(array[i]);
}
System.out.println("最大值:"+MaxMin.getResult(array).getMax());
System.out.println("最小值:"+MaxMin.getResult(array).getMin());
}
}
运行结果如下:
源数组:
4.733742274434505
46.15541458289667
16.57653326111238
58.6459035079671
8.028611156283494
最大值:58.6459035079671
最小值:4.733742274434505