Java 分成三种版本
Java 标准版(JSE Java Standard Edition) Java 微缩版(JME Java Micro Edition) Java 企业版(JEE Java Enterprise Edition)Java 标准组织: JCP(Java Community Process) 主要职能是发展和更新 Java 技术规范、参考实现(RI)、技术兼容包(TCK)
java语言特点: 简单的、面向对象、平台无关、多线程、分布式、安全、高性能、可靠的、解释型、自动垃圾回收等特点 - 平台无关性: 一次编写,到处运行:Write Once, Run Anywhere - 分布式:软件由很多个可以独立执行的模块组成,这些模块被分布在多台计算机上,可以同时运行,对外看起来还是一个整体
Java 文件, 上图的Hello.java。
2:编译编译后的文件叫做 class 文件,上图Hello.class 文件。
3:类装载 ClassLoader类装载的功能是为执行程序寻找和装载所需要的类。
4:字节码(byte-code)校验功能是对 class 文件的代码进行校验,保证代码的安全性。
5:解释(Interpreter)可是机器也不能认识 class 文件,还需要被解释器进行解释,机器才能最终理解我们所要表达的东西。
6:运行 (run)最后由运行环境中的 Runtime 对代码进行运行,真正实现我们想要机器完成的工作。
Java虚拟机JVM(Java Virtual Machine), Java 运行环境
基本功能:
(1):通过 ClassLoader 寻找和装载 class 文件
(2):解释字节码成为指令并执行,提供 class 文件的运行环境
(3):进行运行期间垃圾回收
(4):提供与硬件交互的平台
JVM 定义下列项:
指令集(相当于中央处理器[CPU] )
寄存器
类文件格式
栈
垃圾收集堆
存储区
JVM 的代码格式由紧缩有效的字节码构成。由JVM字节码编写的程序必须保持适当的类型约束。 大部分类型检查是在编译时完成。 任何从属的 Java 技术解释器必须能够运行任何含有类文件的程序,这些类文件应符合 Java 虚拟机规范中所指定的类文件格式。
在程序运行的过程中,存在被分配了的内存块不再被需要的情况,这些内存块对程序来讲就是垃圾。
产生了垃圾,自然就需要清理这些垃圾,更为重要的是需要把这些垃圾所占用的内存资源,回收回来,加以再利用,从而节省资源,提高系统性能。
不再需要的已分配内存应取消分配(释放内存)
在其它语言中,取消分配是程序员的责任
Java 编程语言提供了一种系统级线程以跟踪内存分配
垃圾收集
可检查和释放不再需要的内存
可自动完成上述工作
可在 JVM 实现周期中,产生意想不到的变化
在 C,C++ 或其它语言中,程序员负责释放内存
Java 编程语言解除了程序员释放内存的责任。它可提供一种系统级线程以跟踪每一次内存的分配情况。 在 Java 虚拟机的空闲周期,垃圾收集线程检查并释放那些可被释放的内存。垃圾收集在 Java 技术程序的生命周期中自动进行,它解除了释放内存的要求,这样能够有效避免内存漏洞和内存泄露(内存泄露就是程序运行期间,所占用的内存一直往上涨,很容易造成系统资源耗尽而降低性能或崩溃)。
(1):在 Java 里面,垃圾回收是一个自动的系统行为,程序员不能控制垃圾回收的功能和行为。比如垃圾回收什么时候开始,什么时候结束,还有到底哪些资源需要回收等,都是程序员不能控制的。
(2):有一些跟垃圾回收相关的方法,比如:System.gc() , 调用这些方法,仅仅是在通知垃圾回收程序,至于垃圾回收程序运不运行,什么时候运行,都是无法控制的。
(3):程序员可以通过设置对象为null(后面会讲到)来标示某个对象不再被需要了,这只是表示这个对象可以被回收了,并不是马上被回收。
Java 如何保证编写的代码是安全可靠:
(1):第一关:编写的代码首先要被编译成为 class 文件,如果代码写得有问题,编译期间就会发现,然后提示有编译错误,无法编译通过。(2):第二关:通过编译关后,在类装载(ClassLoader)的时候,还会进行类装载检查,把本机上的类和网络资源类相分离,在调入类的时候进行检查,因而可以限制任何“特洛伊木马”的应用。
(3):第三关:类装载后,在运行前,还会进行字节码校验,以判断你的程序是安全的。 Java 软件代码在实际运行之前要经过几次测试。
JVM将代码输入一个字节码校验器以测试代码段格式并进行规则检查--检查伪造指针、违反对象访问权限或试图改变对象类型的非法代码。
注意:所有源于网络的类文件都要经过字节码校验器
字节码校验器对程序代码进行四遍校验,这可以保证代码符合JVM 规范并且不破坏系统的完整性。如果校验器在完成四遍校验后未返回出错信息.
字节码校验要点:
类符合JVM规范的类文件格式 无访问限制异常 代码未引起操作数栈上溢或下溢 所有操作代码的参数类型将总是正确的 无非法数据转换发生,如将整数转换为对象引用 对象域访问是合法的(4):第四关:如果你的程序在网络上运行,还有沙箱(SandBox)的保护,什么是沙箱呢?就是如果你的程序没有获得授权,只能在沙箱限定的范围内运行,是不能够访问本地资源的,从而保证安全性。
关键字说明
•abstract:表明类或类中的方法是抽象的; •boolean:基本数据类型之一,布尔类型; •break:提前跳出一个块; •byte:基本数据类型之一,字节类型; •case:在 switch 语句中,表明其中的一个分支; •catch:用于处理例外情况,用来捕捉异常; •char:基本数据类型之一,字符类型; •class:类; •continue:回到一个块的开始处; •default:用在 switch 语句中,表明一个默认的分支; •do:用在 do while 循环结构中; •double:基本数据类型之一,双精度浮点数类型; •else:在条件语句中,表明当条件不成立时的分支; •extends:用来表明一个类是另一个类的子类; •final:用来表明一个类不能派生出子类,或类中的方法不能被覆盖,或声明一个变量是常量; •finally:用于处理异常情况,用来声明一个肯定会被执行到的块; •float:基本数据类型之一,单精度浮点数类型; •for:一种循环结构的引导词; •if:条件语句的引导词; •implements:表明一个类实现了给定的接口; •import:表明要访问指定的类或包; •instanceof:用来测试一个对象是否是一个指定类的实例; •int:基本数据类型之一,整数类型; •interface:接口; •long:基本数据类型之一,长整数类型; •native:用来声明一个方法是由与机器相关的语言(如 C/C++/FORTRAN 语言)实现的; •new:用来申请新对象; •package:包; •private:一种访问方式:私有模式; •protected:一种访问方式:保护模式; •public:一种访问方式:公共模式; •return:从方法中返回值; •short:基本数据类型之一,短整数类型; •static:表明域或方法是静态的,即该域或方法是属于类的; •strictfp:用来声明 FP-strict(双精度或单精度浮点数)表达式,参见 IEEE 754 算术规范; •super:当前对象的父类对象的引用; •switch:分支结构的引导词; •synchronized:表明一段代码的执行需要同步; •this:当前对象的引用; •throw:抛出一个异常; •throws:声明方法中抛出的所有异常; •transient:声明不用序列化的域; •try:尝试一个可能抛出异常的程序块 •void:表明方法不返回值; •volatile:表明两个或多个变量必须同步地发生变化; •while:用在循环结构中; •assert:声明断言; •enum:声明枚举类型;注意: - 关键字都是小写的 - goto 和 const 不是 Java 编程语言中使用的关键字,但是是 Java 的保留字 - true 和 false 不是关键字,而是 boolean 类型直接量
在 Java 编程语言中,标识符是赋予变量、类或方法的名称。
(1):首字母只能以字母、下划线、 开头,其后可以跟字母、下划线、 开 头 , 其 后 可 以 跟 字 母 、 下 划 线 、 和数字
(2):标识符区分大小写 (Java 都区分大小写);标识符不能是关键字;标识符长度没有限制
(3):标识符由多个单词构成时驼峰; 命名的有意义,望文知意; 少用$(1不习惯,2有情况特殊含义)
(4):由于 Java 语言使用 Unicode 字符集,所以字母包括:
‘A’-‘Z’和‘a’-‘z’;Unicode 字符集中序号大于 0xC0 的所有符号;Unicode 字符集支持多种看起来相同的字母;建议标识符中最好使用 ASCII 字母
(5):标识符不应该使用中文,虽然中文标识符也能够正常编译和运行,其原因如上一点讲到的:是把中文当作 Unicode 字符集中的符号来对待了。
错误的标识符及其原因分析如下:
My Variable //含有空格 9pins //首字符为数字 a+c //加号不是字母 testing1-2-3 //减号不是字母 It's //单引号不是字母 java¨ //与号不是字母数据类型简单的说就是根据数据的进行分类,划分的每种数据类型都具有区别于其它类型的特征,每一类数据都有相应的特点和操作功能。例如数字类型的就能够进行加减乘除的操作。
Java 中的基本数据类型分为八个原始数据类型,原始类型可分为四种:
(1):逻辑型 :boolean
只允许true 和 false;有些语言允许将数字值转换成逻辑值(所谓“非零即真”),Java不允许.
(2):字符型:char char表示单个字符,1个char代表1个16-bit(2个字节)无符号的(不分正负的)Unicode(\u????) 字符,char必须在单引号内.
char c1 = 'a'; char c2 = '\uae13'; char c3 = '\n';(3):整数型:byte(字节型)、short(短整型)、int(整型)、long(长整型)
(4):浮点型:float、double(小数默认double),表示小数或指数
double abc = 5.6; //小数默认double float abc = 5.6F; float abc = 5.6f; double abc = 5.6D; double abc = 5.6d;String 多个字符,用双引号,字符数量是任意多个。字符本身符合 Unicode 标准,可以反斜线符号(转义字符)。与 C 和 C++不同,String 不能用 \0 作为结束。
char 和 String 类型变量的声明和初始化如下所示:
char ch = ‘A’; // 声明并初始化一个字符变量
char c2 = ‘\uae13’; //unicode定义方式
char ch1,ch2 ; //声明两个字符变量
String greeting = “Good Morning !! \n” ; //基本字符,包含转义
String s2 = “\uae13\uae15”;//unicode定义方式
String str1,str2 ; // 声明两个字符串变量
注意:
(1):String 不是原始的数据类型,而是一个类(class)
(2):String 包含的字符数量是任意多个,而字符类型只能是一个。
要特别注意:”a” 表示的是字符串,而’a’表示的是字符类型,它们具有不同的功能。
(3):String 的默认值是 null
==示例:==
/** //打印结果如下 c1->a c2->긓 c3-> s1->cc s2->긓긕 */ char c1 = 'a'; char c2 = '\uae13'; char c3 = '\n'; String s1 = "cc"; String s2 = "\uae13\uae15"; System.out.println("c1->"+c1); System.out.println("c2->"+c2); System.out.println("c3->"+c3); System.out.println("s1->"+s1); System.out.println("s2->"+s2);Unicode 编码 Unicode 编码又叫统一码、万国码或单一码,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。 unicode 的表达如下: ‘\u????’ 一个 Unicode 字符。????应严格按照==四个16 进制数==进行替换。
占用空间: 2个byte(字节),16bit(位),4个16进制数(16bit=4*4 bit=4 个 2^4数字=4 个 16进制数字.)
转义字符是指,用一些普通字符的组合来代替一些特殊字符,由于其组合改变了原来字符表示的含义,因此称为“转义”。
常见的转义字符: \n 回车(\u000a) \t 水平制表符(\u0009) \b 空格(\u0008) \r 换行(\u000d) \f 换页(\u000c) \' 单引号(\u0027) \" 双引号(\u0022) \\ 反斜杠(\u005c)声明为 Java 程序实体引入标识符,能够使用这些名字访问到这些实体,声明实体包括:类名、属性名、方法名、变量名、参数名、接口名等等。其实简单点说就是定义某个东西并对外宣称它。
2)赋值:赋值就是为一个声明的变量或者常量赋予具体的值,也就是赋予值的意思。使用一个等号”=”来表示。
示例:int a = 5;这句话的意思就是,声明一个类型为 int 的变量 a,并将它赋值为 5。
常量是值不可以改变的标识符。
对常量的定义规则:建议大家尽量全部大写,并用下划线将词分隔。如:FILE_PATH
2)变量变量是值可以改变的标识符,用来引用一个存储单元,可以通过操作变量来操作变量所对应的内存区域或值块的值。
2.1) 变量说明(1):遵从所有标识符的规则;大小写混用,但首字符应小写;尽量不要使用下划线和$符号
(2):可以先声明再赋值,如:int i;i=9;也可以声明的同时进行赋值:int i=9;
(3):变量均具有: 名字、类型(基本或引用)、一定大小的存储单元以及值
类: 类名应该是名词,大小写可混用,但首字母应大写。
接口──接口名大小写规则与类名相同。
方法:方法名应该是动词,大小写可混用,但首字母应小写。在每个方法名内,大写字母将词分隔并限制使用下划线。
变量:所有变量都可大小写混用,但首字符应小写。词由大写字母分隔,限制用下划线,限制使用美元符号($),因为这个字符对内部类有特殊的含义。 变量应该代表一定的含义,通过它可传达给读者使用它的意图。尽量避免使用单个字符,除非是临时“即用即扔”的变量(例如,用 i, j, k 作为循环控制变量)
常量: 全部大写并用下划线将词分隔。MAXI_SIZE
控制结构: ─当语句是控制结构的一部分时,即使是单个语句也应使用括号({})将语句封闭。例如:
if (condition) { do something }else { do something else } 语句行: 每行只写一个语句并使用四个缩进的空格使你的代码更易读。x++ 和+ +x , x++是先使用,然后再加;++x 是先加然后再使用
字符可以比较大小(用它们的 ascii 码,化为整数)
右移一位(>>)相对于除以 2:左移(<<)相对于乘以 2。
System.out.println(10>>1);-->5 System.out.println(10>>1>>1);-->2 System.out.println(10>>1>>1>>1);-->1 System.out.println(10>>1>>1>>1>>1);-->0 System.out.println(10>>1>>1>>1>>1>>1);-->0 System.out.println(20<<2);-->80表示选择分支
switch (expr){ case expr2: statements; break; case expr3: statements; break; default: statements; //break; }expr只能是整数型的值或者 enum 枚举类型的常量值,包含byte、short、int 和 char,不能是字符串或对象,也不能是 long 型的值. 注意勿忘break;
文中内容根据网络文字总结.
