作者君水平有限,如有疏漏(也可能是时间的缘故导致文章中的一些东西有误)还请和善指出~Thanks♪(・ω・)ノ如果有帮助的话麻烦点个赞hh或者推荐给其他需要的人,转载注明出处(最好在评论区写一下~
) 即可。
本系列文章可以作为C++转Java的程序员阅读的参考材料或者学过java复习的时候需要注意的一点东西,但是面向群体不是刚刚接触编程的朋友哈~所以详略上有所取舍(基础知识可以自己先看书鸭,然后我这里稍稍总结了一下下坑点)。
一些初学Java时的注意事项>>>
1.Java的类名定义很宽松,main方法必须是public,main方法必须有一个外壳类,且Java的源文件名必须和外壳类的名字相同~(区分大小写),Java中没有成员函数的说法,术语称之为方法。
每个java程序必须有一个main方法(并且必须是static)。main方法没有返回退出代码而是正常运行完自动返回0,如果要返回其他值需要调用System.exit()
方法
2.问:如果java中想让输出不自动换行怎么做呢?
答:使用System.out.print()
方法。输出没有自动换行
3.Java中的数字加0b/0B前缀可以表示2进制数,还可以给数字加下划线如1_000_000,解析的时候为1000000(加下划线易读),Java没有无符号类型。float数据在数据加后缀f/F,double数据加后缀d/D,float有效位数大约6~7位,double大约15位,一般用double
还有一个十六进制的浮点数表书法可供拓展~此处就不展开了,因为不咋用。
Java的一个优点:整数的范围与运行java代码的机器无关。
4.Java里面比较很多东西都不能用==简单粗暴的解决,会带来很多问题。比如和特殊的数值,Double.POSITIVE_INFINITY,Double.NEGATIVE_INFINITY,Double.NaN
(Float同理),NaN的取值为计算负数的偶次方根或者0/0。这些时候要用Double.isNaN(x)
等方法。
并且浮点数运算有浮点误差,这个不展开啦~萌新请自寻查阅,Java中提供了一个BigDecimal
类处理金融等高精度计算。
5.Java中Unicode转义序列可以出现在引号内甚至引号外,处理的时候是解析代码前先处理一次转义,所以这个可能引入一些不太肉眼可见的问题和安全风险。
这里有一堆编码上的东西…初学者可以先跳了~大部分人都是等到要用的时候才来学的。
文章不阐述,提供一些参考材料。
[1]Java中码点和代码单元
[2]编码格式简介(ANSI、GBK、GB2312、UTF-8、GB18030和 UNICODE)
[3]Unicode字符集的编码方式以及码点、码元
符号 | 字符含义 |
---|---|
\n | 换行 0x0a |
\r | 回车 0x0d |
\f | 换页符 0x0c |
\b | 退格 0x08 |
\0 | 空字符 0x20 |
\s | 字符串 |
\t | 制表符 |
\" | 双引号 |
\’ | 单引号 |
\\ | 反斜杠 |
\ddd | 八进制字符 |
\uxxxx | 16进制unicode字符 |
6.Java中的bool值和整型值不能转换,c/c++中0是假非0为真,java中只有true和false代表真假,int型的0,1不能代表真假,并且会出编译错误。比如
if(x=0){
//do sth..
}
在c++中这是可以编译的,但是x=0返回0,不执行if块中的语句,但是在java中会直接报错,因为x=0不能转化成布尔值。
[Thinking&Experiment]
尝试
int x = 0;
System.out.println(x=0);
Output:
0
7.Java的变量名可用的“字母”和“数字”范围很大。包括很多民族中的独特字母和数字,变量名长度在语法上是没有限制(实际上受限于客观条件…)
检查这个字符是否可用使用如下两个方法:
isJavaIdentifierStart();
isJavaIdentifierPart();
含义如其名,故不予解释。
不能用保留字,(const被纳入保留字但似乎没有被使用)
不要用$,这个符号一般出现在java编译器或其他工具生成的名字中。
变量名大小写敏感。
Java语言支持的变量类型有:
类变量:独立于方法之外的变量,用 static 修饰。
实例变量:独立于方法之外的变量,不过没有 static 修饰。
局部变量:类的方法中的变量。
扩展阅读:Java 变量类型
变量的声明和定义,C/C++中区分变量的声明和定义。
eg.
c++中:
int i = 10;//声明+定义
extern int i;//声明
9.final表示常量,const虽然被保留但未被使用(书的版本edtion10,此后未知,有变动欢迎在评论区指出)。约定俗成常量用大写字母。
类常量:在一个类的多个方法中使用的常量。
final double PI = 3.14;//常量
static final double PI = 3.14;//类常量
类常量定义在main方法外。
如果还有public修饰,其他类也可以用。
*10.严格的浮点计算,本话题略。详情搜索 java strictfp
(书中亦略)一般情况涉及不到,仅在金融等相关领域会涉及。
11.数值类型之间的转换:
java中有一个特殊的就是低级类型转高级是自动的,高级转低级会报错,必须要自己手动强制类型转换(cast)。
具体不展开,细节请搜索 java 强制类型转换
推荐阅读材料:
在Java中进行基本类型的类型转换
问:java中如何让一个浮点数四舍五入?
答:用Math.round()
方法,返回值是long类型。
double t = 3.78;
int x = (int)Math.round(t);//不加(int)会报错!
12.java中的逻辑运算仍然是短路运算。
13.java中的字符串是不可变字符串。
问:java中如何修改字符串中某个字符?
答:用.substring()
方法。
eg.
public class tmp{
public static void main(String[] args){
String s = "abcdefg";
s = s.substring(0, 4)+"X"+s.substring(5,7);
System.out.println(s);
}
}
上述代码实现了修改d为X。
问:java中如何检测两个字符串相等?
答:用.equals
方法,如果要忽略大小写,用.equalsIgnoreCase
方法
eg.
public class tmp{
public static void main(String[] args){
String s = "abcd";
String p = "abcd";
String q = "ABCD";
if(s==p){
System.out.println("111111");
}
if(s.equals(p)){
System.out.println("2222222");
}
if(s.equalsIgnoreCase(q)){
System.out.println("333333333");
}
}
}
Output:
111111
2222222
333333333
但是!!这里用==
有很大的问题,书中有写到,千万不要用 ==
来检测两个字符串是否相等,因为只有字符串常量是共享的,+和substring操作的结果不是共享的,==
操作只能判断两个字符串是否在同一位置上。上述代码在编译器实现的时候其实是让s,p指向了内存中同一处存放abcd
的地址。
c++是因为重载了==
来检测字符串的相等性。
java中还有一种.compareTo()
方法可以实现类似.equals
的效果。