《Java开发手册》学习进程之第7章访问控制符

类的访问控制符:

虽然访问控制符有四种,但针对外部类来说,只需要公共的和默认的就够了。

public表示任何类都可以使用该类。

当一个类被定义为public的时候,它就可以在任何类里被访问了。

成员的访问控制:

成员(即成员变量和方法)能被其他类访问主要取决于两个方面因素:

  • 成员变量和方法所在类的可见性是其能被正常访问的前提条件;
  • 其次是成员变量和方法的访问控制符直接决定了是否可以被访问。

Static关键字: 

Java中没有全局变量的概念。

若static修饰成员变量,当生成类的对象时,该类的所有实例都共享这一变量,而且也可以在未创建对象前访问该变量。这种变量只能在定义的时候初始化或者在静态代码块中被初始化。

用static修饰的代码块表示静态代码块,当JVM加载类时,就会执行该代码块,且只执行一次。如果静态代码块有多个,JVM加载类时会按其在类中出现的先后顺序依次执行。

当一个成员变量被修饰为final而非static时,属于类的实例变量(与静态变量相反),当类被加载进内存时,这个属性并没有给其分配内存空间,而只是定义了一个变量,只有当类被实例化时这个属性才会被分配内存空间,而实例化时同时执行了构造函数,所以属性被初始化,符合分配内存空间时就需要初始化而以后不再改变的条件。

当类的成员变量同时被修饰为static和final时,属于类变量。当类被加载到内存时就要为此变量分配内存,因为又被final修饰,在变量定义以后就给其初始化值。而构造函数是在当类被实例化时才会执行,所以不能用构造函数初始化static和final修饰的成员变量(否则会产生矛盾);该成员变量仍可以在static块中初始化。

static方法可以直接通过类名调用,任何实例也可以调用(这点和static成员变量一致)。不过static方法中不能使用this和super关键字,不能直接访问所属类的实例变量和实例方法,只能访问所属类的静态成员变量和静态方法。

因为static方法独立于任何对象,因此static方法必须被实现,而不能是abstract。

static是用来修饰成员变量和成员方法的,并不适用于局部变量中。

final的变量:

基本数据类型的变量和对象引用在被final修饰时含义并不相同。

关于final修饰的成员变量和局部变量的问题。

成员变量是随类的加载或对象的创建而初始化的,如果成员变量为final但不自行初始化一个值,编译器会发现final成员变量不初始化就会报错,否则,如果像非final的成员变量一样声明时不初始化而让系统赋一个默认值,那么此变量的存在就没有任何意义了。

局部变量如果只声明而不初始化,那么系统就不会自动为其赋值,那么在方法中使用没有值的变量就会出错。不过,如果方法中的局部变量未被使用,那么final的局部变量就可以先声明后赋值。

关于final变量的初始化问题。

在方法中定义的内部类在使用方法的局部变量时,变量必须是final。

为什么被方法内的内部类访问的局部变量必须是final的。

package的使用:

    • java.lang包:Java基础包,为Java语言的基本结构提供了各种基础类,如Object,String。
    • java.util包:Java工具包,提供了编码、解码、哈希表、向量和堆栈之类的工具类。
    • java.io包:提供了标准的输入流、输出流及文件访问相关的工具类。
    • java.applet包:小应用程序包,提供了与支持Java的浏览器进行交互的类。
    • java.awt包:窗口工具包,提供了字体、基础事件、监听器、面板、窗体、按钮和滚动条等图形用户界面工具类。不过这个包所提供的功能已经被另外的更强大的工具所替代了。
    • java.net包:网络包,提供了支持网络通信的类,如Socket类等,支持telnet、FTP和www等协议访问网络。

包名一般小写,而类名中的字母会大写,这样在引用时,可以明显地分辨出包名和类名。

通过静态引入package可以直接引用某类的静态成员方法或静态成员变量。比如,import static java.lang.Math.PI使用import static导入类的静态资源,则在接下来的代码中可以直接使用PI而不是Math.PI。此外,还可以通过使用“*”代表引入类下的所有静态资源。

静态引入虽然方便,但因为该方法可能会在很大程序上影响着程序性能,所以尽量在某个静态变量或方法的访问频度很大时才使用。

 

 

posted @ 2014-11-15 09:50  WeekeyJanelan  阅读(147)  评论(0编辑  收藏  举报