由于时间上的紧迫性或者程序员忘记了private字段,经常忘记了加入private修饰符对类的字段进行修饰(面向对象的封装推荐我们的字段都声明为private)。这样是否会带来危险性?
实际上这个是依赖与包是否已经被封上了。在Java1.2之后,package java --> 凡是以java或者javax开头的自己的类时,都会被Java的虚拟机拦截,避免恶意代码访问java.awt等包中的default字段。以下的代码展现了:我们无法使用 package java.awt, Java虚拟机的类加载器每当碰到有声明为java开头的包,都是不允许的。


package java.awt; public class Window extends Container{ String warningString; ... } package java.awt; public class hostileClass{ public void accessWindowWarningString(){ ... win.warningString = "trust me"; } }
然而本身的项目代码无法受到Java虚拟机的类加载器的帮助,然而可以将自己的代码进行包的封闭来避免包访问属性的问题。
类的包名确定了对应类文件的目录结构:如, package com.baidu; 那么这个类是存在于对应的基类的路径 com/baidu/
类是我们编程的基本单元..所以虚拟机能够找到对应的类是虚拟机正确执行的最基本的条件,为了能够找到对应的辅助类,实际上Java平台正是通过classpath的协助来完成的..实际上当虚拟机完成部署到某个系统之后,系统默认的将jdk安装目录下的lib/*.jar 和 jdk安装目录/jre/lib/*.jar的所有jar文件加入到我们的类路径当中。同时由于有这样默认的假定:当我们没有指定我们的classpath时,系统给我们默认指定了:
1. jdk安装目录/lib/*.jar
2. jdk安装目录/jre/lib/*.jar
3. 目前运行java虚拟机的当前目录
import java.util.*; import java.sql.*; import java.util.Date; public class ImportClassDemo{ private String importClassName; private Date currentDate; private List<String> importArrayList; }
首先根据import语句定位出对应类的:包名.类名(java.lang包是系统默认的加载进来的包)。
当代码中引用某个类时,Java编译器将尝试着去寻找:
1. java.lang.String, java.lang.Date,java.lang.List,显然在找String类的事后成功了.
2. 然后根据import java.util.*,会转到寻找:Java.util.String,java.util.Date,java.sql.List
3. 然后根据import java.sql.*,会转到寻找:java.sql.String,java.sql.Date,java.sql.List
4. 在相同包的目录开始搜索String,Date,List
5. 由于在2,3步中都找到了匹配的Date类,所以为了唯一的确定类,在import的最后一句加入了import java.util.Date.明确的使用util包里面的Date类
两个classpath被误用的两个习惯:
1. 设置classpath的值,永久的(Windows -> 我的电脑->属性->高级->环境变量) 这个习惯并不是十分的确当,因为一般而言都习惯每次都使用java -cp(-classpath) classpath (推荐使用.bat(windows) .sh (linux) ) 这样的话语义更加清晰,否则当classNoDefFound的error的时候,错误无从说起。
2. 将所有的引用的代码库的类库,都加入到JDK安装目录中\lib\ext目录中:这个诚然是种比较偷懒的方法,然而这里带来的问题是:当这个项目比较长期,那么实际上很容易就忘记了自己曾经把类库加入到了这个目录,而且对于不同的项目需求的类不同.搜索的范围被最大化。