Java核心技术 卷I # 阅读笔记 一 初学Java的注意事项(与C++对比)

版权声明:转载请注明原文地址即可,要是本文对您有些许帮助的话,请您在下方点个赞,谢谢啦ヾ(o◕∀◕)ノヾ https://blog.csdn.net/qq_33583069/article/details/86748506

作者君水平有限,如有疏漏(也可能是时间的缘故导致文章中的一些东西有误)还请和善指出~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的效果。

猜你喜欢

转载自blog.csdn.net/qq_33583069/article/details/86748506
今日推荐