Java核心技术 笔记——第3章

亚伦的博客 / 2023-05-11 / 原文

第3章 Java的基本程序设计结构

概述

  • 简单Java程序
  • 注释
  • 数据类型
  • 变量和常量
  • 运算符
  • 字符串
  • 输入与输出
  • 控制流程
  • 大数
  • 数组

一、 一个简单的Java程序

public class HelloWorld {
    public static void main(String[] args) {
        /* println方法输出后换行,print方法输出后不换行 */
        System.out.println("Hello World!");
    }
}

知识点:

第一行,public称为访问修饰符(access modifier),用于控制程序的访问级别。class称为
,类是所有Java应用构建模块。

源代码的文件名必须与公共类的类名相同

Java虚拟机总是从指定类中的main方法开始执行,且main方法必须声明为public

Java程序中main方法的声明格式:

public class ClassName {
    public static void main(String[] args) {
        //program statements
    }
}

二、注释

注释分为三种:

  1. 单行注释:// ...
  2. 多行注释:/*... */
  3. 文档注释 /** ... */
// this is a single-line comment

/* this is a multi-line comment */

/**
 * @date 2023/5/10 上午12:56
 * @description
 *  this is a document comment
 * @param
 */

注意

注释是不能够嵌套使用的

三、数据类型

Java是强类型语言。

补充

强类型语言即强制类型定义的语言,一旦某变量类型已经定义,那么如果不经强制转换,那么它永远都是该数据类型。例如:C++、Java

与之相反的弱类型语言则是某一个变量被定义类型,该变量可以根据环境变化自动进行转换,不需要经过强制转换。例如:JavaScript、PHP

Java中共有8基本类型(primitive type),4中整型、2种浮点型、1中字符型char和一种用于表示真值的boolean类型。

相较于C++“见机行事”的基本数据类型大小,Java明确规定具体的大小:

类型名称 存储需求 取值范围
int 4字节 -2 147 483 648到2 147 483 647(略高于20亿)
short 2字节 -32 768到32 767
long 8字节 -9 223 372 036 854 775 808到9 223 372 036 854 775 807
byte 1字节 -128到127

一般常用到int类型,其基本能够满足需求,byte和short类型主要运用在特定的应用环境下,比如:底层的文件处理或存储空间较小的数组中。

前文提到,Java中基本类型是固定的,所以很好的解决整型等基本数据类型溢出的问题,因为其数据类型范围与执行Java代码的机器无关。

补充

  • 长整型拥有后缀L或l,例如:4000000000000L
  • 十六进制数拥有前缀0x或0X,例如:0x1P-7
  • 八进制数拥有前缀-1,例如:033(但是由于此表示方法易混淆,所以很少使用八进制数)
  • 二进制数拥有前缀0b或0B,例如:0b10110101,还可以写成0b1011_0101(下画线仅帮助阅读,javac会去除这些下画线)

注意

Java并不存在无符号(unsigned)形式的数据类型

浮点型用于表示含有小数部分数值,Java中的浮点型有:

类型名称 存储需求 取值范围
float 4字节 -3.40E+38到3.40E+38(6~8位有效数字)
double 8字节 -1.797 693E+308到1.797 693E308 (15位有效数字)

在大多数情况下,float类型并不能够满足日常需求,所以在大多数情况下都是使用double类型。

补充

float类型具有后缀f或F,若没有此后缀默认为double类型

double类型具有后缀d或D,当然没有后缀也是可以的

特殊的字符和转义序列

转义序列 名称
\b 退格
\t 制表
\n 换行
\r 回车
\f 换页
" 双引号
' 单引号
\ 反斜杠
\s 空格
\newline 只在文本块中使用:连接上一行和下一行

建议

由于在Java中,char类型描述为UTF-16编码的一个代码单元

所以强烈建议不要在程序中使用char类型,除非确实需要处理UTF-16代码单元,最好的方式是将字符串作为抽象数据类型来处理

注意

在C++中可以使用数值或指针来代替布尔值,例如:值0表示false,但是在Java中则不会。

四、变量和常量

Java声明变量和变量的规则与C++类似。需要注意的是:Java对“字母”、“数字”等其他符号的范围更大,例如:在Java中可以使用中文作为变量名,但是在C++下不行。但是,强烈建议
不要使用中文作为变量名

补充

想要知道哪些Unicode字符可以作为标识符,可以使用Character.isJavaIdentifierStart
Character.isJavaIdentifierPart方法检查

区别

从Java 10开始,对于局部变量可以通过关键字var声明作为变量的“类型”,编译器会通过其变量的初始值推断出它的类型,而无需声明类型。

例如:

var test_variable=12;  /* this variable type is int */

同时Java并不会像C++一样区分声明和定义,在C++中:

int i ;   /* 这是一个定义 */
extern int j ; /* 这是一个声明 */

在Java中使用final关键词来只是常量。若某个常量需要在一个类中多个方法中使用,则需要创建类常量
,关键词为:static final

五、运算符

常见的+、-、*、/就不必说,注意点:①、当除数与被除数都为整数时,进行整数除法,其余都进行浮点除法;②、当除数为零时,将会得到无穷大或NaN的结果。

@startuml

left to right direction
[byte] --> [short]
[short] --> [int]
[int]->[long]
[char]->[int]
[int] -> [float] #line.dashed;
[int]->[double]
[float]->[double]
[long]->[float] #line.dashed;
[long]->[double] #line.dashed;

@enduml

总体上,从小到大数据是不会丢失的,特殊为:int -> float、long->float、long->
double。其次,若使用二元运算符连接两个数,总体上遵守转换为精度更高的数。

强制类型转换通过截断方式进行,例如:

        double number=9.997;
        int number_1=(int)number;   /* number_1 is 9 */
        int number_2=Math.round(number); /* number_2 is 10 */

若想通过舍入的方式获取更为精确的值,可以使用Math.round方法,其返回类型为long。

注意

不要将boolean类型进行强制类型转换,如有要求请使用:b?1:0

赋值其实是一个表达式(expression),所以以下赋值正确的:

int x=1;
int y=x+=3; /* y is 4 */

当然,这样的方式颇具恶趣味,O(∩_∩)O哈哈~

为了帮助理解赋值是表达式这个观念,上述的方式赋值无疑是冗余的,勿模仿。🐱