java 的作用域分为了public protect default private。他们作用域按照这个顺序递减。
编译器能够检查出来超出作用域的调用,但是如果设置的作用域太宽泛了就检查不出来,可能会引起一些意外的调用,导致程序逻辑错误。
例如
下图中的Date对象的初衷希望调用setMonth设置月份信息,但是没有对month的作用域进行设置,导致该变量的作用域为默认的default,所以同包内的对象可以直接调用month进行赋值操作。这就违背了程序设计初衷。
package date;
public class CallDate {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Date d = new Date();
d.month = 123;
}
}
package date;
public class Date {
int year;
int month; //没有设置为private,所以出了date类外,同一个包内的其他类是可见的,因此可以直接设置。
int day;
//设计的初衷只想让其他用户使用该函数设置month。
public int setMonth(int pMonth)
{
int result = -1;
//检验不一定住,只是示例
if( pMonth >=1 && pMonth <=12)
{
month = pMonth;
result = 1;
}
else
{
result = -1;
}
return result;
}
}