在上一节里给大家留了一个算法,不知大家做得怎样了,现在给出这个算法的参考程序代码。
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()方法中,分别对A和B进行访问。