Java编程注意事项

调试技术与远程调试?
Java调试其实是向JVM发送命令进行单步执行或者show寄存器,Java的调试有自己的协议JDBG,Java调试方式是通过tcp socket,故可以远程调试。调试方式是首先在JVM的启动脚本中添加OPT,然后启动程序之后JVM会停在main处,然后jdb attach到调试端口上即可。另外Eclipse可以调试Java程序。
与GDB、PDB的调试一样,JDB调试方式也包括:单步、跳入、跳出;显示变量值;断点、条件断点;attach;切换线程;查看堆栈等。

Eclipse使用?
加载工程、加载库、调试、符号联想等插件。

maven使用?
可以参考《maven实战》,也就是action in maven。maven的主要功能是类似与automake,定义需要编译打包的java文件以及打包和部署、需要引入的jar包及其位置、那个jar包是主入口、JVM启动参数设置等功能。

jar包与部署?
     普通的使用javac编译,使用java命令运行的方式不好,所以提出了jar包的概念,其中定义了所有程序运行需要的代码、配置、参数,方便网络上的发布。
     打jar包:1. javac编译的时候使用-d区分source、classes文件。2. 创建mainifest.txt,并定义Main-class。3. 使用jar命令打包。综上jar打包之后的文件是字节码与entry point,代码size变小,适合网络发布。打jar包的时候注意路径。一种更方便的打包方式是“jar -cvmf manifest.txt package.jar com”
     执行jar包:java -jar jar.jar,或者使用路径即可,例如java com.cppjava.cn.Package。
     检查jar包:可以使用-tf、-xf等参数,通过解压jar包来检查打包是否正确。
     注意在maven中,上述命令的参数可能省略,但是依赖于目标的名字还是这些。

注释与注释文档?

Coding Style?

##### 与C++不同 #####
Java在语法与编程模式的使用中基本与C++类似,除了以下这些:

OO编程?
     Java中的类都是Object的子类,不需要手动销毁,Java中的数据分为对象、对象的引用(没有整形什么的,因为Java中皆对象)、常量。动态对象存储于堆;对对象的引用存储于栈中,Java不使用静态存储区(静态存储区就是位置固定的RAM区域,C++中有静态变量所以有这个,Java中没有静态变量所以不需要);常量放置在常量存储区(也就是ROM上的代码中);不受程序控制的非RAM数据(例如文件、socket等)。为了提升效率,Java在存储方面有个特例就是基本类型,使用了C++的方式。
     Java中皆对象,故main方法也需要存在于对象中。
     Java中的构造、析构函数。在构造的时候,Java保证默认成员变量被初始化为0(故Java中没有C++的变量使用前未初始化的问题);Java对成员变量的指定初始化可以使用两种方法,一是指定初始化(即赋值),二是构造器初始化(即调用构造器,注意构造器的重载);使用构造器的时候注意构造器调用的顺序(同C++)。与C++一样,Java提供缺省构造器。
     Java中的析构函数是finalize,用于析构时候调用,注意与垃圾回收区别开来。Java貌似不提供缺省析构器。
     Java中的方法重载。
     Java是单继承,故没有菱形继承的问题。
     This同C++。
     Java的访问控制基本同C++,也是private、protected、public,但是Java的访问控制只是修饰其后紧跟的名词,而不是其后跟随的所有名词。对于class的修饰,Java和C++中都没有protected、private修饰class。对于member修饰,可以全有。对于继承链的访问控制,Java只有public继承,没有C++中的protected或者private继承。protected在Java中的使用与C++一样。
     Java中的组合基本同C++。
     Java中的继承,其目的与C++一样,都是代码的扩展。Java中使用extands关键字,C++中使用:,C++中对于继承链的还可以使用访问控制,Java中就全是public的。
     Java中可以显示的使用基类的构造器,即super关键字,因为Java中没有菱形继承的问题,所以super的语法很明确。直到C++11中才有显示使用父类构造函数的方法。Java中的构造函数可以重载,这个与C++一样。注意Java不允许name hiding!
     name hiding,名字覆盖,也就是C++中的over write概念,即子类相同签名的方法覆盖父类。Java不允许name hiding,C++允许。
     OO设计中,要综合考虑继承、组合、接口,注意接口的“分离要做什么与怎么做”这个功能。

Java的polymorphic,即多态?
     多态的主要任务是分离做什么与怎么做这两个语义,要实现这个功能主要通过binding实现,在C++中只能使用编译时绑定,Java中使用运行时绑定。在多态中,比较重要的是构造与析构函数的绑定,尤其在upcasting等情况下。

包机制?
     插一句题外话,C++中的头文件对于可执行程序完全没用,对于暴漏接口也是有点多余,因为完全可以通过interface暴漏接口。
     在C++中,通过库的方式提供程序单元的功能,而Java就是通过包的方式提供程序单元的功能,也就是Java中的package类似于C++中的library。包是Java中的一个程序单元,也就是多个编译单元(即文件)、多个类可以打包成一个包(即程序单元)。在相同的包中,互相之间的类是默认public可见的,不同的包中就是不可见。包中不仅可以有自己定义的代码,还可以import别人的包,这样别人的包也就成了你的包的一部分,类似于lib的连接。
     对于库的API来讲,独一无二是很重要的,Java中包命名使用了url反序的方式。Java使用包的方式,来为一组Java的类进行组织。
     上述OO编程中的类的访问控制机制是对于相同的包中而言的。

Java没有条件编译等编译时的控制选项?
     是的。

static关键字?
     同C++中static关键字,如果变量或者类中的方法定义成static,那么其不会与对象关联,也就是不需要对象来访问、也不需要创建对象来访问。至于访问的方式,可能可以通过对象引用访问也可能不能,这个是细节,最好的访问方式是通过类名。另外这个问题可以参考python中的self、cls的定义。
     static关键字对访问控制,例如静态防范才可以访问静态成员等。
     静态方法中没有this。

final关键字?
     static final int a=8;用于实现C++中宏。
     修饰参数,类似C++中的const。
     修饰方法,用于屏蔽重载,并实现方法的inline,以提高调用效率。故Java中默认所有的private方法都是隐含final的,所以尽量使用private的方法能提高效率。
     修饰class,即这个class不能被继承。

abstract关键字?
     可以修饰方法,用于表示方法必须被子类实现。
     可以修饰class,包含abstract方法的class必须是 abstract的。
     如果想实现C++中的纯虚类,请使用interface关键字。

interface关键字?
     仅用于class的修饰,标志这个class中的方法全部是static final的,即这个interface必须被class implement。
    
Java中的数组?
     C++数组访问会越界,Java中加了检查故不会有这个问题。
     Java中多维数组的方式与C++中类似,分为fix length和varied-length,注意定义方式,第一维必须确定。创建数组的方式也与C++一样,即静态赋值与动态new创建。

Java String VS C++ string?

Java容器 VS C++容器?

Java中全是引用?
     C++中可能还会出现C的指针(指针与引用的区别),Java中全是引用,所以编程的时候不要考虑类似C中struct赋值、拷贝的问题。Java中没有运算符重载,所以Java中的赋值、传参的时候都是指针的拷贝,Java中如果想要使用深拷贝,可以考虑java.lang.object中的clone方法。

Java可以使用异常处理?
     Google C++ Coding Style中不推荐使用异常,Java中可以使用异常,另外注意Java中try-catch-finally的finally,使用起来比C++的枚举所有异常要方便。

RTTI与反射?

异常处理?

const final实现宏的功能?

猜你喜欢

转载自blog.csdn.net/batmancn/article/details/51731734