JAVA 基础知识
1. 什么是SDK,JDK, JRE,JVM 以及他们的区别或异同?
SDK--------Software Develop Kit, 中文意思就是“软件开发工具包”。这是一个覆盖面相当广泛的名词,
可以这么说:辅助开发某一类软件的相关文档、范例和工具的集合都可以叫做“SDK”。
JDK---------Java SKD, 最早也叫JSDK (Java Software Develop Kit). 后来改名为JDK (Java Develop Kit). JDK 作为Java开发工具包,
主要用于构建在java平台上运行的应用程序, applet, 组件,是JAVA的核心所在,包括了java 的运行环境JRE
(JAVA RUN ENVIRONMENT), java工具,基础类库(rt.jar).
JRE--------Java Runtime Environment是指Java的运行环境,是面向Java程序的使用者,而不是开发者. JDK 安装完后基本目录为:
---Java
|----jdk1.6.0_21
|----bin (包含了JDK所提供的工具,如:Java.exe , javac.exe )
|----include
|----lib
|----jre
|-----lib (包含基础类库 rt.jar )
|-----bin
|----src
|----(others folder/files)
|----jre1.6.0_21
|----bin
|----lib JVM ------
2. 为何会有两套JRE ? 以及 java程序又是如何选择合适的JRE来运行程序的(或者说系统是如何分配哪套JRE执行的)?
如果我们只是需要运行java程序,那么只需要下载并安装一个jre 就可以,而不需要安装JDK。JDK 包含了java程序员开发时候用
到的一些工具,而JDK本身就是一些java程序,需要有一套自己的jre来支持,两套jre主要是用来分担工作。
如果用户之需要运行java程序,那么有 c:\program files\java\jre 就ok.
当用户是 java 程序员,需要 java 开发环境,那么开发时,系统就会优先去找“ java(java.exe) 、 javac(javac.exe) ”
这些命令本身的目录或者他们的 父目录的 jre; 这样开发时一般运行的是 jdk 下的 jre
(即:C:\Program Files\Java\jdk1.6.0_21\jre )
而运行外部程序时,一般运行的是 c:\program files\java\jre ,实现了分工,不同的 jre 负责各自范围的内容.
既然您的電腦裡頭至少有兩套 JRE ,那麼誰來決定用哪一套 JRE 呢 ? 這個重責大任就落在 java.exe 的身上.
當我們在命令列輸入java XXX的時候, java.exe 的工作就是找到合適的 JRE 來執行類 別 檔。
java.exe 依照底下邏輯來尋找 JRE:
1. 自己的目錄下有 沒 有 JRE 目錄。 ( 這個部分這樣 說 並不是非常精確,原因請詳見 JDK 原始碼,這此不特 別說 明 )
2. 父目錄底下 JRE 子目錄。
3. 查詢 Windows Registry( HKEY_LOCAL_MACHINE\Software\JavaSoft\Java Runtime Environment\ ) 。
所以, java.exe 的執行結果和您電腦裡面哪一個 java.exe 被執行,然後哪一 套 JRE 被拿來執行 Java 應用程式有莫大的關係.
3. 如何设置换环境变量
JAVA 用到的环境变量主要有3 个,JAVA_HOME、classpath、path ,我们逐个分析下:
JAVA_HOME 指向的是JDK 的安装路径,如C:\Program Files\Java\jdk1.6.0_21
如何设置path, classpath
现在可以明白设path和classpath的作用了:path是为jdk提供的那些工具设的,如java.exe,javac.exe,
(set the path, you can use those command in any directory, if not, you should specify the full path,
e.g
if you don't set path variable you need to >C:\Program Files\Java\jdk1.5.0_22\bin\javac Hello.java
if you set path variable, you just need to: >javac Hello.java
)
而 classpath是为java程序所用到的库文件所设的, (java_home=C:\Program Files\Java\jdk1.6.0_21)
于是path设成:java_home\bin;
而classpath设为:java_home\jre\lib\rt.jar,
如果是Win2000或者XP,使用鼠标右击"我的电脑"->属性->高级->环境变量
系统变量->新建->变量名:JAVA_HOME 变量值:C:\Program Files\Java\jdk1.6.0_21
系统变量->新建->变量名:CLASSPATH 变量值:.;%JAVA_HOME%\lib;%JAVA_HOME%\jre\lib\rt.jar
系统变量->编辑->变量名:Path 在变量值的最前面加上:%JAVA_HOME%\bin;
看好了CLASSPATH中第一 个".",这个代表当前目录,很多人HelloWorld没有运行起来大多是这个原因。
基础类库(rt.jar)
DK
4. 静态函数(static)中,不能使用 this.
1. 解释型语言与编译型语言的区别.
计算机不能直接理解高级语言,只能直接理解机器语言,所以必须要把高级语言翻译成机器语言,计算机才能执行高级语言编写的程序。
翻译的方式有两种,一个是编译,一个是解释。两种方式只是翻译的时间不同。
编译型语言写的程序执行之前,需要一个专门的编译过程,把程序编译成为机器语言的文件,比如exe文件,以后要运行的话就不用重新翻译了,直接使用编译的结果就行了 (exe文件),因为翻译只做了一次,运行时不需要翻译,所以编译型语言的程序执行效率高。
解释则不同,解释性语言的程序不需要编译,省了道工序,解释性语言在运行程序的时候才翻译,比
如解释性basic语言,专门有一个解释器能够直接执行basic程序,每个语句都是执行的时候才翻译。这样解释性语言每执行一次就要翻译一次,效率比较
低。
编译型与解释型,两者各有利弊。前者由于程序执行速度快,同等条件下对系统要求较低,因此像开
发操作系统、大型应用程序、数据库系统等时都采用它,像C/C++、Pascal/Object
Pascal(Delphi)、VB等基本都可视为编译语言,而一些网页脚本、服务器脚本及辅助开发接口这样的对速度要求不高、对不同系统平台间的兼容性
有一定要求的程序则通常使用解释性语言,如Java、JavaScript、VBScript、Perl、Python、MATLAB 等等。
但随着硬件的升级和设计思想的变革,编译型和解释型语言越来越笼统,主要体现在一些新兴的高级 语言上。
例如:
Java不一样他首先由编译器编译成.class类型的文件,这个是java自己类型的文件然后在通过虚拟机(JVM)从.class文件中读一行解释执
行一行,所以他是解释型的语言,而由于java对于多种不同的操作系统有不同的JVM所以 Java实现了真正意义上的跨平台!
请观看下面两张图 了解一下Java的虚拟机机制:
(1) java语言的编译--> 解释---> 执行过程
(2)java的虚拟机
2. 进程 , 线程 以及区别. (还需要专门学习 )
3. java 基本数据类型以及其对应的类: (above the detail info , please refer to JAVA Platform Standard documentation )
Boolean VS boolean
Byte VS byte
Character VS char
Double VS double
Float VS float
Integer VS int
Long VS long
Short VS short
1. 静态方法可以通过类名直接引用, 如: Math.sqrt(); 而非静态方法,一定要通过对象(此对象已完成初始化)来引用
2. JAVA 同时支持多维数组和嵌套数组吗?
答: 不对,Java只支持嵌套数组,不支持多维数组. 多维数组被称为数组的数组,其定义是一维数组的嵌套来实现的。
由于java多维数组是数组的数组,所以java多维数组(二维)并不是规则的矩阵。
e.g: int x= new[3][] ;
这句代码表示数组x有3个元素,每个元素都是int类型的一维数组,相当于定义了3个数组变量,分别为:x[0][],x[1][],x[2][]。 在这里可以把x[0],x[1],x[2]看作变量名,通过new运算符使其指向它们的数组对象,如:
x[0]=new int[3];
x[1]=new int[2];
由此可以看出,二维数组x的每行长度可以是不一样的。
3. 函数参数传递:1. 基本类型的参数是值传递; 2. 对象类型的参数是引用传递
(参数对象的值改变了,原始对象会有影响;参数对象本身改变了,原始引用对象不会改变)
e.g: Point T= new Point(10, 20) ; // 原始值
static void changeValue1(Point A) // A 为port 类型,调用方式为: changeValue(T) ;
{
A = new Point( 200, 400); // A has been changed, but T not.
}
static void changeValue2(Point B)
{
B.x = 15;
B.y = 25; // Here B changed, T also changed.
}