第十节 高级访问控制
高级访问控制
修饰符 同类 同包 子类 通用性
公共 是 是 是 是
受保护 是 是 是
缺省 是 是
私有 是
变量和方法可以处于四个访问级别的一个中;公共,受保护,缺省或私有。类可以在公共或缺省级别。
变量、方法或类有缺省访问性,如果它没有显式受保护修饰符作为它的声明的一部分的话。这种访问性意味着,访问可以来自任何方法,当然这些方法只能在作为目标的同一个包中的成员类当中。
以修饰符protected标记的变量或方法实际上比以缺省访问控制标记的更易访问。一个protected方法或变量可以从类当中的任何方法进行访问,这个类可以是同一个包中的成员,也可以是从任何子类中的任何方法进行访问。当它适合于一个类的子类但不是不相关的类时,就可以使用这种受保护访问来访问成员。
表6-1总结访问性标准
表6-1 访问性标准
修饰符 同类 同包 子类 通用性
公共 是 是 是 是
受保护 是 是 是
缺省 是 是
私有 是
受保护访问甚至被提供给子类,该子类驻留在与拥有受保护特征的类的不同包中。
第十一节降级
降 级
降级就是过时的构造函数和方法调用。
过时的方法和构造函数由具有更标准化的命名规则的方法所取代。
当升迁代码时,用-deprecation标志来编译代码:
javac -deprecation MyFile.java
在JDK1.1中,对方法名称的标准化做了重大努力。因此,在JDK1.2中,大量的类构造函数和方法调用过时。它们由根据更标准化的命名规则规定的方法名称所取代,总的说来,使程序员的生活简单化。
例如,在JDK1.1版本中的Java.awt.Component类:
改变或获得组件大小的方法是resize()和size()。
改变或获得组件矩形框的方法是reshape()和bounds()。
在JDK1.0版本中的Java.awt.Component,这些方法被降级并被以set和get开头表示该方法的初级运算的方法所代替。
setSize()和getSize()
setBounds()getBounds()
无论什么时候将代码从JDK1.0升迁到JDK1.1或更高版本中,或者即使使用以前用在JDK1.0中的代码,对用-deprecation标志来编译代码都是一个好主意。
c:\ javac -deprecation MyFile.java
-deprecation标志将报告在降级过的类中使用的任何方法。例如,看一个叫做DateConverter的实用类,它将mm/dd/yy格式的日期转换成星期几:
1.package myutilities;
2.import java.util.*;
3.import java.text.*;
4.public final class DateConverter {
5.
6. private static String day_of_the_week [] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
7.
8.public static String getDayOfWeek (String theDate){
9. int month, day, year;
10.
11. StringTokenizer st =
12. new StringTokenizer (theDate, "/");
13. month = Integer.parseInt(st.nextToken ());
14. day = Integer.parseInt(st.nextToken());
15. year = Integer.parseInt(st.nextToken());
16. Date d = new Date (year, month, day);
17.
18. return (day_of_the_week[d.getDay()]);
19. }
20.}
当这个代码用-deprecation标志在JDK1.2中被编译时,会得到:
c:\ javac -deprecation DateConverter.java
DateConverter.java:16: Note: The constructor java.util.Date(int,int,int) has been deprecated.
Date d = new Date (year, month, day);
^
DateConverter.java:18: Note: The method int getDay() in class
java.util.Date has been deprecated.
return (day_of_the_week[d.getDay()]);
^
Note: DateConverter.java uses a deprecated API.Please consult the documentation for a better alternative. 3 warnings
重写的DateConverter类看起来象这样:
1.package myutilities;
2.import java.util.*;
3.import java.text.*;
4.public final class DateConverter {
5.
6.private static String day_Of_The_Week [] =
{"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
7.
8. public static String getDayOfWeek (String theDate){
9. Date d = null;
10. SimpleDateFormat sdf =
11. new SimpleDateFormat ("MM/dd/yy");
12. try {
13. d = sdf.parse (theDate);
14. } catch (ParseException e) {
15. System.out.println (e);
16. e.printStackTrace();
17. }
18. // Create a GregorianCalendar object
19.Calendar c =
20. new GregorianCalendar (TimeZone.getTimeZone ("EST"), Locale.US);
21.c.setTime (d);
22.return(day_Of_The_Week
[(c.get(Calendar.DAY_OF_WEEK)-1)]);
23. }
24.}
在这里,1.2版本使用两个新类:SimpleDateFormat,用来采用任何String日期格式并创建一个Date对象的类;以及GregorianCalendar类,用来创建一个带有当地时区和场所的日历。
|