从C++到Java的注意点(上)

   1.Java的编译运行 

       Java中的package概念相当于C++中的namespace的概念。但是java会把package的名字和文件系统中目录结构对应起来,也即如果你申明了某个package的名字为com.tij.everythingisobj,那么你的文件系统中必须创建com/tij/everythingisobj这样一个目录结构,所有属于这个package的java源代码都会放在这个目录下!之所以要这么做,是为了jvm加载运行java代码方便,可以根据package并结合CLASSPATH来装载*.java编译后的*.class在什么位置。

例如EveryObject .java:

package com.tij.everythingisobj;

public class EveryObject {


 public static void main(String[] args) {


 }
}

 

javac  com/tij/everythingisobj/EveryObject.java

 首先用javac来编译*.java文件,生成*.class。可以把这些*.class打包成一个jar包,但必须保留完成的路径名称。

 

java com.tij.everythingisobj.EveryObject

生成*.class后,可以用在命令行中用java命令告诉jvm要装载哪个类并运行,此时jvm会根据CLASSPATH中设置的路径去搜索你要运行的类。如果你的CLASSPATH为 c:/; ./,那么jvm会在 c:/com/tij/everythingisobj和./com/tij/everythingisobj目录下搜索EveryObject类,并装载它的静态main函数运行。你也可以在java命令中加入 -cp来指定CLASSPATH.


java -cp ./everyobj.jar  com.tij.everythingisobj.EveryObject

如果你要运行*.jar文件,那么必须把你的*.jar文件包括在 -cp选项中。打开*.jar你可以看到里面也是完整的路径名,目录西面都是*.class。跟直接放在文件系统上执行是类似的。

 

2.Java的package

   所有*.java都要属于某一个package,一个package可以拥有n个 .java文件,每个.java文件中只能有一个public的类。而且这个类名必须与.java的名字一样。同一个package的 *.java文件都会放在文件系统的同一个目录下面。如果在*.java中没有指定package name,那么*.java属于它所在目录的默认的package,一般不用默认package。

 

2.Java的权限

package access权限

    Java的权限有 public, protected, package access, private。比较陌生的是package access,当类或者类成员没有加任何权限限定符时,这个类或者类成员的权限就是package access。也就是说只有在同一个package中可以访问,在不同package中是无法访问的。

 

例如在package com.tij.everythingisobj 中定义了一个StaticObject类,里面有一个 packageAccess()函数未加任何权限说明,那它就是package access的权限。

 

java package access

 

 

 在同一个package中( com.tij.everythingisobj ),staticObject对象可以访问packageAccess

package access

在不同package中,sobj对象是无法访问packageAccess函数的,因为这个函数仅在 com.tij.everythingisobj package中可见。

 

 

 

protected权限

    protected权限提供package access访问权限,但在继承时不同package中的子类需要访问父类中某些方法而这些方法又不希望最终暴露给用户,所以就引入需要protected权限,因为package access只能在同一个package中访问。  因为protected具有package access权限,所有在同一package中protected成员是可以让问,这一点不同于C++。你可以把上例中的packageAccess函数加上protected权限,结果是一样,在同一个package中可以访问,在不同package是不能访问。

 

3.Java对象的创建和销毁

    Java对象创建

    Java不能在本地栈上创建非primitive的对象,任何对象必须通过new在堆上创建,而且必须在对象名后跟上一对括号,new Object(),C++是非必须的。有java自动维护创建对象的引用计数器,当计数器为0时该对象可能被gc自动回收,所以java没有delete操作符。当对象创建时,如果你要在构造函数中调用另一个构造函数,那么你必须使用 this(argument ....)来调用!

       在构造函数调用之前,类中的所有静态对象会被率先初始化。java除了静态对象,还有静态代码块用 static {}来表示,大括号中的代码也会率先被初始化,这些静态对象只会被初始化一次。无论是静态对象还是非静态对象,它们都可以再申明时就初始化,甚至可以调用函数来初始化。

  java中初始化顺序是  静态成员->非静态成员->构造函数

一下代码最终打印

in s()
in f()
Static_Object()

 

java初始化顺序

 

    Java对象销毁

    java对象都是有gc来销毁的,当gc发现内存不够时会释放部分引用计数为0的对象。释放前会调用对象的finalize函数!但程序员不能依赖finalize,因为直到程序结束,gc都有可能不释放任何对象。

 

Java杂项

  java的每个类都可以有main函数,方便做测试.

    java ==  和 !=  操作符用于比较引用,所以即使两个对象的内容一样,这两个对象也是不相等的!如果要比较内容是否相同需要调用 equals,equals默认操作也是比较引用而不是内容,所以你需要覆盖这个函数来自己实现内容的比较!

  import static  com.tij.* 引入类的静态成员, 从C/C++角度看相当于引入一些“全局”函数。


   >>>无符号右移,不管操作对象是否有符号,高位总是补0

 

  for( int i: array) 相当于foeach,枚举array的所有元素。

数组的申明为 int []array或者int array[],数组有一个内置变量, array.length来指明数组的长度。数组在创建时可以初始化 int []array = new int[]{1,2,4};
enum Meat{PIG, DOG, CAT},引用时都需要加Meat.PIG, 除了在switch语句中,可以直接使用PIG。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值