20140616笔记

来源:互联网 发布:用java编写小游戏视频 编辑:程序博客网 时间:2024/05/23 02:06

内容摘要:


①Sun公司简介:
②java的发展史:
③java的特性:
④java的分支:
⑤java的跨平台:
⑥jdk及版本简介
⑦设置环境变量及cmd下的常见windows命令和java命令:
⑧java的核心机制了解:
⑨API简介及API文档的使用:
⑩集成开发环境(IDE)简介:
①①第一个程序——HelloWorld的代码详解:
关于:jar的概念
关于:源文件编译后与类文件的关系




①sun公司简介:
sun公司 全名 Sun Microsystems。
主要产品是工作站及服务器。
1995年Sun Microsystems开发了[Java]技术,实现了第一个通用软件平台。
sun公司名称的由来很多人不知道,它其实是斯坦福大学校园网(Stanford University Network)的首字母缩写,由斯坦福大学毕业生功能创建。贝克托森开发出原型机 Sun-1 后,便于 1982 年和斯科特·马可尼里(Scott McNealy)等斯坦福毕业生从学校出来创办了sun公司。


②java的发展史
java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言
名字来源:
Java是印度尼西亚爪哇岛的英文名称,因盛产咖啡而闻名。Java语言中的许多库类名称,多与咖啡有关:如JavaBeans(咖啡豆)、NetBeans(网络豆)以及ObjectBeans(对象豆)等等。SUN和JAVA的标识也正是一杯正冒着热气的咖啡。
1995年5月23日,Java语言诞生
1996年1月,第一个JDK-JDK1.0诞生
1997年2月18日,JDK1.1发布
1999年6月,SUN公司发布Java的三个版本:标准版(JavaSE,以前是J2SE)、企业版(JavaEE以前是J2EE)和微型版(JavaME,以前是J2ME)
2002年2月26日,J2SE1.4发布,自此Java的计算能力有了大幅提升
2004年9月30日18:00PM,J2SE1.5发布,成为Java语言发展史上的又一里程碑。为了表示该版本的重要性,J2SE1.5更名为Java SE 5.0
2005年6月,JavaOne大会召开,SUN公司公开Java SE 6。此时,Java的各种版本已经更名,以取消其中的数字“2”:J2EE更名为Java EE,J2SE更名为Java SE,J2ME更名为Java ME
2006年12月,SUN公司发布JRE6.0

Java编程语言的风格十分接近C语言、C++语言。Java是一个纯粹的面向对象的程序设计语言,它继承了 C++语言面向对象技术的核心。Java舍弃了C语言中容易引起错误的指针(以引用取代)、运算符重载(operator overloading)、多重继承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再被引用的对象所占据的内存空间,使得程序员不用再为内存管理而担忧。在 Java 1.5 版本中,Java 又引入了泛型编程(Generic Programming)、类型安全的枚举、不定长参数和自动装/拆箱等语言特性。Java不同于一般的编译执行计算机语言和解释执行计算机语言。它首先将源代码编译成二进制字节码(bytecode),然后依赖各种不同平台上的虚拟机来解释执行字节码。从而实现了“一次编译、到处执行”的跨平台特性。不过,每次的执行编译后的字节码需要消耗一定的时间,这同时也在一定程度上降低了 Java 程序的性能。




③java的特性:
Java 编程语言是个简单、面向对象、分布式、解释性、健壮、安全与系统无关、可移植、高性能、多线程和动态的语言。

简单性:
java的语法符合标准惯例,易于理解。--java的语法设计接近c++,因为c++的广泛使用,懂得c++语法的用户可以很快的理解java语法。
java是c++的“纯净”版本,它剔除了一部分c++中不实用的特性。
java在设备上的运行环境最小时只有40kb。
面向对象:
与现代的很多程序设计语言一样,java的程序设计是面向对象的。
网络技能:
java拥有一个扩展的类库。这个类库的用处就是处理TCP/IP协议相关功能,
通过简单的方法调用,就可以实现网络通信,而很多其他语言想要实现这类功能,
是需要编写很繁复的代码的。
健壮性:
java在早期的问题检测、后期动态的(运行时)检测方面下了很大的功夫,java的编译器可以检测出
很多其他语言在运行时才能检测出来的问题。
java的指针模型,使得java不会出现内存的重写和损坏数据的可能性。
java既可以实现必须拥有指针才能构建的数据结构,也不会因为指针的特性导致主动操作指针时出现内存错误。
安全性:
从一开始,java就被设计成防范各种侵袭,这些安全特性,使得一些常见的攻击手段成为不可能。
如蠕虫病毒导致的运行时堆栈溢出,因为java被设计成会妥善的处理堆栈,不会出现溢出现象,导致蠕虫
攻击失效。
体系结构中立:
这个特性通过 java编译器生成的与特定的计算机体系结构无关的字节码(.class)来实现。
字节码可以很容易的在任何机器上解释执行,并迅速翻译成本地机器的代码。
可移植性:
java规范中没有“依赖具体实现”的地方。
比如java的数据类型的位数与机器无关;二进制数据以固定的格式进行存储和传输;
字符串是用标准的Unicode格式存储的。
解释型:
解释型就是不能直接编译成机器码去运行(像c就可以编译后执行)
需要编译生成字节码然后需要经过解释才能运行。
高性能:
使用即时编译器,通过各种策略优化代码,提高性能,比如可以检查哪些字节码执行的最频繁,
将这些字节码翻译为机器码,这样就提高了运行效率。
多线程:
多线程可以带来更好的交互响应和实时行为。
在不同的平台,java调用多线程的代码完全相同,因为具体的实现交给了操作系统和线程库
java可以简单方便的使用多线程。
动态性:
java可以在程序运行时,分析对象信息


④java的三个版本
标准版javaSE:提供了java的基本特性,是EE和ME的基础
企业版javaEE:在SE的基础上,扩展了类库,添加了支持大型企业应用的功能
移动版javaME:在SE的基础上,缩减了类库,并提高了运行效率,针对便携设备、智能家电


⑤java的跨平台原理:
源代码——(编译器)——字节码——JVM(解释器)——各平台下各自相应的机器码——运行程序
java代码通过编译器生成class字节码文件,字节码文件在java虚拟机(JVM)上通过其解释器,翻译成虚拟机所在平台的机器码,然后就可以执行程序了。
就好像,一篇中文写的文章,放到美国、日本、瑞士,看不懂,但可以由各国设立的中国大使馆的文职人员将文章的内容翻译成那个国家能看懂的文字。


⑥JDK:Java Development Kit的缩写 即java开发工具箱
版本介绍:
JDK是新的叫法,早期Java开发工具箱 1.2~1.4 版本被称为 Java SDK(Software Development Kit)
Java SDK 有三个版本SE EE ME ,其中SE是java的标准版,即称呼为JavaSE SDK
因为JDK1.2的重大改进,所以讲java平台命名为java2,所以又变成了Java2SE SDK,这就是早前j2SE
的由来,后来将Java SDK改称JDK,则Java SDK1.2-1.4,就映射成JDK1.2-1.4,JDK1.5又称为JDK5.0
是为了彰显JDK1.5版本的重大改进,JDK6.0同理。
最后,当Sun为解决一些问题做出了某些微小的版本改变时,将其称为更新,例如对Java SE 6 做出的第一次更新,正式称为JDK 6u1 ,内部版本号为1.6.0_01。 如果想要下载的JDK被称为更新(如JDK 6u1234),也不必担心,因为更新不仅包含更新还捆绑了完整的JDK。
==只有java(下载的JDK)的安装过程和编译命令(如 javac Demo.java)与具体的系统有关
==JRE 包含虚拟机但不包含编译器,是为用户设计的。


jdk目录结构:

bin:这是存放java启动命令以及其他开发工具命令(如javac)的,该目录应当保存到path变量中
lib:是jdk工具用到的类库及其他文件。tools.jar就包含了对开发工具的支持功能库;dt.jar就是所谓DesingTime的东西,估计是给javabean和IDE用的。
jre:这就是JDK自含jre的根目录了。

摘自 http://www.cnblogs.com/bukudekong/archive/2011/06/27/2091504.html
"两个jre"和"三个lib"的功能简单扼要的解释
    安装JDK后,Java目录下有jdk和jre两个文件夹,但jdk下还有一个jre文件夹,而且这个jre比前面那个jre在bin目录下多了个server文件夹! 
    普通用户装jre即可。开发人员需要安装jdk,其中包括jre。所以jdk目录下包括jre目录。两个jre大体相同,有细微的差别。 
    两套 jre ,是针对不同的工作职责!不同的 jre 负责各自范围的内容。 
    当用户只需要执行 java 的程序时,那么C:\Program Files\Java\jre1.5.0_08的 jre 就 ok ! 
    当用户是 java 程序员,则需要 java 开发环境。编译时,系统就会优先去找C:\Program Files\Java\jdk1.5.0_08\bin下的“ java 、 javac ”这些命令所在目录或者他们的父目录的 jre 。即开发环境下运行的是 jdk 下的 jre 。
再说三个lib目录: 
    JDK下的lib包括java开发环境的jar包,是给JDK用的,例如JDK下有一些工具,可能要用该目录中的文件。例如,编译器等。 
    JRE下的lib只是运行java程序的jar包,是为JVM运行时候用的。包括所有的标准类库,和扩展类。 
    JDK下的JRE下的lib是开发环境中,运行时需要的jar包。最典型的就是导入的外部驱动jar包。因为编译时,系统找的是jdk下的jre。而不是最外层的jre。 
----------------------------------------- 
    最后我在这里补充几点: 
    1. 在使用Eclipse的时候不需要指定的CLASSPATH,Eclipse会自己搜索. 
    2. 独立目录下的jre是通用jre,安装时是可选的(选择了,则会覆盖已有版本)。jdk目录下的jre则是必须的。如果你在eclipse里指定jdk的路径(jre的路径不用你指定,会自己去找的),那么用的就是这个jre。而java, web, start等,用的则是通用jre。




⑦设置环境变量:
path:执行路径:操作系统搜索本地可执行文件的目录列表。对于不同的操作系统过程
在现有path地址最后的位置添加分号; 然后添加jdk下的bin目录如;c:\jdk\binclasspath:类文件路径,在执行如java HelloWorld命令时,用来寻找字节码文件HelloWorld.class。注意该路径不能用来在编译时如:javac HelloWorld.java时用来查找.java文件,换句话说,如果想编译java文件,则必须在编译命令中显式的指定其文件路径,或直接就在
所在路径执行编译。
补充:关于classpath,在jdk5.0版本开始,当需要查找类文件时,虚拟机会自动去当前路径及jdk\lib路径中寻找类文件。路径中的.;与其他的如c:\java\jdk\lib\tools.jar;一样都代表一个路径,这个路径指在cmd中执行java命令时所在的当前目录。
java_home:此路径放置jdk的根目录比如c:\java\jdk,设置完成后可以应用到path和classpath,应用方法为%java_home%,比如原path路径为:c:\java\jdk\bin ,可以变为%java_home%\bin ,java_home有2个作用,1是当jdk根目录发生变化后,只需要修改环境变量java_home即可,如果没有使用过java_home,则需要修改path和classpath2个路径;更重要的作用是一些应用软件(如tomcat)会在启动时需要读取系统的
java_home环境变量,如果没有创建过该变量可能引起错误。
另外:1在windows操作系统中,环境变量的名不区分大小写2设置环境变量时注意要设置成系统变量,而不是用户变量

cmd命令行程序下执行编译、运行时需要了解的一些命令:

0  Ctrl + c 表示中断程序

1 d: 
表示转换盘符如c:代表转换到c盘符
2 cd空格地址  
表示进入指定目录,cd ..是返回前一级目录,cd ...是返回到根目录
3 dir
表示查看当前目录下的文件情况
4 javac HelloWorld.java
表示编译HelloWorld文件,会在HelloWorld.java文件所在目录下生成同名的字节码文件HelloWorld.class
如果提示找不到命令,可能是path或java_home设置错了
5 java HelloWorld
表示运行HelloWorld字节码文件,如果报的错误是找不到文件,可能是classpath或java_home设置错误,或者命令行中的class文件名写错了
另外:如果修改环境变量前已经打开了cmd,则环境变量设置完成后要重新启动cmd才能让修改生效


⑧java的核心机制:
JVM:java虚拟机,可以理解为:可以运行由class字节码组成的应用的计算机(就好像PC机可以运行由机器码组成的应用程序一样)
GC:垃圾回收器,用来管理内存,标记那些不再使用的内存资源,周期性的自动回收(回收时机由其算法决定),程序员对回收哪些垃圾只能进行建议,不能直接干预。


⑨API:应用程序编程接口
一些由sun公司预先定义好的方法,使得在开发应用程序时,程序员只需要访问这些方法,就可以获得相应的能力,而无需访问源代码或了解其内部的实现细节。
API文档:文档形式的api ,使用它可以方便的查找想要使用的api,一般是chm形式


⑩IDE:集成开发环境
相比于文档编辑器txt等,它集成了一些方便开发的工具,使得程序员可以快速、方便的开发应用程序或进行程序调错,提高开发效率。
这些工具包括但不限于自动编译、在为运行程序前进行语法错误的查找、自动补全对象、成员变量和成员方法等等。

①①
HelloWorld.java程序详解:


package com.demo.wanglifeng;
import java.util.Scanner;//展示import之用,无其他作用
/*
*HelloWorld程序的详细分析!
*
*/
public class HelloWorld{
public static void mian(Sting[] args){


System.out.println("Hello World");
}
}






1 package和import
package和import是java的包机制的关键字,package指该java文件在指定的文件目录下,如果想要引用java文件(比如编译)就必须指定java文件的全名(全名是包路径+文件名,这里是 javac com.demo.wanglifeng.HelloWorld.java),并且如果是在windows下,还必须手动为其创建同名的文件目录(就是说一个com\demo\wanglifeng目录,java文件在这里面,而且com目录在classpath路径下),否则会报错:找不到这个文件,我理解的包机制,实际上是提供了一个命名空间机制,在有限的共享空间下,如果文件同名则会报错(如windows系统同一个文件内不允许同名同类型的文件),但如果人为的将划分出十个层次(层次内不允许文件同名),那么在相同空间内一个文件名实际上就可以使用十次了。有效的利用了空间也防止了可能产生的同名问题。
import package声明了文件在哪住? import则声明了需要的文件去哪找! 如本程序中,如果使用到了Scanner类,则会一次拿出一个classpath路径与java\util路径拼接寻找名为Scanner.class的文件,循环直到找到或抛出错误。


2public
访问修饰符有4个级别 private default protected public
被其修饰的资源,在被访问时,有不同的访问级别:
private:指该资源只能被本类调用,如果设计资源时,很明确其只是为类内部服务,可以使用private,还有一种情况是封装。即使用private修饰资源,但提供共有的方法对其进行修改(getter、setter)
default :指该资源只能被与其所在类相同包的类引用,如果包内类之间引用已经可以很好的完成功能实现,则资源可以使用default修饰
protected:资源可以被同包类引用,也可以被资源所在类的子类引用,protected一般强调的是父类资源,如果这个资源只是设计用来被子类调用,则可以使用protected来修饰,另外如果父类资源修饰级别是default或private,子类无法继承这些资源。
public:所有包下的类都可以访问该资源,设计时已经确定资源将被各种类公用时,可以使用public,或者使用其他级别的修饰符无法满足资源的访问需求时也使用它来修饰
以上是当被修饰的资源为成员变量或成员方法时,但如果被修饰的是类,则只有public和default(不加访问修饰符)两种访问级别
default:类只能被同包内的类引用
public:一个java文件内最多只能有1个public类,且其类名必须与java文件名相同,至于为什么只能有1个public类,是因为程序执行时,会从一个public类的main方法开始,如果有多个public则会报错

class:关键字,声明一个类 ,声明的形式:  class 类名{}大括号内即为类的内容,java程序可以想象成由一堆“类空间”堆砌成的文件集


static:static修饰的资源是静态资源,在类加载时就为其分配资源空间,而不是当类被实例化才分配。
静态资源是“类的资源”,可以用类名.资源名来调用,而普通的资源则只有当类实例化用后由实例变量名.资源名来使用
如果static修饰的是方法,则方法内部只能使用静态的成员变量和静态的成员方法(在类中声明的实例资源除外),因为静态方法调用时类可能还没有实例化,如果在方法中使用了普通的成员变量和成员方法,那它们是哪个实例的变量和方法呢?

方法声明:
形式 :返回值 方法名(参数列表){方法体}
返回值为数据类型,如果没有返回值则写void
方法名遵循驼峰命名法,尽量取得有意义
参数列表由一个清单组成,清单中的每一项包括一对数据类型和形参标示符
方法体内部是方法调用时真正在做的内容


main方法详细:

main方法是什么?

main方法是java应用程序的入口,运行程序以后,虚拟机会调用这个main方法,main方法体内的第一行代码即为程序运行时执行的第一行代码。有些程序编写时看上去不需要写main方法,是因为框架已经自动写完了一个更复杂的main方法,它会自动为我们服务(如servlet)。

为什么要这么声明?
public 修饰,是因为调用main方法的是JVM,jvm与main方法所在类完全可能不在一个包内,也不可能是它的子类,所以必须用public,JVM才能“看见”main方法!
static 修饰:是因为jvm运行起来时,main方法所在的类只是被装载上了,还没有实例化,所以想要在类没有实例化之前调用一个方法,则该方法必须声明为static,这样在装载类时jvm就已经为该方法分配了内存,可以调用它了。
void: 修饰:很简单,方法的返回值是要返回给调用它的环境的,main方法的调用环境是jvm,是java环境的最底层了,jvm并不需要main返回什么东西,设计main只是为了实现程序运行所必须的入口,而不是为了返回什么东西。
main方法名:jvm默认会调用public类中名字是main的方法作为程序的入口点。
Strng[] args:jvm调用main方法时默认会调用参数为字符串数组的那个方法,现在很少会使用到main方法的字符串数组参数,main方法接收到的参数是在cmd环境下执行java命令时传入的参数,参数用空格隔开,每个参数是字符串数组args的一项

System.out.println(String str);方法调用的细节:
实际上的调用流程是:
System类,有一个out静态变量,类型为PrintStream,在这个类中有一个println(String str)方法,它会将接收到的String字符串,打印到控制台,然后在字符串末尾处打印出一个\n,实现换行功能。


关于jar,类似于常见的文件压缩格式。不过它压缩的是class字节码文件,如果想要查找其内部的class文件,需要将这个jar文件设置为文件路径,就好像设置classpath时:c:\java\jdk\lib\tools.jar

关于java源文件和编译后生成的class字节码文件的问题
1  
java文件可以视为class字节码文件的载体,一个java文件可以放置多个同级class文件,也可以放置内部类
比如1个java文件内有2个class,则编译后生成2个class文件,文件名分别为各自的类名,
如果1个java文件内有1个class,而这个class内还有1个class,即所谓的内部类 ,则编译后还是生成2个class文件,
1个是普通字节码文件;1个是内部类字节码文件,且其名字为普通字节码文件名$内部类字节码文件名
2
java文件内只能有0个或1个共有类(用public修饰的类),且共有类的名字必须和java文件名相同,一般类名的首字母大写。
0 0