本文目录一览:
Java编程的特点是什么呢
Java编程的特点是什么呢?
Java由美国SUN公司(被oracle公司收购)发明于1995年,是目前业界应用最广泛、使用人数最多的语言,连续多年排名世界第一,可以称之为“计算机语言界的英语”。
那么Java这么高的评价它的特点有哪些,下面我来为题主解答:
一、跨平台/可移植性
这是Java的核心优势。Java在设计时就很注重移植和跨平台性。比如:Java的int永远都是32位。不像C++可能是16,32,可能是根据编译器厂商规定的变化。这样的话程序的移植就会非常麻烦。
Java首先利用文本编辑器编写 Java源程序,源文件的后缀名为.java;再利用编译器(javac)将源程序编译成字节码文件,字节码文件的后缀名为.class; 最后利用虚拟机(解释器,java)解释执行。如下图所示:
二、安全性
Java适合于网络/分布式环境,为了达到这个目标,在安全性方面投入了很大的精力,使Java可以很容易构建防病毒,防篡改的系统。比如Java取消了强大但又危险的指针。由于指针可进行移动运算,指针可随便指向一个内存区域,而不管这个区域是否可用,这样做是危险的。
三、面向对象
面向对象是一种程序设计技术,非常适合大型软件的设计和开发。由于C++为了照顾大量C语言使用者而兼容了C,使得自身仅仅成为了带类的C语言,多少影响了其面向对象的彻底性!Java则是完全的面向对象语言。
四、简单性
Java就是C++语法的简化版,我们也可以将Java称之为“C++-”。跟我念“C加加减”,指的就是将C++的一些内容去掉;比如:头文件,指针运算,结构,联合,操作符重载,虚基类等等。同时,由于语法基于C语言,因此学习起来完全不费力。
五、高性能
Java最初发展阶段,总是被人诟病“性能低”;客观上,高级语言运行效率总是低于低级语言的,这个无法避免。Java语言本身发展中通过虚拟机的优化提升了几十倍运行效率。比如,通过JIT(JUST IN TIME)即时编译技术提高运行效率。 将一些“热点”字节码编译成本地机器码,并将结果缓存起来,在需要的时候重新调用。这样的话,使Java程序的执行效率大大提高,某些代码甚至接近C++的效率。
因此,Java低性能的短腿,已经被完全解决了。业界发展上,我们也看到很多C++应用转到Java开发,很多C++程序员转型为Java程序员。
六、分布式
Java是为Internet的分布式环境设计的,因为它能够处理TCP/IP协议。事实上,通过URL访问一个网络资源和访问本地文件是一样简单的。Java还支持远程方法调用(RMI,Remote Method Invocation),使程序能够通过网络调用方法。
七、多线程
多线程的使用可以带来更好的交互响应和实时行为。 Java多线程的简单性是Java成为主流服务器端开发语言的主要原因之一。
八、健壮性
Java是一种健壮的语言,吸收了C/C++ 语言的优点,但去掉了其影响程序健壮性的部分(如:指针、内存的申请与释放等)。Java程序不可能造成计算机崩溃。即使Java程序也可能有错误。如果出现某种出乎意料之事,程序也不会崩溃,而是把该异常抛出,再通过异常处理机制加以处理。
以上几种特性你了解到啦吗? 记得给个赞!
类名应当遵循怎么样的编程风格
首先,编程风格并不同于其他的style,目的并不是形成自己独树一帜的风格,而是为了让你的程序易读,有利于团队合作以及别人帮你改错。 风格是通用的 C语言和C++语言的编程风格 (Java见下) 第一章:缩进格式 Tab是8个字符,于是缩进也是8个字符
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是一种优秀的程序设计语言,它具有令人赏心悦目的语法和易于理解的语义。不仅如此,Java还是一个由一系列计算机软件和规范形成的技术体系,这个技术体系提供了完整的用于软件开发和跨平台部署的支持环境,并广泛应用于嵌入式系统、移动终端、企业服务器、大型机等各种场合。顺便说一下,JavaScript和Java没有任何关系,最开始JavaScript叫liveScript,当时Java太火了,于是乎 liveScript更名为JavaScript借势宣传了一波。
随便搜搜近几年的编程类语言排行榜,Java绝对都是当之无愧的老大哥。那么,Java究竟有什么特性能获得 广大程序员的一致青睐呢? 在此列出java的11个特性:
1.简单性
Java语法是C++语法的一个“纯净版本”。这里没有头文件,指针运算(甚至指针语法),结构,联合,操作符重载,虚基类等等。不仅如此,Java开发环境远远超出大多数其他编程语言的开发环境。
2.面向对象
什么是面向对象?用木匠打一个比方,一个“面向对象”的木匠始终关注的是所制作的椅子,第二位才是所使用的工具;而一个“非面向对象”木匠首先考虑的是所使用的工具。
在Java的世界里,一切皆对象。
Java的面向对象特性与C++旗鼓相当,与C++不同的点在于多重继承。在Java中,取而代之的是更简单的接口概念。而且与C++想比,Java提供了更丰富非运行时自省功能。
3.分布式(微服务)
Java有丰富的例程库,用于处理HTTP和FTP之类的TCP/IP协议。Java应用程序能够通过URL打开和访问网络上的对象,其便捷程度就好像访问本地文件一样。
4.健壮性
Java与C++最大的不同在于Java使用的指针模型可以消除重写内存和损坏数据的可能性(对于曾经花费几个小时来检查由于指针bug而引起内存冲突的人来说,一定很喜欢Java的这一特性)。不仅如此,Java编译器能够检测许多在其他语言中仅在运行时才能够检测出来的问题。
5.安全性
Java适用于网络/分式式环境。为了达到这个目标,在安全性方面投入了大量的精力。使用Java可以构建防病毒,防篡改的系统。
从一开始,Java就设计出能够防范常见的各种攻击:
(1)运行时堆栈溢出。蠕虫和病毒常用的攻击手段。(2)破坏自己进程空间之外的内存。(3)未经授权读写文件。
6.体系结构中立
编译器生成一个体系结构中立的目标文件格式,这是一种编译过的代码,只要有Java运行时系统,这些编译后的代码就可以在许多处理器上运行。Java编译器通过生成与特定计算机体系结构无关的字节码指令来实现这一特性。精心设计的字节码不仅可以很容易的在任何机器上解释执行,而且还可以动态地翻译成本地机器代码。
7.可移植性
与C/C++不同,Java规范中没有“依赖具体实现的地方”。基本数据类型的大小以及有关运算都做了明确的说明。例如,Java中的int永远是32位的整数,二在C/C++中,int可能是16位整数,32位整数,也可能是编译器提供商指定的其他大小。在Java中,数据类型具有固定的大小,这消除了代码代码移植时令人头疼的主要问题。
8.解释型
Java解释器可以再任何移植了解解释器的机器上执行Java字节码。由于链接是一个增量式且轻量级的过程。所以开发过程也变得更加快捷,更加具有探索性。
9.高能性
尽管对解释后的字节码性能已经比较满意,但是在某些场合下可能需要更加高效的性能。字节码可以(在运行时刻)动态的翻译成对应运行这个应用的特定CPU的机器码。
10.多线程
Java在当时很超前,他是第一个支持并发程序设计的主流语言,多线程可以带来更好的交互影响和实时行为。并发程序设计绝非易事,但是Java在这方面表现出色,可以很好的管理这个工作。
11.动态性
Java与C/C++相比更具有动态性。它能够适应不断发展的环境。库中可以自由的添加新方法和实例变量,而对客户端没有任何影响。在Java中找出运行时类型信息十分简单。
什么是良好的编程风格(Java编程)
首先,编程风格并不同于其他的style,目的并不是形成自己独树一帜的风格,而是为了让你的程序易读,有利于团队合作以及别人帮你改错。
风格是通用的
C语言和C++语言的编程风格 (Java见下)
第一章:缩进格式
Tab是8个字符,于是缩进也是8个字符.有很多怪异的风格,他们将缩进格式定义为4个字符(设置为2个字符!)的深度,这就象试图将PI定义为3一样让人难以接受.
理由是:缩进的大小是为了清楚的定义一个块的开始和结束.特别是当你已经在计算机前面呆了20多个小时了以后,你会发现一个大的缩进格式使得你对程序的理解更容易.
现在,有一些人说,使用8个字符的缩进使得代码离右边很近,在80个字符宽度的终端屏幕上看程序很难受.回答是,但你的程序有3个以上的缩进的时候,你就应该修改你的程序.
总之,8个字符的缩进使得程序易读,还有一个附加的好处,就是它能在你将程序变得嵌套层数太多的时候给你警告.这个时候,你应该修改你的程序.
第二章:大符号的位置
另外一个C程序编程风格的问题是对大括号的处理.同缩进大小不同,几乎没有什么理由去选择一种而不选择另外一种风格,但有一种推荐的风格,它是Kernighan和Ritchie的经典的那本书带来的,它将开始
的大括号放在一行的最后,而将结束大括号放在一行的第一位,如下所示:
if (x is true) { we do y }
然而,还有一种特殊的情况:命名函数:开始的括号是放在下一行的第一位,如下:
int function(int x) { body of function }
所有非正统的人会非难这种不一致性,但是,所有思维正常的人明白: (第一) KR是___对___的,(第二)如果KR不对,请参见第一条. (:-))......另外,函数也是特殊的,不一定非得一致.
需要注意的是结束的括号在它所占的那一行是空的,__除了__它跟随着同一条语句的继续符号.如"while"在do-while循环中,或者"else"在if语句中.如下:
do { body of do-loop } while (condition);
以及
if (x == y) { .. } else if (x y) { ... } else { .... }
理由: KR.
另外,注意到这种大括号的放置方法减小了空行的数量,但却没有减少可读性.于是,在屏幕大小受到限制的时候,你就可以有更多的空行来写些注释了.
第三章:命名系统
C是一种简洁的语言,那么,命名也应该是简洁的.同MODULE-2以及ASCAL语言不同的是,C程序员不使用诸如ThisVariableIsATemporaryCounter之类的命名方式.一个C语言的程序员会将之命名为"tmp",这很容易书写,且并不是那么难以去理解.
然而,当混合类型的名字不得不出现的时候,描述性名字对全局变量来说是必要的了.调用一个名为"foo"全局的函数是很让人恼火的.全局变量(只有你必须使用的时候才使用它) ,就象全局函数一样,需要描述性的命名方式.假如你有一个函数用来计算活动用户的数量,你应该这样命名--"count_active_users()"--或另外的相近的形式,你不应命名为"cntusr()".
有一种称为Hungarian命名方式,它将函数的类型编码写入变量名中,这种方式是脑子有毛病的一种表现---编译器知道这个类型而且会去检查它,而这样只会迷惑程序员. --知道为什么Micro$oft为什么会生产这么多"臭虫"程序了把!!.
局部变量的命名应该短小精悍.假如你有一个随机的整数循环计数器,它有可能有"i",如果没有任何可能使得它能被误解的话,将其写作"loop_counter"是效率低下的.同样的,""tmp"可以是任何临时数值的函数变量.
如果你害怕混淆你的局部变量的名字,还有另外一个问题,就是称
function-growth-hormone-imbalancesyndrome.
第四章:函数
函数应该短小而迷人,而且它只作一件事情.它应只覆盖一到两个屏幕(80*24一屏),并且只作一件事情,而且将它做好.(这不就是UNIX的风格吗,译者注).
一个函数的最大长度和函数的复杂程度以及缩进大小成反比.于是,如果你已经写了简单但长度较长的的函数,而且你已经对不同的情况做了很多很小的事情,写一个更长一点的函数也是无所谓的.
然而,假如你要写一个很复杂的函数,而且你已经估计到假如一般人读这个函数,他可能都不知道这个函数在说些什么,这个时候,使用具有描述性名字的有帮助的函数.
另外一个需要考虑的是局部变量的数量.他们不应该超过5-10个,否则你有可能会出错.重新考虑这个函数,将他们分割成更小的函数.人的大脑通常可以很容易的记住7件不同的事情,超过这个数量会引起混乱.你知道你很聪明,但是你可能仍想去明白2周以前的做的事情.
第5章:注释
注释是一件很好的事情,但是过多的注释也是危险的,不要试图区解释你的代码是注释如何如何的好:你应该将代码写得更好,而不是花费大量的时间去解释那些糟糕的代码.
通常情况下,你的注释是说明你的代码做些什么,而不是怎么做的.而且,要试图避免将注释插在一个函数体里:假如这个函数确实很复杂,你需要在其中有部分的注释,你应该回到第四章看看.你可以写些简短的注释来注明或警告那些你认为特别聪明(或极其丑陋)的部分,但是你必须要避免过多.取而代之的是,将注释写在函数前,告诉别人它做些什么事情,和可能为什么要这样做.
第六章:你已经深陷其中了.
不要着急.你有可能已经被告之"GUN emacs"会自动的帮你处理C的源代码格式,而且你已经看到它确实如此,但是,缺省的情况下,它的作用还是不尽如人意(实际上,他们比随便敲出来的东西还要难看- ainfinite number of monkeys typing into GNU emacs would never make a good program)
于是,你可以要么不要使用GUN emacs,要么让它使用sanervalules.使用后者,你需要将如下的语句输入到你的.emacs文件中.(defun linux-c-mode() "C mode with adjusted defaults for use with the Linux kernel."(interactive) (c-mode) (c-set-style"KR") (setq c-basic-offset8))
这会定义一个M-x Linux-c-mode的命令.当你hacking一个模块的时候,如何你将-*- linux-c -*-输入在最开始的两行,这个模式会自动起作用.而且,你也许想加入如下
(setq auto-mode-alist (cons '("/usr/src/linux.*/.*.〖ch〗$" . linux-c-mode) auto-mode-alist))
到你的.emacs文件中,这样的话,当你在/usr/src/linux下编辑文件的时候,它会自动切换到linux-c-mode .
但是,假如你还不能让emaces去自动处理文件的格式,不要紧张,你还有一样东西: "缩进" .
GNU的缩进格式也很死板,这就是你为什么需要加上几行命令选项.然而,这还不算太坏,因为GNU缩进格式的创造者也记得KR的权威, (GNU没有罪,他们仅仅是在这件事情上错误的引导了人们) ,你要做的就只有输入选项"-kr -i8"(表示"KR,缩进8个字符).
"缩进"有很多功能,特别是当它建议你重新格式你的代码的时候,你应该看看帮助.但要记住: "缩进"不是风格很差的程序的万灵丹.
JAVA编程风格简析
很久以来都在体会着JAVA的风格,现在做一简单陈述,希望大家多提宝贵意见。
对于一种好的编程语言,学习它的编程风格是很重要的。每种语言都有自己的编写和注释约定,当然所有语言都建立在最基本的约定之上。编程中最重要的并不是让代码按自己希望的方式运行,而是程序中那种自明的编程风格(这对于程序员的益处相信众多程序员都身有体会)!但这还不够,程序还应该具有可读、相对持久和可维护性。可读性非常重要,因为你不希望自己以前的作品在之后的阅读中给自己留下障碍,当然,更重要的是自己的程序能让其他程序员读懂并且修改。
下面我把工作中所理解的java风格做一简单总结,这是我所理解的好的编程风格和应用中我们应当如何使用java编写自己的代码的小Guide。这并不完全,希望大家帮我陆续总结各自的经验。
一般性概述
好的编程风格固然重要,但是你一定听说过一些程序员的个人风格。其实我们完全不必为那些所谓条条框框所累,但是作为原则是我们至少不能打破这些常规。我们应该在保持自己风格的同时尽量的把自己与编程潜原则靠拢。
可读性很容易达到,比如,让自己的代码缩排排列、名字采用描述性但不要过长(短名应仅仅用在非远程)、特殊名称比如pi应当被定义为final类型。模块性是编程需要注意的另一重点,把代码划分到类里,在类中把功能划分到方法中,别让一个类太大,否则在使用、修改和理解上都会造成不必要的麻烦,方法也一样,如果一个方法长度超过50行,它产生错误的概率将接近100%,尽量把大方法划分为小方法,编程中为避免重复编写,还应尽量调用JAVA标准类库。
尽量避免在写代码和注释时使用不同语言,经常见到论坛有朋友询问诸如在java中调用c、调用php、调用shell之类的问题,其实在编程中,我们应尽量使用一种语言去完成事情。另外就是不必最优化自己的代码,应该选择相对较优的算法就可以了。
类、方法和fields
类应体现出某种物质的基本概念,比如要编程实现“汽车”的组成,那么所有的汽车都可以用类Car实现。这个类应当包括域描述、属性描述和car的状态(color, number of doors, age等)和由car可完成的操作(getColor, setColor等)。为了提高类的可重用性,不要在类中有过多的描述,当然这也会增加错误产生的机会。
类名首字母大写,比如Date, String, Hashtable等 ... ...
类如下定义:(未使用Javadoc做注释):
public class Car {
/* Instance variables are placed either in the beginning
or at the end of the class */
private int age;
private Color color;
/* The constructor should be placed in the beginning */
public Car(int age, Color color) {
this.age = age;
this.color = color;
}
/* Example method */
public int getAge() {
return age;
}
/* The main method is optional, but looks like this.
If it exists, it is either the first or the last
method in the class */
public static void main(String [] args) {
...
}
}
注意类名和大括号间的空格!
方法
方法一般定义为public。当然,如果方法仅仅在当前类用到可以定义为private,而如果希望一个子类沿用这个方法则不同,这时候的方法应定义为protected。
java中的方法定义很有趣,它们一般小写字母开头,如果有两个字组成,第二个字的首字母则大写。因此名字的描述性是至关重要的。这使你不用阅读整篇代码来判断这是一个什么方法。在给自己的方法取名时应尽量不要太短或者太长,另一个需要注意的是大多方法使用动词(动宾短语)。
例如:
public void eat() {}
public void eatBananas() {}
Selector(选择器)方法有get前缀,后缀是它们将要get的,比如
public int getBananas() {}
Mutator(存取器)方法则有set前缀,后缀则是他们要set的,比如
public void setBananas(int amount) {}
注意mutators大多无返回值。
方法的参数应当以如下方式给出:
public void aMethod(type parameter1, type parameter2, ... , type parametern) {}
如果参数过长,也可以断开为几行,应对齐向下排列如:
public void aMethod(type parameter1, type parameter2,... ,
type parametern, type parameter n+1,... ,
type parameterm, type parameter m+1) {}
另外要注意类的左束括号应在方法的右束括号之后而非下一行:
public int aMethod() {
int i = 0;
if(i == 0)
System.out.println("success!");
}
为了文件可读性好,还要注意语句最好写在同一行,当然一行写不下是可以断行的,比如行字母超过80。
fields
比如变量,如果不希望它永久有效,应设为private。如果一个变量在类中不发生任何动作(比如数据结构中的node)则可以设置为public,常量一般声明为public。如果不能确定一个变量到底该声明为什么,应暂且声明为private。
field的名字一般使用小写字母,不要使用下横线或其他特殊字符。 如果变量包含两个字,那么第二个字的首字母大写。比如:
int i, j, k;
Date date;
double myField;
常量一般全部大写,也可以包含下横线:
public static final int MAX_SIZE_OF_DATABASE
fields的名字通常为名词。较重要的fields更应具备描述性,比如程序中包含一个游戏的得分,那可以用score来代表。如果变量变化较频繁,那使用一个单一字符来代表就ok了:
i, j, k 通常代表整数
r, t, u, v, w 通常代表实数
x, y, z 通常是并列出现或代表浮点数
s, s1, s2, 通常代表字符串
c, ch 通常代表字符
f, file 通常代表文件
tmp, temp 通常代表临时变量
ctr, cnt, cntr 一般代表计数器(如果i, j, k这些变量已被使用)
dummy, foo, bar 一般代表哑元变量
args 是main-method的主参数名
缩排与换行
每行长度不得超过80字符。如果需要可以折行时,也应当与上一行有共同的缩排距离。代码应如何交错、如何建立新行、在哪里建立允许、哪里不允许都有一些一般约定,缩排空格一般为2个或4个空格。
条件表达式
如果见到如下语法表达式:
if (expr)
statement1;
else
statement2;
代码行向右错排两个空格如上所示。
如果在一个表达式中有超过一条的声明,则需要大括号:
if (expr){
statement1;
statement2;
} else{
statement3;
statement4;
}
有时我们会希望在表达式中使用表达式(比如条件嵌套),这时应注意else表达式,它的位置很容易出错!如例:
if (expr1) {
statement1;
statement2;
} else if (expr2)
statement3;
else if (expr3) {
statement4;
statement5;
} else {
statement6;
statement7;
}
注意大括号位置!
Loops
while-loop语法如下:
while (expr) {
statement1;
statement2;
}
for-loop语法如下:
for (expr1; expr2; expr3){
statement1;
statement2;
}
注意大括号位置!仅一条声明时大括号省略:
while (expr)
statement;
for (expr1; expr2; expr3)
statement;
例如,我们写一个procedure写出1到10这十个数字:
for (i = 1; i = 10; i++)
System.out.println(i);
try-catch语法形如:
try {
statements;
} catch (ExceptionClass e) {
statements;
}
如果try-catch语句后跟随finally子句则形如:
try {
statements;
} catch (ExceptionClass e) {
statements;
} finally {
statements;
}
新行
每一行最好只阐述一件事情。比如,一行包含一个声明、一个条件语句、一个循环等。不论多小,最好不要一行办两件事及以上。例如不要把一个if表达式或循环语句的主体放置在同一行,这样的表达式断行的易读性会更高。通常,互相协作的代码应放在一起,为保证代码美观可读,我们应将代码的不同代码段放置在不同的段落。不过要牢记断行不要太过分!比如:
public int factorial(int n) {
int result = 1;
for(int i = 1; i = n; i++)
result*=i;
return result;
}
给自己的代码加入注释
注释就是类的描绘、方法存在的原因、它完成了什么以及它对它其中(变量)的作用域。假定阅读你代码的人已经知道这是什么语言,所以不需要注释语句功能,尽量使用简短而有描述力的注释。
Java有两种类型的注释:
//This is a comment that continues until the end of the line.
/* This is a comment. It goes on and on and on and on and on and on and on
and on and on and on and on and on and on and on and on and on and on and
on and on and on and on and on and on and on and on and ends like this: */
/**
* This is a JavaDoc comment. More about JavaDoc in the next section.
*/
如果在注释中加入注释则会出错:
/* You are not allowed to do anything like this /* because the compiler will
complain, if you are lucky */ DON'T DO THIS! And don't write comments in
upper case either... */
注释应放在它要解释内容上下,这样会让代码更易于理解。
不要注释一些语言的语句功能:
i++; // Add 1 to i
更不要让自己的代码处于这种状态:
for(int i = 1; i = n; i++)
/* don't place comments where
they don't belong */
result*=i;
较短的注释既可被放在被注释代码上下,而长注释则习惯性的放在代码之上:
/* Comments can be placed before the
block that is to be commented */
for(int i = 1; i = n; i++)
result*=i;
或者:
for(int i = 1; i = n; i++){
result*=i; // short comments can be placed like this
tmp++; // if necessary, they continue here
}
不要写没用的注释:
i++; // change this later
Excuse me,这句肯定是胡扯!
不要写自己都看不懂的注释:
i++; // BMW
BMW? 如果你能连续十天记住这是什么意思的话,那么你的记忆真是不错了。所以不要写没人能看懂的注释,ok?
最后重申一下:写简短而富于描述性的注释,把它们放在该放的地方,而不要考验你自己的记忆力!
JavaDoc - 文档工具
JavaDoc不仅是另一种给代码加注释的仿佛咱,更是一个文档工具。类、方法和一些重要地方需要用JavaDoc来注释。这并不是说你可以放弃常规的注释,这两者在代码中应该是相辅相成、互相弥补的关系。
类被注释如:
/**
* Car represents cars ... A description of the class
* should be place here. Note that the description begins
* on the second line and that there is a space between
* the asterix and the text. Next we will add some fields
* indicating who the authors of the class are and
* other useful information. Notice the newline!
*
* @author Jerry Meng
* @version %I%, %G%
*/
public class Car {
注意JavaDoc结束和类开始间无空行。
方法被注释如:
/**
* A description of what the method does...
*
* @param n a description of the parameter
* @return a description of the return value
*/
public int factorial(int n) {
某些不是全部,被JavaDoc注释区域如:
/**
* Short description of the variable (one line)
*/
type variable;
什么应当使用JavaDoc做注释?如何注释的恰当呢?
可以这样想,JavaDoc中所作的注释都可以在类的文档中看到。所有读这个类的文档的读者都会明白这个类所完成的功能、它包括的方法、如何使用这些方法及方法的返回值。一些作用域,比如public的变量或常量将会一目了然。任何不了解这个类内部结构的人都可以轻松的调用它。这便是你用JavaDoc可以轻松提供的信息。而使用一般注释的地方,一般是给那些可能修改你的类代码的程序员,它们一般描述了类的内部信息和结构。
下面我写一下car的类来描述一个编程风格好的java类应该是怎样的。当然这仅仅是一个小例子(apart from selector and mutator methods),仅仅是在考虑JAVA编程风格上一个参考而已。
import java.awt.Color;
/**
* This is a class representing cars. A car has certain features, such
* as color, age, number of doors etc and a car can be repainted,
* the tank can be filled etc.
*
* @author Jerry Meng
* @version %I%, %G%
*/
public class Car {
/**
* The maximum size of the tank in litres.
*/
private static final double TANK_SIZE = 100.0;
/**
* The color of the car.
*/
private Color color;
/**
* The age of the car.
*/
private int age;
/**
* The number of doors of the car.
*/
private int doors;
/**
* The amount of gasoline in the tank.
*/
private double gasoline;
/**
* Class constructor, which constructs a brand new, black car with
* five doors and a full tank.
*/
public Car() {
this(Color.black, 0, 5, TANK_SIZE);
}
/**
* Class constructor specifying the color, age, number of doors
* and litres of gasoline
*
* @param color The color of the car
* @param age The age of the car
* @param doors The number of doors
* @param km Kilometres driven
* @param gasoline The litres of gasoline
*/
public Car(Color color, int age, int doors, double gasoline) {
this.color = color;
this.age = age;
this.doors = doors;
this.gasoline = gasoline;
}
/**
* Returns the color of the car
*/
public Color getColor() {
return color;
}
/**
* Repaints the car (i.e. changes its color)
*/
public void setColor(Color color) {
this.color = color;
}
/**
* Returns the age of the car
*/
public int getAge() {
return age;
}
/**
* Returns the number of doors of the car
*/
public int getDoors() {
return doors;
}
/**
* Returns the amount of gasoline in the tank
*/
public double getGasoline() {
return gasoline;
}
/**
* Fills the tank. The amount of gasoline cannot exceed
* the size of the tank. In that case, the tank will be
* filled to the maximum and the rest will run out in
* the sand.
*
* @param gas The amount of gasoline to put in the tank
*/
public void setGasoline(double gas) {
if(gasoline + gas = TANK_SIZE)
gasoline+=gas;
else
gasoline = TANK_SIZE;
}
}