「算数编码java」算数编码的优缺点
今天给各位分享算数编码java的知识,其中也会对算数编码的优缺点进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
本文目录一览:
- 1、java都有哪些运算符及其用法
- 2、java一维码怎么用
- 3、java学习作为一名java初学者,如何快速学习j
- 4、介绍几个你比较熟悉的设计模式,并简单介绍它们是如何实现的
- 5、java基础都有那些?
- 6、java编程规范!!!
java都有哪些运算符及其用法
Java的
可分为4类:算术
、关系
、
和
符。
1.算术运算符
Java的算术运算符分为一元运算符和二元运算符。一元运算符只有一个
;二元运算符有两个
,运算符位于两个
之间。算术运算符的操作数必须是数值类型。
(1)一元运算符:
一元运算符有:正(+)、负(-)、加1(++)和减1(--)4个。
加1、减1运算符只允许用于数值类型的变量,不允许用于表达式中。加1、减1运算符既可放在变量之前(如++i),也可放在变量之后(如i++),两者的差别是:如果放在变量之前(如++i),则变量值先加1或减1,然后进行其他相应的操作(主要是赋值操作);如果放在变量之后(如i++),则先进行其他相应的操作,然后再进行变量值加1或减1。
例如:
int i=6,j,k,m,n;
j = +i; //取原值,即j=6
k = -i; //取负值,即k=-6
m = i++; //先m=i,再i=i+1,即m=6,i=7
m = ++i; //先i=i+1,再m=i,即i=7,m=7
n = j--; //先n=j,再j=j-1,即n=6,j=5
n = --j; //先j=j-1,再n=j,即j=5,n=5
在书写时还要注意的是:一元运算符与其前后的操作数之间不允许有空格,否则编译时会出错。
(2)二元运算符
二元运算符有:加(+)、减(-)、乘(*)、除(/)、取余(%)。其中+、-、*、/完成加、减、乘、除
,%是求两个操作数相除后的余数。
%求余操作举例:
a % b = a - (a / b) * b
取余运算符既可用于两个操作数都是整数的情况,也可用于两个操作数都是
(或一个操作数是
)的情况。当两个操作数都是
时,例如7.6 % 2.9时,计算结果为:7.6 - 2 * 2.9 = 1.8。
当两个操作数都是int类型数时,a%b的计算公式为:
a % b = a - (int)(a / b) * b
当两个操作数都是long类型(或其他整数类型)数时,a%b的计算公式可以类推。
当参加二元运算的两个操作数的
不同时,所得结果的
与精度较高(或位数更长)的那种
一致。
例如:
7 / 3 //整除,运算结果为2
7.0 / 3 //除法,运算结果为2.33333,即结果与精度较高的类型一致
7 % 3 //取余,运算结果为1
7.0 % 3 //取余,运算结果为1.0
-7 % 3 //取余,运算结果为-1,即运算结果的符号与左操作数相同
7 % -3 //取余,运算结果为1,即运算结果的符号与左操作数相同
2.关系运算符
关系运算符用于比较两个数值之间的大小,其运算结果为一个逻辑类型的数值。关系运算符有六个:等于(==)、不等于(!=)、大于()、大于等于(=)、小于()、小于等于(=)。
例如:
9 = 8 //运算结果为false
9.9 = 8.8 //运算结果为true
'A' 'a' //运算结果为true,因字符'A'的Unicode编码值小于字符'a'的
要说明的是,对于大于等于(或小于等于)关系运算符来说,只有大于和等于两种关系运算都不成立时其结果值才为false,只要有一种(大于或等于)关系运算成立其结果值即为true。例如,对于9 = 8,9既不小于8也不等于8,所以9 = 8 的运算结果为false。对于9 = 9,因9等于9,所以9 = 9的运算结果为true。
3.
要求操作数的数据类型为逻辑型,其运算结果也是逻辑型值。逻辑运算符有:
()、
(||)、逻辑非(!)、逻辑
(^)、
()、
(|)。
是表示逻辑运算功能的一种直观方法,其具体方法是把逻辑运算的所有可能值用表格形式全部罗列出来。Java语言逻辑运算符的
如下:
逻辑运算符的
A B AB A||B !A A^B AB A|B
false false false false true false false false
true false false true false true false true
false true false true true true false true
true true true true false false true true
前两列是参与逻辑运算的两个逻辑变量,共有4种可能,所以表2.5共有4行。后6列分别是6个逻辑运算符在逻辑变量A和逻辑变量B取不同数值时的运算结果值。
要说明的是,两种
(和)的运算规则基本相同,两种
(||和|)的运算规则也基本相同。其区别是:和|运算是把逻辑表达式全部计算完,而和||运算具有短路计算功能。所谓短路计算,是指系统从左至右进行逻辑表达式的计算,一旦出现计算结果已经确定的情况,则计算过程即被终止。对于运算来说,只要运算符左端的值为false,则因无论运算符右端的值为true或为false,其最终结果都为false。所以,系统一旦判断出运算符左端的值为false,则系统将终止其后的计算过程;对于 || 运算来说,只要运算符左端的值为true,则因无论运算符右端的值为true或为false,其最终结果都为true。所以,系统一旦判断出|| 运算符左端的值为true,则系统将终止其后的计算过程。
例如,有如下逻辑表达式:
(i=1) (i=100)
此时,若i等于0,则系统判断出i=1的计算结果为false后,系统马上得出该逻辑表达式的最终计算结果为false,因此,系统不继续判断i=100的值。短路计算功能可以提
序的运行速度。
作者建议读者:在程序设计时使用和||运算符,不使用和|运算符。
用逻辑与()、逻辑或(||)和逻辑非(!)可以组合出各种可能的逻辑表达式。逻辑表达式主要用在 if、while等语句的条件组合上。
例如:
int i = 1;
while(i=1) (i=100) i++; //循环过程
上述程序段的循环过程将i++语句循环执行100次。
4.
符
是以二进制位为单位进行的运算,其操作数和运算结果都是整型值。
位运算符共有7个,分别是:位与()、位或(|)、位非(~)、位
(^)、右移()、左移()、0填充的右移()。
位运算的位与()、位或(|)、位非(~)、位
(^)与逻辑运算的相应操作的真值表完全相同,其差别只是位运算操作的操作数和运算结果都是二进制整数,而逻辑运算相应操作的操作数和运算结果都是逻辑值。
位运算示例
运算符 名称 示例 说明
位与 xy 把x和y按位求与
| 位或 x|y 把x和y按位求或
~ 位非 ~x 把x按位求非
^ 位异或 x^y 把x和y按位求异或
右移 xy 把x的各位右移y位
左移 xy 把x的各位左移y位
右移 xy 把x的各位右移y位,左边填0
举例说明:
(1)有如下程序段:
int x = 64; //x等于
的01000000
int y = 70; //y等于
的01000110
int z = xy //z等于
的01000000
即运算结果为z等于二进制数01000000。位或、位非、位异或的运算方法类同。
(2)右移是将一个二进制数按指定移动的位数向右移位,移掉的被丢弃,左边移进的部分或者补0(当该数为正时),或者补1(当该数为负时)。这是因为整数在机器内部采用
表示法,正数的符号位为0,负数的符号位为1。例如,对于如下程序段:
int x = 70; //x等于二进制数的01000110
int y = 2;
int z = xy //z等于二进制数的00010001
即运算结果为z等于二进制数00010001,即z等于
17。
对于如下程序段:
int x = -70; //x等于二进制数的11000110
int y = 2;
int z = xy //z等于二进制数的11101110
即运算结果为z等于二进制数11101110,即z等于
-18。要透彻理解右移和左移操作,读者需要掌握整数机器数的
表示法。
(3)0填充的右移()是不论被移动数是正数还是负数,左边移进的部分一律补0。
5.其他运算符
(1)赋值运算符与其他运算符的简捷使用方式
赋值运算符可以与二元算术运算符、逻辑运算符和位运算符组合成简
算符,从而可以简化一些常用表达式的书写。
赋值运算符与其他运算符的简捷使用方式
运算符 用法 等价于 说明
+= s+=i s=s+i s,i是数值型
-= s-=i s=s-i s,i是数值型
*= s*=i s=s*i s,i是数值型
/= s/=i s=s/i s,i是数值型
%= s%=i s=s%i s,i是数值型
= a=b a=ab a,b是逻辑型或整型
|= a|=b a=a|b a,b是逻辑型或整型
^= A^=b a=a^b a,b是逻辑型或整型
= s=i s=si s,i是整型
= s=i s=si s,i是整型
= s=i s=si s,i是整型
(2)方括号[]和圆括号()运算符
方括号[]是数组运算符,方括号[]中的数值是数组的下标,整个表达式就代表数组中该下标所在位置的元素值。
圆括号()运算符用于改变表达式中运算符的
。
(3)字符串加(+)运算符
当操作数是字符串时,加(+)运算符用来合并两个字符串;当加(+)运算符的一边是字符串,另一边是数值时,机器将自动将数值转换为字符串,这种情况在输出语句中很常见。如对于如下程序段:
int max = 100;
System.out.println("max = "+max);
计算机屏幕的输出结果为:max = 100,即此时是把变量max中的整数值100转换成字符串100输出的。
(4)
(?:)
(?:)的语法形式为:
表达式1 ?表达式2 : 表达式3
的运算方法是:先计算表达式1的值,当表达式1的值为true时,则将表达式2的值作为整个表达式的值;当表达式1的值为false时,则将表达式3的值作为整个表达式的值。如:
int a=1,b=2,max;
max = ab?a:b; //max等于2
(5)
符
符能将一个表达式的类型强制转换为某一指定数据类型,其语法形式为:
(类型)表达式
(6)对象运算符instanceof
对象运算符instanceof用来测试一个指定对象是否是指定类(或它的子类)的实例,若是则返回true,否则返回false。
(7)点运算符
点运算符“.”的功能有两个:一是引用类中成员,二是指示包的层次等级。
6.运算符的
以下按
从高到低的次序列出Java语言中的所有运算符,表中结合性一列中的“左右”表示其运算次序为从左向右,“右左”表示其运算次序为从右向左。
优先级 运算符 结合性
1 . [] () ; ,
2 ++ ―― += ! ~ +(一元) -(一元) 右左
3 * / % 左右
4 +(二元) -(二元) 左右
5 左右
6 = = instanceof 左右
7 = = != 左右
8 左右
9 ^ 左右
10 | 左右
11 左右
12 || 左右
13 ?: 右左
14 = *= /= %= += -= = = = = ^= |= 右左
java一维码怎么用
一维条码 1.1 一维条码简述条码是将线条与空白按照一定的编码规则组合起来的符号, 用以代表一定的 字母、数字等资料。在进行辨识的时候,是用条码阅读机扫描,得到一组反射光 信号,此信号经光电转换后变为一组与线条、空白相对应的电子讯号,经解码后 还原为相应的文数字,再传入电脑。 世界上约有 225 种以上的一维条码,每种一维条码都有自己的一套编码规 格,规定每个字母(可能是文字或数字或文数字)是由几个线条(Bar)及几个空白 (Space)组成, 以及字母的排列。 一般较流行的一维条码有 39 码、 码、 EAN UPC 码、 128 码,以及专门用於书刊管理的 ISBN、ISSN 等。 表1 年 1982 1983 1984 1984 1984 Code39 条码 一维条码标准制定年代表 纳入标准 Military Standard 1189 ANSI MH10.8M ANSI MH10.8M AIAG 标准 HIBC 标准 Code39, Interleaved 2 of 5, Codabar UPC Code39 Code39 从 UPC 以后,为满足不同的应用需求,陆陆续续发展出各种不同的条码标准 和规格,时至今日,条码已成为商业自动化不可缺少的基本条件。条码可分为一 维条码 (One Dimensional Barcode, 1D) 和二维码(Two Dimensional Code, 2D) 两大类, 目前在商品上的应用仍以一维条码为主, 故一维条码又被称为商品条码, 二维码则是另一种渐受重视的条码,其功能较一维条码强,应用范围更加广泛。 1.2 一维条码规格的内容在一个条码的起头及结束的地方,都会放入起始码及结束码,用以辨识条 码的起始及结束,不过不同条码规格的起始码及结束码的图样并不完全相同。具 体而言,每一种条码规格明定了下列七个要项: 1、 字元组合 、 字元组合(Character Set) 每一种条码规格所能表示的字元组合,有不同的范围及数目,有些条码规格 只能表示数字,如 UPC 码、EAN 码;有些则能表示大写英文字及数字,甚至能表 示出全部 ASCII 字元表上的 128 字元,如 39 码、128 码。 2、 符号种类 、 符号种类(Symbology Type) 依据条码被解读时的特性可将条码规格分成两大类: 分散式 每一个字元可以独自地解码,列印时每个字元与旁边的字元间,是由字间距 分开的,而且每个字元固定是以线条做为结束。然而,并不一定是每一个字间距 的宽度大小都必须相同,可以容许某些程度的误差,只要彼此差距不大即可,如 此,对条码印表机(Barcode Printer)的机械规格要求可以比较宽松。例如 39 码与 128 码。 连续式 字元之间没有字间距,每个字元都是线条开始,空白结束。且在每一个字的 结尾后,马上就紧跟下一个字元的起头。由於无字间距的存在,所以在同样的空 间内,可列印出较多的字元数,但相对地,因为连续式条码的密度比较高,其对 条码机的列印精密度的要求也较高。例如 UPC 和 EAN 码。 3、 粗细线条的数目 、 条码的编码方式, 是藉由许多粗细不一的线条及空白的组合方式来表示不同 的字元码。大多数的条码规格都是只有粗和细两种线条,但也有些条码规格使用 到二种以上不同粗细的线条。 4、 固定或可变长度 、 指在条码中包含的资料长度是固定或可变的, 有些条码规格因限於本身结构 的关系,只能使用固定长度的资料,如 UPC 码、EAN 码。 5、 细线条的宽度 、 指条码中细线条及空白的宽度, 通常是某个条码中所有细的线条及空白的平 均值,而且它使用的单位通常是 mil (千分之一英寸,即 0.001 inch)。 6、 密度 、 指在一固定长度内可表示字元数目,例如条码规格 A 的密度高於条码规格 B 的密度,则表示当两者密度值相同时,在同一长度内,条码 A 可容纳得下较多的 字元。 7、 自我检查 、 指某个条码规格是否有自我检测错误的能力,会不会因一个列印上的小缺 陷,而可能使得一个字元被误判成为另外一个字元。有「自我检查」能力的条码 规格,大多没有硬性规定要使用「检查码」 ,例如 39 码。没有「自我检查」能力 的条码规格,在使用上大多有「检查码」的设定,如 EAN 码、UPC 码等。 1.3 一维条形码符号的结构 一维条形码符号的通常一个完整的条码是由两侧静空区、起始码、资料码、检查码、终止码组 成,以一维条码而言,其排列方式通常如下所示: 静空区: 静空区: 位於条码两侧无任何符号及资讯的白色区域,主要用来提示扫瞄器准备扫瞄。 起始码: 起始码: 指条码符号的第一位字码,用来标识一个条码符号的开始,扫瞄器确认此字码存 在后开始处理扫瞄脉冲。 资料码: 资料码: 位於起始码后面的字码,用来标识一个条码符号的具体数值,允许双向扫瞄。 检查码: 检查码: 用来判定此次阅读是否有效的字码,通常是一种算术运算的结果,扫瞄器读入条 码进行解码时,先对读入各字码进行运算,如运算结果与检查码相同,则判定此 次阅读有效。 1.4 一维码的类别 1.4.1 UPC 码 UPC 码(Universal Product Code)是最早大规模应用的条码,其特性是一种 长度固定、 连续性的条码, 目前主要在美国和加拿大使用, 由於其应用范围广泛, 故又被称万用条码。 UPC 码仅可用来表示数字,故其字码集为数字 0~9。UPC 码共有 A、B、C、D、 E 等五种版本,各版本的 UPC 码格式与应用对象如表 2 所示。表 2 UPC 码的各种版本 版本 UPC-A UPC-B UPC-C UPC-D UPC-E 注:S-系统码 应用对象 通用商品 医药卫生 产业部门 仓库批发 商品短码 X-资料码 C-检查码 SXXXXX XXXXXC SXXXXX XXXXXC XSXXXXX XXXXXCX SXXXXX XXXXXCXX XXXXXX 格 式 下面将再进一步介绍最常用的 UPC 标准码(UPC-A 码)和 UPC 缩短码(UPC-E 码) 的结构与编码方式。 UPC1.4.1.1 UPC-A 码 UPC1.4.1.2 UPC-E 码 1.4.2 EAN 码依结构的不同,可区分为: 依结构的不同,可区分为: EAN 码是国际物品编码协会制定的一种商品用条码,通用于全世界。EAN 码符号有标准版(EAN-13)和缩短版(EAN-8)两种标准版表示 13 位数字,又称 为 EAN13 码,缩短版表示 8 位数字,又称 EAN8。两种条码的最后一位为校验位, 由前面的 12 位或 7 位数字计算得出。两种版本的编码方式可参考国标 GB-12094-1998。 1.4.2.1 EAN-13 码 1.4.2.2 EAN-8 码 1.4.3 ISBN 码 ISBN 与 ISSNEAN 的用途很广, 除了我国的商品条码 CAN 以及日本商品条码 JAN 外,目前国际认可的书籍代号与期刊号的条码,也都是由 EAN 变身而来的。 简单来说,ISBN 与 EAN 的对应关系为:978 + ISBN 前 9 码 + EAN 检查码。 ISBN10 ISBN 13 ISBN 13 Dual 1.4.4 ISSN 码国际标准期刊号 ( International Standard Serial Number,简称 ISSN ), ISSN 与 EAN 的对应关系为:977 + ISSN 前 7 码 + 00 + EAN 检查码。 1.4.5 128 码 128 码开始于 1981 年推出,是一种长度可变、连续性的字母数字条码。与 其他一维条码比较起来,128 码是较为复杂的条码系统,而其所能支援的字元也 相对地比其他一维条码来得多,又有不同的编码方式可供交互运用,因此其应用 弹性也较大。 EANEAN-128 码 GSIGSI-128 码 UCCUCC-128 1.4.6 三九码 Code39 码(也被称为“ USS Code 39”、“Code 3/9”、“Code 3 of 9 ”、 “USD-3”、“ Alpha39 ”、“类型 39 ” )是一种条码类型,可以编码大写 字母( a 到 z ) ,数字( 0 到 9 )和少数特殊字符,如$符号等。条码本身不 包含检查码(相反,例如,代码 128 ) ,但它可以被视为自检一些,理由是一 个错误的解释,律师无法生成另一种有效的字符。可能是最严重的缺点是它的 Code39 码的数据存储密度低: 它需要更多的空间编码数据的 Code39 码比, 例如, 在代码 128 。 这意味着, 非常小的货物不能标记 Code39 码的条码。 然而, Code39 码仍然是广泛使用的, 可解码几乎任何条形码阅读器。 好处之一是, Code39 码, 因为没有必要产生一个校验数位,它可以很容易地集成到现有的印刷系统,增加 了条码打印机字体的系统或打印机,然后打印的原始数据中的字体。 宽度之间的比例缩小和广泛之间可以选择 1:2 和 1:3 。 1.4.6.1 Code 39 1.4.6.2 Code 39 Full SCII 普通的 39 码只能识别 43 个字符,如果想识别这 43 个以外的 ASCII 码,那么就要用 到 Code 39 Full ASCII。Code 39 Full ASCII 主要用于生产制造业,军事制造以及保健器材等方 面。 1.4.6.3 Trioptic 39 Trioptic 39 码是39 码的一个变种,应用于磁带和计算机耗材的标记。 Trioptic 39码是定长码,包含1 个起始符、6 个数据字符和1 个终止符。 Trioptic 39 码起始符/终止符传送:Trioptic 39 码的起始符和终止符是 “*”。如使能,输出字符数据包含两个“$”。 1.4.7 二五条码二五条码研制于 60 年代后期,它用于仓库的分类管理,标示胶卷包装及机 票的连续号等。 图:二五条码 二五条码有两种单元宽度,它仅用条表示信息,条码字符由规则排列 的 5 个条组成,其中两个是宽条,其余是窄条。二五条码的编码容量为 C(5,2)=10 ,所以它的字符集为数字字符 0-9 。二五条码是一种非连续型、双 向可读且具有自校验功能的非定长条码。 1.4.7.1 Interleaved 2 of 5(交叉 25 码) ( 交插二五条码是由美国 intermec 公司与 1972 年发明, 初期应用于仓储及重工 业领域,标准化后用于储运单元的识别与管理。 1.4.7.2 Industrial 2 of 5 交叉 25 码是一个连续两个宽度条码符号编码位数。它是用于商业的 135 电 影和纸箱的一些产品,而产品内标记有 UPC 或 EAN 的。 1.4.7.3 Matrix 2 of 5 1.4.8 China Post 中国邮政条码是通过更改 Matrix 2 of 5 而来,更改了启动和停止字符。 1.4.9 九三码 九三码 Code 93 码的条码符号是由 Intermec 公司于 1982 年设计的 提供更高的密 度和数据安全增强码 39 。它是一个字母,长度可变符号。代码 93 主要用于由 加拿大邮政编码补充提供的资料。每一个符号包括两个检查字符。 1.4.10 库德巴条码(codabar) 库德巴条码( )库德巴条码是 1972 年推出的, 它广泛应用于医疗卫生及图书行业, 1977 年美国输血协会将库德巴条码规定为血袋标识标准条码。 1.4.11 CODE 11(USD-8) 11 条码主要用于通讯设备,电信领域。 1.4.12 MSI Plessey MSI Plessey 条码是 Plessey 条码变种。它是一个脉冲宽度调制非自检查代码, 用在商店货架标签为主。 1.4.13 Plessey Plessey 码产生于英国,并推动了 MSI、Anker 和 Telxon 的发展。 1.4.14 PostNet (3 of 5) ) PostNet 条码是美国邮政自动处理邮件使用的。 1.4.15 Australia Post 澳大利亚邮政条码 1.4.16 Code 32 Code 主要用意大利医药产品的编码。 1.4.17 Deutsche Post Identcode/Leitcode Identcode/Leitcode 主要用于德国的邮政。 1.4.18 JAN-13 JAN-13 基本上是 EAN-13 的另外一个名字,是日本的物件的条码。 1.4.19 JAN-8 JAN-8 是 EAN-8 在日本的名字。 1.4.20 Numly Numly 是一个独特的标识,它允许作者和出版社为出版物的内容分配 ID 进行跟 踪。 1.4.21 Opc Opc 主要用于制造零售的光学产品。 1.4.22 Pharmacode Pharmacode 是一个用于制药产业包装控制标准,它能在有些许错误的情况 下准确读出,只有一个读取方向是正确的,可以彩色印刷。 1.4.23 Planet The PostaL Alpha Numeric Encoding Technique (PLANET),主要是美国在 邮电业服务使用,对邮寄的物品进行识别和辨认。 1.4.24 PZN PZN 主要德国人用于药物和保健产品的分发。 1.4.25 Royal Mail(RM4SCC) ( ) 1.4.26 KIX KIX 产生于 1999 年,荷兰用其进行信件的编排分类。 1.4.27 Scc14 SCC-14(shipping Container Code)用于对集装箱运输。 1.4.28 Singapore Post 1.4.29 ITF 条码 ITF 条码是用于储运单元的条码符号, ITF 条码符有 ITF -14,ITF -16 及 ITF-6(附加代码 add-on),他们都是定长型条码。 ITF-14 1.4.30 SSCC 18 用于识别个人海运集装箱。 1.4.31 Swiss PostParcel PostParcel 主要用于包裹的识别。 1.4.32 Telepen Telepen 于 1972 年产生于英国,能表达 128 个不同的 ASCII。 1.4.33 UspsFim UspsFim 是一个识别标志,旨在协助邮件的自动化服务。 1.4.34 Intelligent Mail Intelligent Mail 是 UspsFim 的升级版,用于信件的分类和跟踪。 1.4.35 Usps Sack Label Usps Sack Label 主要用于美国邮政服务。 1.4.36 Usps Tray Label Usps Tray Label 主要用于美国邮政服务。 1.4.37 LOGMARS LOGMARS 是美国说明书条码。 1.4.38 ISMN ISMN (International Standard Music Number) 1.4.39 Leitcode 德国的邮政编码,主要用于德国的邮件母的地的解码。 1.4.40 USPS Facing Identification Mark 只表示有 ABCD,出现的时候只代表其中的一个 一下分别表示 ABCD
java学习作为一名java初学者,如何快速学习j
那首先来了解一下什么是java:
Java是SUN(Stanford University Network,斯坦福大学网络公司)1995年推出的一门高级编程语言,是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。
那么为什么要使用这个语言呢,Java语言的特点跨平台性,通过Java语言编写的应用程序在不同的系统平台上都可以运行。原理是只要在需要运行java应用程序的操作系统上,先安装一个Java虚拟机(JVM Java Virtual Machine)即可。由JVM来负责Java程序在该系统中的运行。
下面对java学习进行一次史无前例的剖析,细致的讲解零基础的人怎么学习Java。先看下Java在基础阶段的知识点路线图。
内容多吗?不要被吓到了,知识点剖析的比较细,所以看着比较多。不要害怕学不会,经过下面的详解,你就会明白这些知识点都是干嘛的了。
入门阶段,主要是培养Java语言的编程思想。了解Java语言的语法,书写规范等,掌握Eclipse、MyEclipse等开发工具,编写Java代码的能力。学完这个阶段你应该可进行小型应用程序开发并且可以对数据库进行基本的增删改查管理。注意:此阶段知识点的学习,会有真实的项目进行驱动学习,让你轻松理解各知识点。
1计算机基础知识
针对零基础学习的人,从对计算机操作等知识的了解,延伸到Java语言的发展与开发工具的使用上。主要是让你知道怎样执行计算机命令,认识Java这门语言,感受编程语言Java怎么开发程序。
1) 计算机基础
让零基础学习的人先了解计算机相关知识,进而再去了解Java语言。
2) DOS常用命令
了解什么是DOS,并掌握DOS控制台的打开方式,同时熟悉常用的DOS命令,例如:盘符切换、进入指定目录、删除文件等,完成使用DOS命令对计算机进行操作和控制。
3) Java概述
了解Java语言的发展史、Java语言平台版本、Java语言的特点,以及JRE与JDK。JRE是Java的运行环境,JDK是Java开发工具包,它包含了Java的开发工具以及JRE。所以安装了JDK就不用再单独安装JRE了。
4) JDK环境安装配置
了解了什么是JDK,以及JDK的重要性,下一步我们就来学习如何安装和配置JDK环境。在安装JDK之前,我们首先需要下载JDK,针对不同的系统,我们需要下载不用版本的JDK。
5) 环境变量配置
了解path、classpath环境变量,理解path变量和classpath变量的作用,并掌握path变量和classpath变量的配置方式。
6) Java程序入门
当JDK、环境变量配置完毕,我们就可以开始 编写Java程序。编写Java程序可以使用如下几种工具:notepad(微软操作系统自带)、Editplus、Notepad++、Eclipse、MyEclipse,sublime等等。
IntelliJ IDEA工具的使用(重点)
2编程基础
此模块学习是让你了解编程的具体流程,学习Java基础语法的格式等。具体要掌握不同数据类型的变量定义与使用,掌握不同运算符的运算规则,掌握流程控制语句的执行流程,编写方法的声明与调用,创建数组并访问数组元素等知识。
1) 注释
在程序开发工程中,用于解释和说明程序的文字我们称之为注释,Java中的注释分为以下几种:单行注释、多行注释、文档注释。
2) 关键字
了解Java关键字的含义及特点,掌握关键字使用的注意事项。
3) 标识符
了解什么是标识符,标识符的组成规则,以及标识符使用时的注意事项。
4) 常量与变量
理解常量与变量的含义,并掌握常量与变量的区别、变量的定义格式以及变量的赋值。
5) 数据类型
掌握Java语言的数据类型,如基本数据类型:byte、short、int、long、float、double、char、boolean,以及引用类型:类、接口、数组。
6) 运算符
熟练掌握Java中的运算符:算术运算符、赋值运算符、比较运算符、逻辑运算符、位运算符、三目运算符。
7) 流程控制语句
了解什么是流程控制语句,掌握以下流程控制语句:顺序结构、选择结构、循环结构,并能够通过流程控制语句实现特定的功能。
8) 方法
掌握方法的定义及格式,并能正确的调用方法,理解方法的调用过程,同时清楚方法的注意事项;掌握方法重载及其特点。
9) 数组
了解数组的概念,掌握数组的定义格式、静态初始化、动态初始化,并能够理解Java中数组的内存图解。熟练掌握数组的遍历、获取最值、数组元素逆序、数组元素查找、数组排序和二分查找,以及二维数组的定义格式及初始化。
3面向对象
现实世界中,随处可见的一种事物就是对象,对象是事物存在的实体,如人类、书桌、计算机、高楼大厦等。人类解决问题的方式总是将复杂的事物简单化,于是就会思考这些对象都是由哪些部分组成的。通常都会将对象划分为两个部分,即动态部分与静态部分。静态部分,顾名思义就是不能动的部分,这个部分被称为“属性”,任何对象都会具备其自身属性,如一个人,它包括高矮、胖瘦、性别、年龄等属性。然而具有这些属性的人会执行哪些动作也是一个值得探讨的部分,这个人可以哭泣、微笑、说话、行走,这些是这个人具备的行为(动态部分),人类通过探讨对象的属性和观察对象的行为了解对象。
1) 面向对象思想
了解面向过程编程思想,能够通过案例理解Java的面向对象编程思想,了解面向对象开发、设计、特征。
2) 类与对象
了解什么是类,什么是对象,并理解类与对象之间的关系;熟练掌握类的定义、对象内存图等。
3) 成员变量和局部变量
了解什么是成员变量,什么是局部变量,以及从他们在类中的位置、内存中的位置、生命周期、初始化值等方面掌握他们的区别。
4) 匿名对象
了解什么是匿名对象,掌握匿名对象的两种使用情况。
5) 封装
清楚的了解什么是封装,并能够理解封装的优点与缺点,同时掌握封装的原则。
6) this关键字
掌握this关键字的含义与使用。
7) 构造方法
了解什么是构造方法,构造方法的作用,以及与构造方法相关的注意事项。
8) 继承
理解什么是继承,继承的好处以及java中继承的特点和注意事项,继承中成员变量的关系、构造方法的关系、成员方法的关系,方法重写与方法重载的区别。
9) 多态
理解什么是多态,掌握多态案例及成员访问的特点,多态的优点和缺点,多态中的转型问题。
10) 抽象类
了解什么是抽象类,抽象类的特点,抽象类成员的特点。
11) 接口
了解什么是接口,接口的特点,接口成员的特点,类与类、类与接口的关系,以及抽象类与接口的区别。
12) 内部类
什么是内部类,内部类的访问特点,内部类的位置,什么是成员内部类、局部内部类、匿名内部类,以及匿名内部类在开发中的使用。
4、常用类
类库就是Java API(Application Programming Interface,应用程序接口),是系统提供的已实现的标准类的集合。在程序设计中,合理和充分利用类库提供的类和接口,不仅可以完成字符串处理、绘图、网络应用、数学计算等多方面的工作,而且可以大大提高编程效率,使程序简练、易懂。
学习内容:掌握Object类、Scanner类、String类、StringBuffer类、StringBuilder类、Arrays类、基本包装类、正则表达式、Math类、Random类、System类、Date类、DateFormate类、Calendar类,及其常用方法。
5、集合
集合类存放的都是对象的引用,而非对象本身,出于表达上的便利,我们称集合中的对象就是指集合中对象的引用。简单一点就是说,集合是存放数据的容器。
学习内容:什么是集合?数组与集合有什么区别,集合类的特点,掌握Collection接口、Iterator接口、List接口、ListIterator接口、ArrayList类、Vector类、LinkedList类、泛型、Set接口、HashSet类、Map接口、HashMap类、LinkedHashMap类等。
6、IO
IO(Input/Output)是计算机输出/输出的接口。Java的核心库提供了全面的IO接口,包括:文件读写,标准设备输出等等。Java中IO是以流为基础进行输入输出的,所有数据被串行化写入输出流,或者从输入流读入。
1) 异常
了解什么是异常,异常的由来,常见的异常,异常的分类,掌握jvm对异常的默认处理方案,异常的处理方案:try…catch…finally、throws,什么是编译时异常,什么是运行时异常,掌握它们两的区别,throws关键字、throw关键字,以及这两个关键字的区别,熟练掌握自定义异常,异常注意事项。
2) File类
了解什么是File类,File类的用途,掌握File类的方法:createNewFile()、mkdir()、mkdirs()、delete()、renameTo(File dest)、isDirectory()、isFile()、exists()、等方法,以及File类的基本获取功能方法和高级获取功能方法。
3) IO流
了解什么是IO流,IO流的用途;熟练掌握输入流、输出流、字符流、字节流、IO流的常用基类;如何使用字节流读写数据、复制数据;什么是字节缓冲流,如何使用字节缓冲流读写数据;什么是转换流,如何使用转换流更加高效的读写数据,内存操作流、打印流、标准输入输出流、序列化流、Properties集合。
4) IO流练习
(1) 复制文本文件;
(2) 复制图片;
(3) 把ArrayList集合中的字符串数据存储到文本文件;
(4) 从文本文件中读取数据(每一行为一个字符串数据)到集合中,并遍历集合;
(5) 复制单极文件夹;
(6) 复制单极文件夹中指定文件并修改文件名称;
(7) 复制多极文件夹;
(8) 已知s.txt文件中有这样的一个字符串:“hcexfgijkamdnoqrzstuvwybpl”;
(9) 请编写程序读取数据内容,把数据排序后写入ss.txt中;
(10) 获取每次读取数据的行号;
(11) 登录注册IO版。
7、多线程
是指从软件或者硬件上实现多个线程并发执行的技术。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能。具有这种能力的系统包括对称多处理机、多核心处理器以及芯片级多处理(Chip-level multithreading)或同时多线程(Simultaneous multithreading)处理器。在一个程序中,这些独立运行的程序片段叫作“线程”(Thread),利用它编程的概念就叫作“多线程处理(Multithreading)”。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程(台湾译作“执行绪”),进而提升整体处理性能。
1) 多线程
了解什么是线程,什么是多线程,理解java程序的运行原理,掌握多线程的实现方案,如何获取和设置线程名称、线程的生命周期、如何解决线程安全问题、线程同步、Lock锁、死锁问题、线程间通信、线程的状态及状态转换、线程池。
2) 多线程面试题
(1) 多线程有几种实现方案,分别是哪几种?
(2) 同步有几种方式,分别是什么?
(3) 启动一个线程是run()还是start()?它们的区别?
(4) sleep()和wait()方法的区别;
(5) 为什么wait(),notify(),notifyAll()等方法都定义在Object类中;
(6) 线程的生命周期图。
3) 设计模式
了解什么是设计模式,设计模式的分类,熟练掌握单例设计模式(懒汉式、饿汉式)。
8 、网络编程
网络编程最主要的工作就是在发送端把信息通过规定好的协议进行组装包,在接收端按照规定好的协议把包进行解析,从而提取出对应的信息,达到通信的目的。
9、反射
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
Java新特性:(重点及理解)
Java7特性重点:
switch支持String、泛型自动类型推断
理解:可catch多个异常,异常之间使用“|”分隔
Java8特性重点:Lambda表达式、接口中的默认方法和静态方法、新的Date API。
大家凑合着看看吧。
视频教程你可以去B站上看一下老杜的159集的视频教程,这套视频教程在B站上的播放量是140多万,你说这套视频教程好不好呢?
介绍几个你比较熟悉的设计模式,并简单介绍它们是如何实现的
以下是几种格式的专业解释:
HDTV
一,HDTV的概念
要解释HDTV,我们首先要了解DTV。DTV是一种数字电视技术,是目前传统模拟电视技术的接班人。所谓的数字电视,是指从演播室到发射、传输、接收过程中的所有环节都是使用数字电视信号,或对该系统所有的信号传播都是通过由二进制数字所构成的数字流来 完成的。数字信号的传播速率为每秒19.39兆字节,如此大的数据流传输速度保证了数字电视的高清晰度,克服了模拟电视的先天不足。同时,由于数字电视可以允许几种制式信号的同时存在,因此每个数字频道下又可分为若干个子频道,能够满足以后频道不断增多的 需求。HDTV是DTV标准中最高的一种,即High Definision TV,故而称为HDTV。
二,HDTV中要求音、视频信号达到哪些标准?
HDTV规定了视频必须至少具备720线非交错式(720p,即常说的逐行)或1080线交错式隔行(1080i,即常说的隔行)扫描(DVD标准为 480线),屏幕纵横比为16:9。音频输出为5.1声道(杜比数字格式),同时能兼容接收其它较低格式的 信号并进行数字化处理重放。
HDTV有三种显示格式,分别是:720P(1280×720P,非交错式),1080 i(1920×1080i,交错式),1080P(1920×1080i,非交错式),其中网络上流传的以720P和1080 i最为常见,而在微软WMV-HD站点上1080P的样片相对较多。
三,如何收看HDTV节目?
目前有两种方式可欣赏到HDTV节目。一种是在电视上实时收看HDTV,需要满足两个条件,首先是电视可接收到HDTV信号,这需要额外添加相关的硬件,其次是电视符合HDTV标准,主要是指电视的分辨率和接收端口而言。
另一种是在电脑上通过软件播放。目前我国只有极少部分地区可接收到HDTV数字信号,而且HDTV电视的价格仍高高在上,不是普通消费者所能承受的。因此,在网络中找寻HDTC源,下载后在个人电脑上播放,成了大多数HDTV迷们的一个尝鲜方法。
四,哪些是可用于电脑播放的HDTV文件?
网络中流传的HDTV主要以两类文件的方式存在,一类是经过MPEG-2标准压缩,以.tp和.ts为后缀的视频流文件,一类是经过WMV-HD (Windows Media Video High Definition)标准压缩过的.wmv文件,还有少数文件后缀为.avi或.mpg,其性质与.wmv是完全一样的。
HDTV文件都比较大,即使是经过重新编码过后的.wmv文件也非同小可。以一部普通电影的时间长度来计算,.wmv文件将会有4G以上,而同样时间长度的.tp和.ts文件能达到8G以上,有的甚至达到20多G。因此,除了通过文件后缀名,还可以通过文 件大小来判断是否为HDTV文件。
五,如何在个人电脑上播放HDTV节目?
对于.wmv文件,只要系统安装了Windows Media Player 9 或更高版本,就可以正常播放,一些播放软件的最新版本已经开始支持WMV-HD,如WINDVD6等,也可以直接使用这些软件播放HDTV。有些HDTV文件在压缩过程中采用了其它标准的编码格式,就需要安装对应的解码器,遇到Windows Media Player 9不能正常播放时,可以再安装ffdshow,它带有各种最常用的解码器。
播放以.tp和.ts为后缀的视频流文件要稍微麻烦一点,因为文件中分别包含有AC3音频信息和MPEG-2视频信息。好在现下有已经不少专门播放.tp 和.ts文件的软件问世了,Moonlight-Elecard MPEG Player 就是其中一款比较常见的支持HDTV播放的软件,目前最新的版本为2.x。安装完后,也可以运行其它播放软件来调用Moonlight- Elecard MPEG Player的解码器进行播放。
六,如何鉴别HDTV的显示格式?
目前我们无法仅从文件名称、大小上来判定一个HDTV文件的显示格式是720P还是1080i,或是1080P,但是有不少软件可以在播放时显示影片的图像信息,如WINDVD、zplay等,在软件的控制面板中选择对应的选项就可以看到详细的信息。
七,为什么我只能看到图像,却听不到声音?
这是因为未安装AC3音频解码器,导致HDTV文件中的音频信息不能被正确识别的原因。解决的方法是下载并安装对应的音频解码器,常用的有 AC3Filter,这些音、视频解码器只需安装一次即可,播放HDTV文件时系统会自动调用,而不必每次播 放的时候都打开其控制界面。
八,为什么我播放HDTV时会出现丢帧现象?
在家用电脑上播放HDTV,对其硬件配置要求较高,主要是与CPU、显存、内存紧紧相关,如果这三样中有一样性能过低,就会产生一些播放问题。播放 HDTV时会出现丢帧现象是显存容量不够造成的,尤其是在播放1080 i格式HDTV的时候,1920×1080的像素量,需要足够大的显存才能满足其数据吞吐,因此显存至少需要64M以上,建议128M。由于是2D显示,所以对显卡核心的运算能力要求反而不是很高。
九,为什么我播放HDTV时会经常出现画面和语音停顿的现象?
一些采用了WMV-HD重新编码的HDTV文件,因为有着较高的压缩率,在播放时就需要非常高的CPU运算能力来进行实时解码,一般来说P4 2.0G/AMD 2000+ 以上及同级别的CPU可达到这个要求。同时,由于HDTV的数据流较大,需要足够的内存来支持,推荐在256M以上。如果你的电脑满足不了这样的配置,就可能会在播放过程中产生画面与语音不同步、画面经常停顿、爆音等现象。严重的话甚至无法顺利观看。如果 这种现象不太严重,则可以通过优化系统和一些小技巧来改善。
十,如何优化系统以保证顺利地播放HDTV?
除非你的电脑硬件配置的确很强,否则就很可能需要对系统进行一些优化,以便可以顺利地播放HDTV。首先是在播放HDTV前关闭所有没有用的后台程序或进程,尽量增加系统的空闲资源为播放HDTV服务;其次是选择一款占用系统资源较低的软件来播放HDTV 。Windows Media Player、WINDVD等软件占用系统资源较多,在硬件配置本就不高的系统上会影响HDTV的播放效果,这时可以选择使用BSPlayer。 BSPlayer是一款免费软件,最大的特点就是占用系统资源很小,尤其在播放HDTV文件时,与其它几个资源占用大户相比效果更为明显。另外,运行播放软件后立即打开任务管理器(仅在Windows 2000/XP中有效),将播放软件的进程级别设置为最高,这样也可以为HDTV的播放调用更多的系统资源。除此之外,安装更高版本的 DirectX,也能更好地支持HDTV的播放。
十一,还有什么其它的技巧?
如果你的PC可以流利地播放HDTV,那么你唯一会感到遗憾的,可能就是抱怨显示器太小和音箱太不够劲了。音箱的问题没有好的方法可以解决,必竟PC音箱和家庭影院的音箱两者是不可同比的,然而我们可以通过调高显示器的分辨率来提高画面的清晰度和细节感。 现在主流的显示器为17寸纯平CRT(因为改变标准分辨率只会给LCD带来负面影响,因此这种方法只针对普通的CRT显示器),中低档的17寸显示器很难达到1600×1200以上的分辨率,即使达到了其水平扫描率也在60Hz以下,但是请不要忘了,电视 信号的水平扫描率也就是在这个水平上。720P的水平扫描率为60Hz,1080i则有50Hz和60Hz两种,分别为我国和美国地区的标准。也就是说,即使你在显示器水平扫描率为60Hz的状态下全屏观看HDTV或DVD等其它视频,你是感觉不到晃眼的 ,这主要是由于人眼对于动态和静态物体的感应不同造成的。因此你可以在观看HDTV的时候,放心地将显示器水平扫描率设为60Hz,进而将分辨率调高,平时使用再调回标准分辨率即可。
存放HDTV文件的硬盘分区必须转换为NTFS格式,因为一部HDTV电影通常是几个4.3GB的视频文件组成(为了方便刻录在DVD上面),而FAT32是无法管理2GB以上的文件的,因此务必转换分区格式。
H.264
JVT(Joint Video Team,视频联合工作组)于2001年12月在泰国Pattaya成立。它由ITU-T和ISO两个国际标准化组织的有关视频编码的专家联合组成。JVT的工作目标是制定一个新的视频编码标准,以实现视频的高压缩比、高图像质量、良好的网络适应性等目标。目前JVT的工作已被ITU-T接纳,新的视频压缩编码标准称为H.264标准,该标准也被ISO接纳,称为AVC(Advanced Video Coding)标准,是MPEG-4的第10部分。
H.264标准可分为三档:
基本档次(其简单版本,应用面广);
主要档次(采用了多项提高图像质量和增加压缩比的技术措施,可用于SDTV、HDTV和DVD等);
扩展档次(可用于各种网络的视频流传输)。
H.264不仅比H.263和MPEG-4节约了50%的码率,而且对网络传输具有更好的支持功能。它引入了面向IP包的编码机制,有利于网络中的分组传输,支持网络中视频的流媒体传输。H.264具有较强的抗误码特性,可适应丢包率高、干扰严重的无线信道中的视频传输。H.264支持不同网络资源下的分级编码传输,从而获得平稳的图像质量。H.264能适应于不同网络中的视频传输,网络亲和性好。
H.261是最早出现的视频编码建议,目的是规范ISDN网上的会议电视和可视电话应用中的视频编码技术。它采用的算法结合了可减少时间冗余的帧间预测和可减少空间冗余的DCT变换的混合编码方法。和ISDN信道相匹配,其输出码率是p×64kbit/s。p取值较小时,只能传清晰度不太高的图像,适合于面对面的电视电话;p取值较大时(如 p>6),可以传输清晰度较好的会议电视图像。H.263 建议的是低码率图像压缩标准,在技术上是H.261的改进和扩充,支持码率小于64kbit/s的应用。但实质上H.263以及后来的H.263+和H.263++已发展成支持全码率应用的建议,从它支持众多的图像格式这一点就可看出,如Sub-QCIF、QCIF、CIF、4CIF甚至16CIF等格式。
MPEG-1标准的码率为1.2Mbit/s左右,可提供30帧CIF(352×288)质量的图像,是为CD-ROM光盘的视频存储和播放所制定的。MPEG-l标准视频编码部分的基本算法与H.261/H.263相似,也采用运动补偿的帧间预测、二维DCT、VLC游程编码等措施。此外还引入了帧内帧(I)、预测帧(P)、双向预测帧(B)和直流帧(D)等概念,进一步提高了编码效率。在MPEG-1的基础上,MPEG-2标准在提高图像分辨率、兼容数字电视等方面做了一些改进,例如它的运动矢量的精度为半像素;在编码运算中(如运动估计和DCT)区分“帧”和“场”;引入了编码的可分级性技术,如空间可分级性、时间可分级性和信噪比可分级性等。近年推出的MPEG-4标准引入了基于视听对象(AVO:Audio-Visual Object)的编码,大大提高了视频通信的交互能力和编码效率。 MPEG-4中还采用了一些新的技术,如形状编码、自适应DCT、任意形状视频对象编码等。但是MPEG-4的基本视频编码器还是属于和H.263相似的一类混合编码器。
总之,H.261建议是视频编码的经典之作,H.263是其发展,并将逐步在实际上取而代之,主要应用于通信方面,但H.263众多的选项往往令使用者无所适从。MPEG系列标准从针对存储媒体的应用发展到适应传输媒体的应用,其核心视频编码的基本框架是和H.261一致的,其中引人注目的MPEG-4的“基于对象的编码”部分由于尚有技术障碍,目前还难以普遍应用。因此,在此基础上发展起来的新的视频编码建议H.264克服了两者的弱点,在混合编码的框架下引入了新的编码方式,提高了编码效率,面向实际应用。同时,它是两大国际标准化组织的共同制定的,其应用前景应是不言而喻的。
JVT的H.264
H.264是ITU-T的VCEG(视频编码专家组)和ISO/IEC的MPEG(活动图像编码专家组)的联合视频组(JVT:joint video team)开发的一个新的数字视频编码标准,它既是ITU-T的H.264,又是ISO/IEC的MPEG-4的第10 部分。1998年1月份开始草案征集,1999年9月,完成第一个草案,2001年5月制定了其测试模式TML-8,2002年6月的 JVT第5次会议通过了H.264的FCD板。2003年3月正式发布。
H.264和以前的标准一样,也是DPCM加变换编码的混合编码模式。但它采用“回归基本”的简洁设计,不用众多的选项,获得比H.263++好得多的压缩性能;加强了对各种信道的适应能力,采用“网络友好”的结构和语法,有利于对误码和丢包的处理;应用目标范围较宽,以满足不同速率、不同解析度以及不同传输(存储)场合的需求;它的基本系统是开放的,使用无需版权。
在技术上,H.264标准中有多个闪光之处,如统一的VLC符号编码,高精度、多模式的位移估计,基于4×4块的整数变换、分层的编码语法等。这些措施使得H.264算法具有很的高编码效率,在相同的重建图像质量下,能够比H.263节约50%左右的码率。H.264的码流结构网络适应性强,增加了差错恢复能力,能够很好地适应IP和无线网络的应用。
H.264的技术亮点
(1) 分层设计
H.264的算法在概念上可以分为两层:视频编码层(VCL:Video Coding Layer)负责高效的视频内容表示,网络提取层(NAL:Network Abstraction Layer)负责以网络所要求的恰当的方式对数据进行打包和传送。在VCL和NAL之间定义了一个基于分组方式的接口,打包和相应的信令属于NAL的一部分。这样,高编码效率和网络友好性的任务分别由VCL和NAL来完成。
VCL层包括基于块的运动补偿混合编码和一些新特性。与前面的视频编码标准一样,H.264没有把前处理和后处理等功能包括在草案中,这样可以增加标准的灵活性。
NAL负责使用下层网络的分段格式来封装数据,包括组帧、逻辑信道的信令、定时信息的利用或序列结束信号等。例如,NAL支持视频在电路交换信道上的传输格式,支持视频在Internet上利用RTP/UDP/IP传输的格式。NAL包括自己的头部信息、段结构信息和实际载荷信息,即上层的VCL数据。(如果采用数据分割技术,数据可能由几个部分组成)。
(2) 高精度、多模式运动估计
H.264支持1/4或1/8像素精度的运动矢量。在1/4像素精度时可使用6抽头滤波器来减少高频噪声,对于1/8像素精度的运动矢量,可使用更为复杂的8抽头的滤波器。在进行运动估计时,编码器还可选择“增强”内插滤波器来提高预测的效果。
在H.264的运动预测中,一个宏块(MB)可以按图2被分为不同的子块,形成7种不同模式的块尺寸。这种多模式的灵活和细致的划分,更切合图像中实际运动物体的形状,大大提高了运动估计的精确程度。在这种方式下,在每个宏块中可以包含有1、2、4、8或16个运动矢量。
在H.264中,允许编码器使用多于一帧的先前帧用于运动估计,这就是所谓的多帧参考技术。例如2帧或3帧刚刚编码好的参考帧,编码器将选择对每个目标宏块能给出更好的预测帧,并为每一宏块指示是哪一帧被用于预测。
(3) 4×4块的整数变换
H.264与先前的标准相似,对残差采用基于块的变换编码,但变换是整数操作而不是实数运算,其过程和DCT基本相似。这种方法的优点在于:在编码器中和解码器中允许精度相同的变换和反变换,便于使用简单的定点运算方式。也就是说,这里没有“反变换误差”。变换的单位是4×4块,而不是以往常用的8×8块。由于用于变换块的尺寸缩小,运动物体的划分更精确,这样,不但变换计算量比较小,而且在运动物体边缘处的衔接误差也大为减小。为了使小尺寸块的变换方式对图像中较大面积的平滑区域不产生块之间的灰度差异,可对帧内宏块亮度数据的16个4×4块的DC系数(每个小块一个,共16个)进行第二次4×4块的变换,对色度数据的4个4×4块的DC系数(每个小块一个,共4个)进行2×2块的变换。
H.264为了提高码率控制的能力,量化步长的变化的幅度控制在12.5%左右,而不是以不变的增幅变化。变换系数幅度的归一化被放在反量化过程中处理以减少计算的复杂性。为了强调彩色的逼真性,对色度系数采用了较小量化步长。
(4) 统一的VLC
H.264中熵编码有两种方法,一种是对所有的待编码的符号采用统一的VLC(UVLC :Universal VLC),另一种是采用内容自适应的二进制算术编码(CABAC:Context-Adaptive Binary Arithmetic Coding)。CABAC是可选项,其编码性能比UVLC稍好,但计算复杂度也高。UVLC使用一个长度无限的码字集,设计结构非常有规则,用相同的码表可以对不同的对象进行编码。这种方法很容易产生一个码字,而解码器也很容易地识别码字的前缀,UVLC在发生比特错误时能快速获得重同步。
图3显示了码字的语法。这里,x0,x1,x2,…是INFO比特,并且为0或1。图4列出了前9种码字。如:第4号码字包含INFO01,这一码字的设计是为快速再同步而经过优化的,以防止误码。
(5) 帧内预测
在先前的H.26x系列和MPEG-x系列标准中,都是采用的帧间预测的方式。在H.264中,当编码Intra图像时可用帧内预测。对于每个4×4块(除了边缘块特别处置以外),每个像素都可用17个最接近的先前已编码的像素的不同加权和(有的权值可为0)来预测,即此像素所在块的左上角的17个像素。显然,这种帧内预测不是在时间上,而是在空间域上进行的预测编码算法,可以除去相邻块之间的空间冗余度,取得更为有效的压缩。
如图4所示,4×4方块中a、b、...、p为16 个待预测的像素点,而A、B、...、P是已编码的像素。如m点的值可以由(J+2K+L+2)/ 4 式来预测,也可以由(A+B+C+D+I+J+K+L)/ 8 式来预测,等等。按照所选取的预测参考的点不同,亮度共有9类不同的模式,但色度的帧内预测只有1类模式。
(6) 面向IP和无线环境
H.264 草案中包含了用于差错消除的工具,便于压缩视频在误码、丢包多发环境中传输,如移动信道或IP信道中传输的健壮性。
为了抵御传输差错,H.264视频流中的时间同步可以通过采用帧内图像刷新来完成,空间同步由条结构编码(slice structured coding)来支持。同时为了便于误码以后的再同步,在一幅图像的视频数据中还提供了一定的重同步点。另外,帧内宏块刷新和多参考宏块允许编码器在决定宏块模式的时候不仅可以考虑编码效率,还可以考虑传输信道的特性。
除了利用量化步长的改变来适应信道码率外,在H.264中,还常利用数据分割的方法来应对信道码率的变化。从总体上说,数据分割的概念就是在编码器中生成具有不同优先级的视频数据以支持网络中的服务质量QoS。例如采用基于语法的数据分割(syntax-based data partitioning)方法,将每帧数据的按其重要性分为几部分,这样允许在缓冲区溢出时丢弃不太重要的信息。还可以采用类似的时间数据分割(temporal data partitioning)方法,通过在P帧和B帧中使用多个参考帧来完成。
在无线通信的应用中,我们可以通过改变每一帧的量化精度或空间/时间分辨率来支持无线信道的大比特率变化。可是,在多播的情况下,要求编码器对变化的各种比特率进行响应是不可能的。因此,不同于MPEG-4中采用的精细分级编码FGS(Fine Granular Scalability)的方法(效率比较低),H.264采用流切换的SP帧来代替分级编码。
H.264的性能测试
TML-8为H.264的测试模式,用它来对H.264的视频编码效率进行比较和测试。测试结果所提供的PSNR已清楚地表明,相对于MPEG-4(ASP:Advanced Simple Profile)和H.263++(HLP:High Latency Profile)的性能,H.264的结果具有明显的优越性,如图5所示。
H.264的PSNR比MPEG-4(ASP)和H.263++(HLP)明显要好,在6种速率的对比测试中,H.264的PSNR比MPEG-4(ASP)平均要高2dB,比H.263(HLP)平均要高3dB。6个测试速率及其相关的条件分别为:32 kbit/s速率、10f/s帧率和QCIF格式;64 kbit/s速率、15f/s帧率和QCIF格式;128kbit/s速率、15f/s帧率和CIF格式;256kbit/s速率、15f/s帧率和QCIF格式;512 kbit/s速率、30f/s帧率和CIF格式;1024 kbit/s速率、30f/s帧率和CIF格式。
实现难度
对每个考虑实际应用的工程师而言,在关注H.264的优越性能的同时必然会衡量其实现难度。从总体上说,H.264性能的改进是以增加复杂性为代价而获得的。目前全球也只有中国杭州海康威视数字技术有限公司在安防领域实现了H.264的实际应用,这一次我们走到了世界的前端!
1080p
1080P是标准层面上的HDTV或者硬件层面上FULL HD的最高标准之一,而FULL HD就是能够完全显示1920*1080像素或者说物理分辨率达到1920*1080的平板电视机。需要注意的是,FULL HD和先前很多厂家宣传的1080P并不是同样的概念。
但是我们走进卖场会发现大多数品牌商家都打着1080P的旗帜对外宣传,多少对我们的选购产生了阻碍.其实目前市场中的大多数平板电视都不是FULL HD,所谓的1080P只是支持1080P信号的接收并通过计算演变在屏幕上显示,大多数大屏幕平板电视都为1366*768,等离子中的部分产品更低,要达到FULL HD的概念,就必须屏幕达到1920*1080的物理分辨率以及至少30Hz的刷新率.
WAF
We Are Family 的简称 [我们是一家人]
WAF是韩国的一个影视制作小组,他们制作的DVDRIP是目前网上除了HDTV之外质量最好的,清晰度和音质都是上乘之作。
WAF的作品有以下特点:
1:严格控制每CD的容量,每CD的容量大小一般不超过0.05M(大家见过不少CD1是702M,CD2却是698M的现象吧)。
2:经过控制的容量,利于刻盘,(有些小组制作的容量经常可以超过702M,一CD盘的容量,这时候超刻技术就受重视了^_^)
3:分割片子时注意场景转换,极少造成一段场景有分裂感(例如4CD的《特洛伊》和4CD的《黑鹰》)。
4:每个片子压制的尺寸都以OAR为准,即导演原始版。
5:尺寸统一,几乎都是800线。(例:WAF20CD DTS版BOB,800*448,见过15CD的HDTVRIP版,居然有两种尺寸!)我不清楚,一部大片为什么大家会忍受得了分辨率为640甚至以下的版本?
6:有极强的负责任的制作态度,发现有瑕疵的一般都会推出修复版.
7:喜欢WAF的DTS和AC3音频和高码率压缩的视频.
8:WAF每部片分割成的CD数一般都比别的小组制作的要多,这是为了保证必要的画质和音质的质量。试想想有个加长版《角斗士》使用DTS音轨,却只分割成2CD,每CD有70多分钟长,不知这样压缩出来的片子画质能好到什么程度?
所以说,WAF小组出品的DVDRip一般都是网上最清晰的版本。
问题补充:
普通家用电视的分辨率是多少?是不是屏幕越大分辨率越高?
电视的NTSC标准为720x480 刷新率为60Hz , PAL为720x576,刷新率为50Hz。 我国电视广播采用 PAL制。
逐行电视接收隔行信号经过差补后可以达到逐行输出,同时75Hz刷新率 ,或者隔行输出,同时100Hz刷新率。
虽然PAL制可达576线,但普通电视的实际可分辨水平线数只有300~500。高清电视理论上可达720P 和1080i,就是说最多逐行720线。所以按理论来说,搞清电视用1024x768的VGA输入也勉强可以表现出来了,但实际因为聚焦不准,文字显示比能显示1024x768的显示器差很多,画面显示则没什么问题。
HDTV是不是没有经过压缩,最原始的视频?
网络中流传的HDTV主要以两类文件的方式存在,一类是经过MPEG-2标准压缩,以.tp和.ts为后缀的视频流文件,一类是经过WMV-HD (Windows Media Video High Definition)标准压缩过的.wmv文件,还有少数文件后缀为.avi或.mpg,其性质与.wmv是完全一样的。
H.264等压缩格式是不是为了方便网上传播?
在技术上,H.264标准中有多个闪光之处,如统一的VLC符号编码,高精度、多模式的位移估计,基于4块的整数变换、分层的编码语法等。这些措施使得H.264得算法具有很高的编码效率,在相同的重建图像质量下,能够比H.263节约50%左右的码率。H.264的码流结构网络适应性强,增加了差错恢复能力,能够很好地适应IP和无线网络的应用。
H.264能以较低的数据速率传送基于联网协议(IP)的视频流,在视频质量、压缩效率和数据包恢复丢失等方面,超越了现有的MPEG-2、MPEG-4和H.26x视频通讯标准,更适合窄带传输。
网上流传的Rip格式是什么意思?DVDRip
DVDRip理解:其实就是一种DVD的备份技术。
DVD我们都知道,目前非常优秀的媒体格式,MPEG2编码的视频;AC3、DTS的音轨。但是我们也知道DVD载体是DVD光盘,D5一张就有4.7G。显然,直接将DVD文件进行网络传送毫无实际价值可言,将这样的文件打包传到服务器上只会占用服务器的硬盘和大量的网络带宽。还没有多少人的网络带宽可以让他毫不动容地去下载一个7、8GB的文件只为了看两个小时电影,更不要说将它们保存下来,DVD刻录机这样的产品目前也不是一般人能拥有的。
这就需要rip了,将DVD的视频、音频、字幕剥离出来,再经过压缩或者其他处理,然后重新合成成多媒体文件。在更小的文件尺寸上达到DVD的是视听享受。
java基础都有那些?
一、标识符
java对各种变量、方法和类等要素命名时使用的字符序列成为标识符;通俗点,凡是自己可以起名字的地方都叫标识符,都遵守标识符的规则
1.标识符命名规则:
1)标识符由字符、下划线、美元符或数字组成。
2)标识符应以字符、下划线、美元符开头
3)java标识符大小写敏感,长度无限制
4)约定俗成,java标识符选取应该注意“见名知意”且不能与java语言的关键字(eclipes中带颜色的基本都是关键字)重名
二、关键字
java中一些赋以特定含义,用作专门用途的关键的字符串成为关键字(keyword);且大多数编辑器都会将关键字用特殊方式标出 所有java关键字都是小写英文
一些常用关键字:
三、java的基本数据类型
1.java常量
java的常量值用字符串表示,区分为不同的数据类型。如:整型常量:1234实型常量:3.14字符常量:’a’逻辑常量:true、false字符串常量:”HelloWorld”
注意:
1)区分字符常量和字符串常量
字符常量是单引号引起来的单个,字符串常量是双引号引起来的不限长度
由于java采用Unicode编码,每个字符占两个字节,因而可用天十六进制编码形式表示,当然也可以用一个中文表示(单个中文占用两个字节)
2)”常量”这个名次还会用在另外其他语境中表示值不可变的变量
2.java变量
java变量是程序中最基本的存储单元,其要素包括变量名,变量类型和作用域。java程序中每一个变量都属于特定的数据类型,在使用前必需对其进行声明,声明格式为:type varName [=value]例如:int i =100;foloat f=12.3f;double d1,d2,d3=0.123;(声明了三个变量,其中d1,d2是默认值,d3=0.123)String s=”hello”
从本质上讲,变量其实是内存中的一小块区域,使用变量名来访问这块区域,因此,每一个变量使用前必需先声明,然后必需进行赋值,才能使用。
1)java变量分类
按被声明的位置划分:
局部变量:方法或语句块内部定义的变量,只能在被定义的方法或语句块内使用
成员变量:方法外部、类的内部定义的变量,可以在整个类中使用,包括类里的方法或语句块内也可以使用
注意:类外面是不能有变量的声明的
按所属的数据类型划分:
基本数据类型变量
引用数据类型变量
四、运算符
java语言支持如下运算符:
算术运算符:+ - * / % ++ --
关系运算符: = = == !=
逻辑运算符:! | ^ ||
位运算符: | ^ ~
赋值运算符:=
拓展赋值运算符:+ = -= *= /=
字符串链接运算符:+
三目条件运算符 ? :
1.算数运算符
注意:
1)
位运算符中的!、、|、^跟罗技运算符相同,只是位运算符是对变量的二进制进行操作,我个人是用不到的,所以不在这里多做介绍
2)
++(—)
在前时先运算再取值
在后时先取值再运算
2.逻辑运算符
例如:
3.扩展赋值运算符
4.字符串连接符
“ + ”运算符两侧的操作数中只要有一个是字符串类型,系统会自动将另一个操作数转换为字符串然后进行连接,例如:
4 + 5 = 94 + “ab” = “4ab”
5.三目条件运算符
语法格式: x ? y : z 其中x为boolean类型表达式,先计算x的值,若为true,则整个三目运算的结果为表达式y的值,否则整个运算结果为表达式z的值。
五、表达式和语句
1.表达式
表达式是符合一定语法规则的运算符和操作数的序列,例如:a5.0 + a(a – b) * c – 4i 30 i %10 !=0
1)表达式的类型和值
表达式中的操作数进行运算得到的结果称为表达式的值
表达式值的数据类型即为表达式的类型
2)表达式的运算顺序
应按照运算符的优先级从高到低的顺序进行
优先级相同的运算符按照实现约定的结合方式进行
我个人觉得运算顺序这块是可以忽略的,首先我的逻辑思维能力不是特别强,另外我的记性也不是特别好,所以如果我需要在表达式中区分优先级的话我会选择加括号。但是我觉得对于一些比较复杂且关键的逻辑运算,如果个人逻辑运算能力加记忆都比较好可以保证不出错的话,善用罗技运算符优先级未尝不是一种不让别人看懂你代码copy的手段。算是一种小小的防护吧,反正我这种人是不会去尝试分析这种代码的,太累
2.分支(条件)语句
ifif … elseif … else if … else ifif … else if … else if …else
switch () {case xx:
……………case xx:
……………default:
……………}
1.java中switch语句只能探测int类型的值(char类型的值也可以,因为他可以转换城int类型)
2.小心case穿透,所以最好与break连用
3.多个case可以连用,如下的示例代码也可以这样写(当i=1,2,18都会输出18):
3.循环语句
for(…;…;…){……}while(…){……}先判断再执行大括号里面的内容,然后再判断是否要继续执行do{……} whille(…); 先执行大括号里面的内容再判断是否要继续执行
4.break continue语句
break语句用于终止某个语句块的执行。用在循环体语句中么可以强行退出循环continue语句用在循环体语句中,用于终止某次循环过程,跳过循环中continue语句下面未执行的循环,开始下一次循环过程
八、方法
java的方法类似于其他语言的函数,是一段用来完成特定功能的代码片段,声明格式:[修饰符1 修饰符2 …] 返回值类型 方法名 (形式参数列表) {
java语句}
形式参数:在方法被调用时用于接受外界输入的数据
实参:调用方法时实际纯给方法的数据
返回值:方法在执行完毕后返回给调用他的环境的数据
返回值类型:实现约定的返回值的数据类型,如无返回值,必需给出返回值类型void
java语言中调用方法:对象名.方法名(实参列表)
实参的数目、数据类型和次序必需和所调用方法声明的形参列表匹配
return语句终止方法的运行并指定要返回的数据
java中进行函数调用传递参数时,遵循值传递的原则:
基本类型传递的是该数据值本身,引用累心美国传递的是对对象的引用,而不是对象本身
例子中的方法1,前面定义的数据类型为void, 所以方法中不能有return返回值,方法4中因为有return返回值,所以前面必需定义为返回值的类型,也就是m4前面那个int
九、递归调用
递归调用是指在方法执行过程中出现该方法本身的调用
先看一个例子,这是一个简单的递归调用:
简单分析下:
1.首先main主方法中输出字符串,内容是test方法当参数等于5的时候的返回值2.然后将参数5传入test方法,返回值是:5 * test(4)3.再次将参数4传入test方法中,返回值是:4 * test(3)4.再将参数3传入test方法中,返回值是:3 * test(2)5.再讲参数2传入test方法中:返回值是:2 * test(1)6.再将参数1传入到方法中:返回值是:1然后程序开始往回走,返回值传入test(1)中得到2*1再往回走,将刚刚得到的2*1传入到test(2)中得到3*2*1还要往回走,将刚刚得到的3*2*1传入到test(3)中得到4*3*2*1还要往回走,将刚刚得到的4*3*2*1传入到test(4)中也就是test(5)的返回值,得到5*4*3*2*1最后将test5的返回值传入到我们的主方法输出于语句中5*4*3*2*1=120,那么我们的输出语句输出的应该为120
这就是简单的递归调用的例子了
再来看一个例子:
非递归的写法:
请自行领悟
最后奉上java基础语法完整学习路线图,除此之外还有精心整理的其他java学习路线图,学习书籍电子书,阿里巴巴手册,视频教程等即可点此领取:
java编程规范!!!
名称 Java语言编码规范(Java Code Conventions)
简介 本文档讲述了Java语言的编码规范,较之陈世忠先生《c++编码规范》的浩繁详尽,此文当属短小精悍了。而其中所列之各项条款,从编码风格,到注意事项,不单只Java,对于其他语言,也都很有借鉴意义。因为简短,所以易记,大家不妨将此作为handbook,常备案头,逐一对验。
1 介绍
1.1 为什么要有编码规范
1.2 版权声明
2 文件名
2.1 文件后缀
2.2 常用文件名
3 文件组织
3.1 Java源文件
3.1.1 开头注释
3.1.2 包和引入语句
3.1.3 类和接口声明
4 缩进排版
4.1 行长度
4.2 换行
5 注释
5.1 实现注释的格式
5.1.1 块注释
5.1.2 单行注释
5.1.3 尾端注释
5.1.4 行末注释
5.2 文挡注释
6 声明
6.1 每行声明变量的数量
6.2 初始化
6.3 布局
6.4 类和接口的声明
7 语句
7.1 简单语句
7.2 复合语句
7.3 返回语句
7.4 if,if-else,if else-if else语句
7.5 for语句
7.6 while语句
7.7 do-while语句
7.8 switch语句
7.9 try-catch语句
8 空白
8.1 空行
8.2 空格
9 命名规范
10 编程惯例
10.1 提供对实例以及类变量的访问控制
10.2 引用类变量和类方法
10.3 常量
10.4 变量赋值
10.5 其它惯例
10.5.1 圆括号
10.5.2 返回值
10.5.3 条件运算符"?"前的表达式"?"前的表达式
10.5.4 特殊注释
11 代码范例
11.1 Java源文件范例
1 介绍(Introduction)
1.1 为什么要有编码规范(Why Have Code Conventions)
编码规范对于程序员而言尤为重要,有以下几个原因:
- 一个软件的生命周期中,80%的花费在于维护
- 几乎没有任何一个软件,在其整个生命周期中,均由最初的开发人员来维护
- 编码规范可以改善软件的可读性,可以让程序员尽快而彻底地理解新的代码
- 如果你将源码作为产品发布,就需要确任它是否被很好的打包并且清晰无误,一如你已构建的其它任何产品
为了执行规范,每个软件开发人员必须一致遵守编码规范。每个人。
1.2 版权声明(Acknowledgments)
本文档反映的是Sun MicroSystems公司,Java语言规范中的编码标准部分。主要贡献者包括:Peter King,Patrick Naughton,Mike DeMoney,Jonni Kanerva,Kathy Walrath以及Scott Hommel。
本文档现由Scott Hommel维护,有关评论意见请发至shommel@eng.sun.com
2 文件名(File Names)
这部分列出了常用的文件名及其后缀。
2.1 文件后缀(File Suffixes)
Java程序使用下列文件后缀:
文件类别 文件后缀
Java源文件 .java
Java字节码文件 .class
2.2 常用文件名(Common File Names)
常用的文件名包括:
文件名 用途
GNUmakefile makefiles的首选文件名。我们采用gnumake来创建(build)软件。
README 概述特定目录下所含内容的文件的首选文件名
3 文件组织(File Organization)
一个文件由被空行分割而成的段落以及标识每个段落的可选注释共同组成。超过2000行的程序难以阅读,应该尽量避免。"Java源文件范例"提供了一个布局合理的Java程序范例。
3.1 Java源文件(Java Source Files)
每个Java源文件都包含一个单一的公共类或接口。若私有类和接口与一个公共类相关联,可以将它们和公共类放入同一个源文件。公共类必须是这个文件中的第一个类或接口。
Java源文件还遵循以下规则:
- 开头注释(参见"开头注释")
- 包和引入语句(参见"包和引入语句")
- 类和接口声明(参见"类和接口声明")
3.1.1 开头注释(Beginning Comments)
所有的源文件都应该在开头有一个C语言风格的注释,其中列出类名、版本信息、日期和版权声明:
/*
* Classname
*
* Version information
*
* Date
*
* Copyright notice
*/
3.1.2 包和引入语句(Package and Import Statements)
在多数Java源文件中,第一个非注释行是包语句。在它之后可以跟引入语句。例如:
package java.awt;
import java.awt.peer.CanvasPeer;
3.1.3 类和接口声明(Class and Interface Declarations)
下表描述了类和接口声明的各个部分以及它们出现的先后次序。参见"Java源文件范例"中一个包含注释的例子。
类/接口声明的各部分 注解
1 类/接口文档注释(/**……*/) 该注释中所需包含的信息,参见"文档注释"
2 类或接口的声明
3 类/接口实现的注释(/*……*/)如果有必要的话 该注释应包含任何有关整个类或接口的信息,而这些信息又不适合作为类/接口文档注释。
4 类的(静态)变量 首先是类的公共变量,随后是保护变量,再后是包一级别的变量(没有访问修饰符,access modifier),最后是私有变量。
5 实例变量 首先是公共级别的,随后是保护级别的,再后是包一级别的(没有访问修饰符),最后是私有级别的。
6 构造器
7 方法 这些方法应该按功能,而非作用域或访问权限,分组。例如,一个私有的类方法可以置于两个公有的实例方法之间。其目的是为了更便于阅读和理解代码。
4 缩进排版(Indentation)
4个空格常被作为缩进排版的一个单位。缩进的确切解释并未详细指定(空格 vs. 制表符)。一个制表符等于8个空格(而非4个)。
4.1 行长度(Line Length)
尽量避免一行的长度超过80个字符,因为很多终端和工具不能很好处理之。
注意:用于文档中的例子应该使用更短的行长,长度一般不超过70个字符。
4.2 换行(Wrapping Lines)
当一个表达式无法容纳在一行内时,可以依据如下一般规则断开之:
- 在一个逗号后面断开
- 在一个操作符前面断开
- 宁可选择较高级别(higher-level)的断开,而非较低级别(lower-level)的断开
- 新的一行应该与上一行同一级别表达式的开头处对齐
- 如果以上规则导致你的代码混乱或者使你的代码都堆挤在右边,那就代之以缩进8个空格。
以下是断开方法调用的一些例子:
someMethod(longExpression1, longExpression2, longExpression3,
longExpression4, longExpression5);
var = someMethod1(longExpression1,
someMethod2(longExpression2,
longExpression3));
以下是两个断开算术表达式的例子。前者更好,因为断开处位于括号表达式的外边,这是个较高级别的断开。
longName1 = longName2 * (longName3 + longName4 - longName5)
+ 4 * longname6; //PREFFER
longName1 = longName2 * (longName3 + longName4
- longName5) + 4 * longname6; //AVOID
以下是两个缩进方法声明的例子。前者是常规情形。后者若使用常规的缩进方式将会使第二行和第三行移得很靠右,所以代之以缩进8个空格
//CONVENTIONAL INDENTATION
someMethod(int anArg, Object anotherArg, String yetAnotherArg,
Object andStillAnother) {
...
}
//INDENT 8 SPACES TO AVOID VERY DEEP INDENTS
private static synchronized horkingLongMethodName(int anArg,
Object anotherArg, String yetAnotherArg,
Object andStillAnother) {
...
}
if语句的换行通常使用8个空格的规则,因为常规缩进(4个空格)会使语句体看起来比较费劲。比如:
//DON’T USE THIS INDENTATION
if ((condition1 condition2)
|| (condition3 condition4)
||!(condition5 condition6)) { //BAD WRAPS
doSomethingAboutIt(); //MAKE THIS LINE EASY TO MISS
}
//USE THIS INDENTATION INSTEAD
if ((condition1 condition2)
|| (condition3 condition4)
||!(condition5 condition6)) {
doSomethingAboutIt();
}
//OR USE THIS
if ((condition1 condition2) || (condition3 condition4)
||!(condition5 condition6)) {
doSomethingAboutIt();
}
这里有三种可行的方法用于处理三元运算表达式:
alpha = (aLongBooleanExpression) ? beta : gamma;
alpha = (aLongBooleanExpression) ? beta
: gamma;
alpha = (aLongBooleanExpression)
? beta
: gamma;
5 注释(Comments)
Java程序有两类注释:实现注释(implementation comments)和文档注释(document comments)。实现注释是那些在C++中见过的,使用/*...*/和//界定的注释。文档注释(被称为"doc comments")是Java独有的,并由/**...*/界定。文档注释可以通过javadoc工具转换成HTML文件。
实现注释用以注释代码或者实现细节。文档注释从实现自由(implementation-free)的角度描述代码的规范。它可以被那些手头没有源码的开发人员读懂。
注释应被用来给出代码的总括,并提供代码自身没有提供的附加信息。注释应该仅包含与阅读和理解程序有关的信息。例如,相应的包如何被建立或位于哪个目录下之类的信息不应包括在注释中。
在注释里,对设计决策中重要的或者不是显而易见的地方进行说明是可以的,但应避免提供代码中己清晰表达出来的重复信息。多余的的注释很容易过时。通常应避免那些代码更新就可能过时的注释。
注意:频繁的注释有时反映出代码的低质量。当你觉得被迫要加注释的时候,考虑一下重写代码使其更清晰。
注释不应写在用星号或其他字符画出来的大框里。注释不应包括诸如制表符和回退符之类的特殊字符。
5.1 实现注释的格式(Implementation Comment Formats)
程序可以有4种实现注释的风格:块(block)、单行(single-line)、尾端(trailing)和行末(end-of-line)。
5.1.1 块注释(Block Comments)
块注释通常用于提供对文件,方法,数据结构和算法的描述。块注释被置于每个文件的开始处以及每个方法之前。它们也可以被用于其他地方,比如方法内部。在功能和方法内部的块注释应该和它们所描述的代码具有一样的缩进格式。
块注释之首应该有一个空行,用于把块注释和代码分割开来,比如:
/*
* Here is a block comment.
*/
块注释可以以/*-开头,这样indent(1)就可以将之识别为一个代码块的开始,而不会重排它。
/*-
* Here is a block comment with some very special
* formatting that I want indent(1) to ignore.
*
* one
* two
* three
*/
注意:如果你不使用indent(1),就不必在代码中使用/*-,或为他人可能对你的代码运行indent(1)作让步。
参见"文档注释"
5.1.2 单行注释(Single-Line Comments)
短注释可以显示在一行内,并与其后的代码具有一样的缩进层级。如果一个注释不能在一行内写完,就该采用块注释(参见"块注释")。单行注释之前应该有一个空行。以下是一个Java代码中单行注释的例子:
if (condition) {
/* Handle the condition. */
...
}
5.1.3 尾端注释(Trailing Comments)
极短的注释可以与它们所要描述的代码位于同一行,但是应该有足够的空白来分开代码和注释。若有多个短注释出现于大段代码中,它们应该具有相同的缩进。
以下是一个Java代码中尾端注释的例子:
if (a == 2) {
return TRUE; /* special case */
} else {
return isPrime(a); /* works only for odd a */
}
5.1.4 行末注释(End-Of-Line Comments)
注释界定符"//",可以注释掉整行或者一行中的一部分。它一般不用于连续多行的注释文本;然而,它可以用来注释掉连续多行的代码段。以下是所有三种风格的例子:
if (foo 1) {
// Do a double-flip.
...
}
else {
return false; // Explain why here.
}
//if (bar 1) {
//
// // Do a triple-flip.
// ...
//}
//else {
// return false;
//}
5.2 文档注释(Documentation Comments)
注意:此处描述的注释格式之范例,参见"Java源文件范例"
若想了解更多,参见"How to Write Doc Comments for Javadoc",其中包含了有关文档注释标记的信息(@return, @param, @see):
若想了解更多有关文档注释和javadoc的详细资料,参见javadoc的主页:
文档注释描述Java的类、接口、构造器,方法,以及字段(field)。每个文档注释都会被置于注释定界符/**...*/之中,一个注释对应一个类、接口或成员。该注释应位于声明之前:
/**
* The Example class provides ...
*/
public class Example { ...
注意顶层(top-level)的类和接口是不缩进的,而其成员是缩进的。描述类和接口的文档注释的第一行(/**)不需缩进;随后的文档注释每行都缩进1格(使星号纵向对齐)。成员,包括构造函数在内,其文档注释的第一行缩进4格,随后每行都缩进5格。
若你想给出有关类、接口、变量或方法的信息,而这些信息又不适合写在文档中,则可使用实现块注释(见5.1.1)或紧跟在声明后面的单行注释(见5.1.2)。例如,有关一个类实现的细节,应放入紧跟在类声明后面的实现块注释中,而不是放在文档注释中。
文档注释不能放在一个方法或构造器的定义块中,因为Java会将位于文档注释之后的第一个声明与其相关联。
6 声明(Declarations)
6.1 每行声明变量的数量(Number Per Line)
推荐一行一个声明,因为这样以利于写注释。亦即,
int level; // indentation level
int size; // size of table
要优于,
int level, size;
不要将不同类型变量的声明放在同一行,例如:
int foo, fooarray[]; //WRONG!
注意:上面的例子中,在类型和标识符之间放了一个空格,另一种被允许的替代方式是使用制表符:
int level; // indentation level
int size; // size of table
Object currentEntry; // currently selected table entry
6.2 初始化(Initialization)
尽量在声明局部变量的同时初始化。唯一不这么做的理由是变量的初始值依赖于某些先前发生的计算。
6.3 布局(Placement)
只在代码块的开始处声明变量。(一个块是指任何被包含在大括号"{"和"}"中间的代码。)不要在首次用到该变量时才声明之。这会把注意力不集中的程序员搞糊涂,同时会妨碍代码在该作用域内的可移植性。
void myMethod() {
int int1 = 0; // beginning of method block
if (condition) {
int int2 = 0; // beginning of "if" block
...
}
}
该规则的一个例外是for循环的索引变量
for (int i = 0; i maxLoops; i++) { ... }
避免声明的局部变量覆盖上一级声明的变量。例如,不要在内部代码块中声明相同的变量名:
int count;
...
myMethod() {
if (condition) {
int count = 0; // AVOID!
...
}
...
}
6.4 类和接口的声明(Class and Interface Declarations)
当编写类和接口是,应该遵守以下格式规则:
- 在方法名与其参数列表之前的左括号"("间不要有空格
- 左大括号"{"位于声明语句同行的末尾
- 右大括号"}"另起一行,与相应的声明语句对齐,除非是一个空语句,"}"应紧跟在"{"之后
class Sample extends Object {
int ivar1;
int ivar2;
Sample(int i, int j) {
ivar1 = i;
ivar2 = j;
}
int emptyMethod() {}
...
}
- 方法与方法之间以空行分隔
7 语句(Statements)
7.1 简单语句(Simple Statements)
每行至多包含一条语句,例如:
argv++; // Correct
argc--; // Correct
argv++; argc--; // AVOID!
7.2 复合语句(Compound Statements)
复合语句是包含在大括号中的语句序列,形如"{ 语句 }"。例如下面各段。
- 被括其中的语句应该较之复合语句缩进一个层次
- 左大括号"{"应位于复合语句起始行的行尾;右大括号"}"应另起一行并与复合语句首行对齐。
- 大括号可以被用于所有语句,包括单个语句,只要这些语句是诸如if-else或for控制结构的一部分。这样便于添加语句而无需担心由于忘了加括号而引入bug。
7.3 返回语句(return Statements)
一个带返回值的return语句不使用小括号"()",除非它们以某种方式使返回值更为显见。例如:
return;
return myDisk.size();
return (size ? size : defaultSize);
7.4 if,if-else,if else-if else语句(if, if-else, if else-if else Statements)
if-else语句应该具有如下格式:
if (condition) {
statements;
}
if (condition) {
statements;
} else {
statements;
}
if (condition) {
statements;
} else if (condition) {
statements;
} else{
statements;
}
注意:if语句总是用"{"和"}"括起来,避免使用如下容易引起错误的格式:
if (condition) //AVOID! THIS OMITS THE BRACES {}!
statement;
7.5 for语句(for Statements)
一个for语句应该具有如下格式:
for (initialization; condition; update) {
statements;
}
一个空的for语句(所有工作都在初始化,条件判断,更新子句中完成)应该具有如下格式:
for (initialization; condition; update);
当在for语句的初始化或更新子句中使用逗号时,避免因使用三个以上变量,而导致复杂度提高。若需要,可以在for循环之前(为初始化子句)或for循环末尾(为更新子句)使用单独的语句。
7.6 while语句(while Statements)
一个while语句应该具有如下格式
while (condition) {
statements;
}
一个空的while语句应该具有如下格式:
while (condition);
7.7 do-while语句(do-while Statements)
一个do-while语句应该具有如下格式:
do {
statements;
} while (condition);
7.8 switch语句(switch Statements)
一个switch语句应该具有如下格式:
switch (condition) {
case ABC:
statements;
/* falls through */
case DEF:
statements;
break;
case XYZ:
statements;
break;
default:
statements;
break;
}
每当一个case顺着往下执行时(因为没有break语句),通常应在break语句的位置添加注释。上面的示例代码中就包含注释/* falls through */。
7.9 try-catch语句(try-catch Statements)
一个try-catch语句应该具有如下格式:
try {
statements;
} catch (ExceptionClass e) {
statements;
}
一个try-catch语句后面也可能跟着一个finally语句,不论try代码块是否顺利执行完,它都会被执行。
try {
statements;
} catch (ExceptionClass e) {
statements;
} finally {
statements;
}
8 空白(White Space)
8.1 空行(Blank Lines)
空行将逻辑相关的代码段分隔开,以提高可读性。
下列情况应该总是使用两个空行:
- 一个源文件的两个片段(section)之间
- 类声明和接口声明之间
下列情况应该总是使用一个空行:
- 两个方法之间
- 方法内的局部变量和方法的第一条语句之间
- 块注释(参见"5.1.1")或单行注释(参见"5.1.2")之前
- 一个方法内的两个逻辑段之间,用以提高可读性
8.2 空格(Blank Spaces)
下列情况应该使用空格:
- 一个紧跟着括号的关键字应该被空格分开,例如:
while (true) {
...
}
注意:空格不应该置于方法名与其左括号之间。这将有助于区分关键字和方法调用。
- 空白应该位于参数列表中逗号的后面
- 所有的二元运算符,除了".",应该使用空格将之与操作数分开。一元操作符和操作数之间不因该加空格,比如:负号("-")、自增("++")和自减("--")。例如:
a += c + d;
a = (a + b) / (c * d);
while (d++ = s++) {
n++;
}
printSize("size is " + foo + "\n");
- for语句中的表达式应该被空格分开,例如:
for (expr1; expr2; expr3)
- 强制转型后应该跟一个空格,例如:
myMethod((byte) aNum, (Object) x);
myMethod((int) (cp + 5), ((int) (i + 3)) + 1);
9 命名规范(Naming Conventions)
命名规范使程序更易读,从而更易于理解。它们也可以提供一些有关标识符功能的信息,以助于理解代码,例如,不论它是一个常量,包,还是类。
标识符类型 命名规则 例子
包(Packages) 一个唯一包名的前缀总是全部小写的ASCII字母并且是一个顶级域名,通常是com,edu,gov,mil,net,org,或1981年ISO 3166标准所指定的标识国家的英文双字符代码。包名的后续部分根据不同机构各自内部的命名规范而不尽相同。这类命名规范可能以特定目录名的组成来区分部门(department),项目(project),机器(machine),或注册名(login names)。 com.sun.eng
com.apple.quicktime.v2
edu.cmu.cs.bovik.cheese
类(Classes) 命名规则:类名是个一名词,采用大小写混合的方式,每个单词的首字母大写。尽量使你的类名简洁而富于描述。使用完整单词,避免缩写词(除非该缩写词被更广泛使用,像URL,HTML) class Raster;
class ImageSprite;
接口(Interfaces) 命名规则:大小写规则与类名相似 interface RasterDelegate;
interface Storing;
方法(Methods) 方法名是一个动词,采用大小写混合的方式,第一个单词的首字母小写,其后单词的首字母大写。 run();
runFast();
getBackground();
变量(Variables) 除了变量名外,所有实例,包括类,类常量,均采用大小写混合的方式,第一个单词的首字母小写,其后单词的首字母大写。变量名不应以下划线或美元符号开头,尽管这在语法上是允许的。
变量名应简短且富于描述。变量名的选用应该易于记忆,即,能够指出其用途。尽量避免单个字符的变量名,除非是一次性的临时变量。临时变量通常被取名为i,j,k,m和n,它们一般用于整型;c,d,e,它们一般用于字符型。 char c;
int i;
float myWidth;
实例变量(Instance Variables) 大小写规则和变量名相似,除了前面需要一个下划线 int _employeeId;
String _name;
Customer _customer;
常量(Constants) 类常量和ANSI常量的声明,应该全部大写,单词间用下划线隔开。(尽量避免ANSI常量,容易引起错误) static final int MIN_WIDTH = 4;
static final int MAX_WIDTH = 999;
static final int GET_THE_CPU = 1;
10 编程惯例(Programming Practices)
10.1 提供对实例以及类变量的访问控制(Providing Access to Instance and Class Variables)
若没有足够理由,不要把实例或类变量声明为公有。通常,实例变量无需显式的设置(set)和获取(gotten),通常这作为方法调用的边缘效应 (side effect)而产生。
一个具有公有实例变量的恰当例子,是类仅作为数据结构,没有行为。亦即,若你要使用一个结构(struct)而非一个类(如果java支持结构的话),那么把类的实例变量声明为公有是合适的。
算数编码java的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于算数编码的优缺点、算数编码java的信息别忘了在本站进行查找喔。
发布于:2022-12-01,除非注明,否则均为
原创文章,转载请注明出处。