java静态内部类

【0】README

0.1) 本文描述+源代码均 转自 core java volume 1, 旨在理解 静态内部类 的基础知识;

【1】静态内部类

1.1)有时候,使用内部类只是为了把一个类隐藏在另一个类的内部, 并不需要内部类引用外围类的对象。为此,可以将内部类 声明为 static, 以便取消产生的引用;
1.2)看个荔枝:(考虑一个计算数组中最小最大值的问题)
如果只遍历数组一次, 并能够同时计算出最小值和最大值,那么就可以大大提高效率了;

java静态内部类_第1张图片

1.3)当然, Pair是一个大众话的名字, 为了避免名字冲突, 解决这个问题的方法是 将 Pair 定义为 ArrayAlgCopy 的内部公有类。此后,通过 ArrayAlgCopy.Pair 访问它:

ArrayAlg.Pair p = ArrayAlg.minmax(d); 

1.4)不过,与前面中所使用的内部类不同, 在 Pair对象中不需要引用其他对象: 所以,可以将这个内部类声明为 static:

class ArrayAlg
{
    public static class Pair // 静态内部类 {
        。。。。。。
    }
}
  • 当然,只有内部类可以声明为 static, 静态内部类的对象除了没有对生成它的外围类对象的引用特权外, 与其他所有内部类完全一样。在我们的例子中, 必须使用静态内部类, 这是由于内部类对象是在静态方法中构造的:
public static Pair minmax(double[] e)
{
    .....
    return new Pair(min, max);
}

Attention)如果没有将 Pair类声明为 static, 那么编译器将会给出错误报告: 没有可用的 隐式 ArrayAlg 类型对象初始化内部类对象;
Annotation)

  • A1)在内部类不需要访问 外围类对象的时候, 应该使用静态内部类, 有些coder 用 嵌套类 表示静态内部类;
  • A2)声明在 接口中的内部类自动 成为 static 和 public类
    java静态内部类_第2张图片

1.5)最后再让我们看个荔枝:

package com.corejava.chapter6_3;

public class StaticInnerClassTest {
    public static void main(String[] args)
    {
        double[] values = {1, 2, 3, 9, 8, 7};

        ArrayAlgCopy.PairCopy pair = ArrayAlgCopy.minmax(values);
        System.out.println("min = " + pair.getFirst() + ", max = " + pair.getSecond());
    }
}

class ArrayAlgCopy
{
    public static PairCopy minmax(double[] values)
    {
        double min;
        double max;

        min = values[0];
        max = values[0];
        for(double v: values)
        {
            if(min > v) min = v;
            if(max < v) max = v;
        }
        return new PairCopy(min, max);
    }

    public static class PairCopy//静态内部类 {
        private double first;
        private double second;

        public PairCopy(double first, double second)
        {
            this.first = first;
            this.second = second;
        }

        public double getFirst()
        {
            return this.first;
        }

        public double getSecond()
        {
            return this.second;
        }
    }

}

你可能感兴趣的:(java,静态内部类)