内部类

 在上一节里给大家留了一个算法,不知大家做得怎样了,现在给出这个算法的参考程序代码。

public class Sum1_5

{

/**

 * @param args

 */

public static void main(String[] args)

{

System.out.println(sum(100));

}

public static int sum(int x)

{

int mSum=0;

if(x%2==1)

{

mSum=(1+x)*x/2+(1+x)/2+1;

}

else

{

mSum=(1+x)*x/2;

}

return mSum;

}

}

这是我们优化以后的算法,由于算法很简单,所以这里就不再详细地去解读了。

接下来,我们学习一个新的内容,内部类。顾名思义,内部类就是包含在一个类里面的类了,包含内部类的类称为这个类的外部类或者父类。

内部类作为外部类的一个成员,应该拥有类成员的一般性质,我们可以将内部类设置权限为public,private或者protected,当然,不同的权限就对应不同的操作了,这跟其它类成员类似,这里就不多讲了。

我们要注意的一个问题是,既然我们可以在一个普通类里申明一个static成员,那么我们能否在一个内部类里也申明一个static成员呢?我们来写个这样的程序验证一下:

public class InnerClass2_1

{

/**

 * @param args

 */

public static void main(String[] args)

{

class A

{

public static int x;

public A()

{

x=0;

}

}

}

}

我们会发现,编译器会报错,错误信息为:The field x cannot be declared static; static fields can only be declared in static or top level types,也就是说,x不能够被申明为静态类型,静态类型只能够被定义在静态成员或者顶层成员内。有的同学会问,如果将内部类也加一个权限修饰符static,是否可以在内部类里定义static类型的数据了呢?答案也是否定的。因为内部类不能够被申明为static类型,我们知道被申明为static类型的成员实际上已经不属于这个类了,那么如果我们将内部类也申明为static类型,也就是说,内部类也不属于这个类了,这跟内部类的定义相悖。

另外,内部类既可以定义在一个普通类里,也可以定义在一个普通类的方法里。

所以,我们不能在内部类里定义static成员,同时也不能将内部类定义为外部类的static成员。下面给出上面经修改后的程序,仔细体会一下内部类的功能与特征。

public class InnerClass2_1

{

/**

 * @param args

 */

public static void main(String[] args)

{

class A

{

public A()

{

System.out.println("I am the constructor of the inner class");

}

}

new A();

System.out.println("I am the main class");

}

}

运行结果为:

I am the constructor of the inner class

I am the main class

另外一种写法也可以得到同样的结果:

public class InnerClass2_1

{

/**

 * @param args

 */

public static void main(String[] args)

{

new A();

System.out.println("I am the main class");

}

static public class A

{

public A()

{

System.out.println("I am the constructor of the inner class");

}

}

}

在这种写法中需要注意的是,我们讲过,一个静态方法只能访问静态成员,因main()方法是一个静态方法,所以在访问类A的时候,A必须要申明为静态类。

内部类是一个比较重要的概念,但实际项目中运用得比较少,但作为学习Java的同学,掌握内部类的使用方法和相关特征是有必要的,在中级篇里讲多线程时会继续用到内部类的概念,因此,望广大学者务必下去多了解一下内部类。

在这节的最后留下一个题目,题目内容是:请新建一个主类,在主类的main()方法里定义一个子类,命名为A,创建一个子类B作为主类的一个成员。在main()方法中,分别对AB进行访问。

原文地址:https://www.cnblogs.com/jeancandoit/p/2306701.html