当前位置: 首页 > news >正文

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

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

相关文章:

  • Java核心技术 卷I # 阅读笔记 二 字符串
  • Java核心技术 卷I # 阅读笔记 三 eclipse的使用技巧(非书上内容)
  • LeetCode # Two Sum
  • Git常用命令
  • windows系统 # 1.快捷键
  • JS 输出空格
  • JS 消息框
  • JS 窗口操作
  • JS 改变HTML样式
  • 常见的计算机专业相关词汇汇总
  • JS 入门篇·编程挑战代码
  • 前端中的英语词汇
  • Win10 Edge 下载文件时文件名乱码 解决方案
  • sublime3 web开发环境配置
  • P1553 数字反转(升级版)
  • fetch 从初识到应用
  • Hibernate最全面试题
  • JavaScript 基本功--面试宝典
  • Java比较器对数组,集合排序
  • JAVA之继承和多态
  • LeetCode541. Reverse String II -- 按步长反转字符串
  • node入门
  • PHP的类修饰符与访问修饰符
  • UEditor初始化失败(实例已存在,但视图未渲染出来,单页化)
  • 初识MongoDB分片
  • 计算机在识别图像时“看到”了什么?
  • 聚类分析——Kmeans
  • 双管齐下,VMware的容器新战略
  • 微信端页面使用-webkit-box和绝对定位时,元素上移的问题
  • 一起来学SpringBoot | 第十篇:使用Spring Cache集成Redis
  • ​【原创】基于SSM的酒店预约管理系统(酒店管理系统毕业设计)
  • ​iOS安全加固方法及实现
  • ​创新驱动,边缘计算领袖:亚马逊云科技海外服务器服务再进化
  • ​渐进式Web应用PWA的未来
  • ​虚拟化系列介绍(十)
  • ![CDATA[ ]] 是什么东东
  • # .NET Framework中使用命名管道进行进程间通信
  • (NO.00004)iOS实现打砖块游戏(九):游戏中小球与反弹棒的碰撞
  • (react踩过的坑)antd 如何同时获取一个select 的value和 label值
  • (安全基本功)磁盘MBR,分区表,活动分区,引导扇区。。。详解与区别
  • (编程语言界的丐帮 C#).NET MD5 HASH 哈希 加密 与JAVA 互通
  • (附源码)spring boot基于Java的电影院售票与管理系统毕业设计 011449
  • (三分钟了解debug)SLAM研究方向-Debug总结
  • (四) 虚拟摄像头vivi体验
  • (转)关于多人操作数据的处理策略
  • (转)原始图像数据和PDF中的图像数据
  • ******IT公司面试题汇总+优秀技术博客汇总
  • .Net Attribute详解(上)-Attribute本质以及一个简单示例
  • .Net 高效开发之不可错过的实用工具
  • .net 流——流的类型体系简单介绍
  • .NET3.5下用Lambda简化跨线程访问窗体控件,避免繁复的delegate,Invoke(转)
  • .NET6 命令行启动及发布单个Exe文件
  • .netcore 如何获取系统中所有session_如何把百度推广中获取的线索(基木鱼,电话,百度商桥等)同步到企业微信或者企业CRM等企业营销系统中...
  • .Net中的集合
  • @Repository 注解