Java基础语法

3. Java基础语法

3.1 注释

在Java中3种标记注释的方式:

  • 使用//,其注释内容从//开始到本行结尾

    System.out.println("Hello World!");  //你好世界!
    
  • 使用/* */,其注释内容为比较长篇的内容。

    /* 
    
    System.out.println("Hello");
    
    System.out.println("World!");
    
    */
    
  • 使用/** */,用来自动地生成文档。

    Demo1.java
    
    /**
    
    *This is the first demo!
    
    *@version 1.0
    
    *@author yihangjou
    
    */
    
    public class Demo1 {
    
    	public static void main(String[] args) {
            
        	System.out.println("Everything will be OK!");
            
        }
    
    }
    

注意:在Java中,/* */注释不能嵌套。

3.2 数据类型

3.2.1 整型

整型用于表示没有小数部分的数值,它允许是负数。Java提供了4中整型:

3.2.2 浮点类型

浮点类型用于表示有小数部分的数值。在Java中有两种浮点类型:

3.2.3 char类型

  • char类型的字面量值要用单引号括起来。
  • char类型的值可以表示为十六进制值,其范围从u0000到Uffff。
  • 在Java中char类型描述了UTF-16编码中的一个代码单元。
  • 建议不要在程序中使用char类型,除非确实需要处理UTF-16代码单元。最好将字符串作为抽象数据类型处理。

3.2.4 boolean类型

  • boolean(布尔)类型有两个值:false和true,用来判定逻辑条件。
  • 整型值和布尔值之间不能互相转换。

3.3 变量

3.3.1 变量的初始化

  • 声明一个变量之后,必须用赋值语句对变量进行显式初始化,不能使用未初始化的变量。

  • 变量的声明尽可能地靠近变量第一次使用的地方。

3.3.2 常量

  • 在Java中,利用关键字final指示常量。

  • 关键字final表示这个变量只能被赋值一次。一旦被赋值之后,就不能够再更改了。

  • 习惯上,常量名使用全大写。

  • 使用关键字static final设置一个类常量,可以实现某个常量可以在一个类中的多个方法中使用。(类常量的定义位于main方法的外部)

    Demo2.java
        
    public class Demo2 {
    
    	public static final INCH = 3.14;
    
    	public static void mian(String[] args) {
    
    	double width =8.5;
    
    	double weight = 11;
    
    	System.out.println("Paper size in:" + width*NCH + "by" + weight*INCH);
    
    	}
    
    }
    

3.4 运算符

算术运算符:+、—、*、/、++、——

&&(与)、||(或)、!(非)

注意:整数被0除将会产生一个异常,而浮点数被0除将会得到无穷大或NaN结果。

3.4.1 数值类型之间的转换

【标注】:实心箭头表示无信息丢失的转换;虚箭头表示可能有精度损失的转换。

  • 如果两个操作数中有一个是double类型,另一个操作数就会转换为double类型
  • 否则,如果其中一个操作数是float类型,另一个操作数将会转换为float类型
  • 否则,如果其中一个操作数是long类型,另一个操作数将会转换为long类型
  • 否则,两个操作数都将被转换为int类型

3.4.2 强制类型转换

语法格式:在圆括号中给出想要转换的目标类型,后面紧跟待转换的变量名。

double x = 9.997;

int y = (int) x;

// 结果:y = 9

3.4.3 关系和boolean运算符

&&和||运算符是按照“短路”方式来求值的:如果第一个操作数已经能够确定表达式的值,第二个操作数就不必计算了。

3.4.4 位运算符

  • 处理整型类型时,可以直接对组成整型数值的各个位完成操作。这意味着可以使用掩码技术得到整数中的各个位。位运算符包括:

    &(“and”) |(“or”) ^(“xor”) ~(“not”)
    
  • >>和<<运算符将位模式左移或者右移

3.4.5 运算符优先级

3.5 字符串

3.5.1 子串

String类的substring方法可以从一个较大的字符串提取出一个子串。

String hi = "hello";
String s = hi.substring(0,3);

//计算子串的长度:
String length = s.substring(b-a);

3.5.2 拼接

Java语言使用+号连接(拼接)两个字符串。

3.5.3 字符串比较

  • 使用equals方法检测两个字符串是否相等。
  • 使用equalsIgnoreCase方法检测两个字符串是否相等,而不区分大小写。

3.5.4 空串和Null串

  • 空串“”是长度为0的字符串。

  • String变量可以存放一个特殊的值,名为null,表示目前没有任何对象与改变量关联。

3.5.5 实战演示

public class Demo3 {
    public static void main(String args[]) {
        String str = "Java is the best language!";
        int num1 = str.indexOf("ava");// 字符串查找
        System.out.println("ava最先出现的位置是"+num1);
        int num2 = str.lastIndexOf("lan");
        System.out.println("lan最后出现的位置是"+num2);
        char str1 = str.charAt(6); // 获取指定索引位置的字符
        System.out.println("第六个字符为:"+str1);
        String str2 = str.substring(6); // 获取子字符串
        System.out.println("第六个以后的字符串为"+str2);
        String str3 = str.substring(6, 9);
        System.out.println("六到九的字符串为:"+str3);
        String str4 = str.trim(); // 去除空格
        System.out.println("去掉空格后的字符串为:"+str4);
        // 字符串替换
        String str5 = str.replace("Java", "Chinese");// 方法可实现将指定的字符或字符串替换成新的字符或字符串
        System.out.println("将java替换为chinese"+str5);

        // 判断字符串的开始与结尾
        Boolean bl1 = str.startsWith("J");
        System.out.println("字符串以J开头:"+bl1);
        Boolean bl2 = str.endsWith("J");
        System.out.println("字符串以J结尾:"+bl2);

        // 字母大小写转换
        String str6 = str.toLowerCase();
        System.out.println("全转为小写后:"+str6);
        String str7 = str.toUpperCase();
        // 字符串分割
        System.out.println("全转换为大写后"+str7);
        String[] str8 = new String[8];
        str8 = str.split("a", 5);
        System.out.println("将字符串用a分隔开,结果为:");
        for(int i=0;i<str8.length;i++){
            System.out.print(str8[i]);
        }
        System.out.print("结束");
    }

}

3.6 输入输出

3.6.1 读取输入

打印输出到“标准输出流”(控制台窗口)是一件非常容易的事情,只要调用System.out.println即可。然而,读取“标准输入流”System.in,通过控制台输入,首先需要构造一个Scanner对象,并与“标准输入流”System.in关联。

Scanner in = new Scanner(System.in);

nextLine方法将输入一行:

String name = in.nextLine();

使用nextLine方法是以为在输入行中有可能包含空格。要想读取一个单词(以空白符作为分隔符),可以调用:

String name = in.next();

要想读取一个整数,就调用nextInt()方法:

int age = in.nextInt();

要想读取一个浮点数,就调用nextDouble()方法。依次类推。

Scanner类定义在java.util中。当使用的类不是定义在基本java.lang包中时,一定要使用import指示将相应的包加载进来。

【注释】读取密码

因为输入是可见的,所以Scanner类不适用于从控制台读取密码。Java SE 6特别引入了

Console类实现这个目的。要想读取一个密码,可以采用下列代码:

Console cons = System.console();
String username = cons.readline("User name:");
char[] passwd = cons.readPassword("Password:");

为了安全起见,返回的密码存放在一堆字符数组中,而不是字符串中。在对密码进行处理之后,应该马上用一个填充值覆盖数组元素。

采用Comsole对象处理输入不如采用Scanner方便。每次只能读取一行输入,而没有能够读取一个单词或一个数值的方法。

3.6.2 格式化输出

使用System.out.print(x)将数值x输出到控制台上。这条命令将以x对应的数据类型所允许的最大非0数字位数打印输出x。

double x = 1000.0 / 3.0;
System.out.print(x);
// 打印结果:3333.3333333333335

在早期的Java版本中,格式化数值曾经引起过一些争议。庆幸的是,Java SE 5.0沿用了C语言库函数中的printf方法。例如:

System.out.printf("%8.2f",x);
// 打印结果: 3333.33

可以用8个字符的宽度和小数点后两个字符的精度打印x。也就是说,打印一个空格和7个字符。

在printf中可以使用多个参数:

System.out.printf("Hello, &s.Nexyear,you`ll be %d", name, age);

每一个用%开始的格式说明符号都用相应的参数替换。格式说明符后面的转换符号指示被格式化的数值类型:f表示浮点数,s表示字符串,d表示十进制整数。用于printf的转换符号,如下图所示:

另外,还可以给出控制格式化输出的各种标志。例如,逗号标志增加了分组的分隔符。

System.out.printf("%,.2f",10000.0 / 3.0);
// 打印结果: 3,333.33

可以使用多个标志,例如,""%,(.2f)"使用分组的分隔符并将负数括在括号内。用于printf的标志:

注释:可以使用s转换符号格式化任意的对象。对于任意实现了Formattable接口的对象都将条用formatTo方法;否则将调用toString方法,它可以将对象转换为字符串。

可以使用静态的String.format方法创建一个格式化字符串,而不打印输出:

String message = String.format("Hello,%s.Next year, you`ll be %d",name,age);

printf方法中日期与时间的格式化选项。首先,我们先看一下日期和时间的转换符:

图中只给出指定日期的部分信息。如果需要多次对日期操作才能实现对每一部分进行格式化的目的就太过繁琐。为此,可以采用一个格式化的字符串指出要被格式化的参数索引。所以必须紧跟在%后面,并以$终止。

System.out.printf("%1$s %2$tB %2$te,%2$tY", "Due date:", new Date());
// 打印结果:Due date:August 30, 2020

还可以选择使用<标志。它指示前面格式说明中的参数将被再次使用。下列语句将与前面语句同样的输出结果:

System.out.printf("%s %tB %<te, %<tY","Due date:",new Date());

提示:参数索引值从1开始,而不是从0开始,%1$…对第1个参数格式化。这就避免了与0表示混淆。

3.6.3 文件输入与输出

要想对文件进行读取,就需要一个用File对象构造一个Scanner对象,如下所示:

Scanner in = new Scanner(Paths.get(myfile.txt),"UTF-8");

如果文件名中包含反斜杠符号,就要记住在每个反斜杠之前再加一个额外的反斜杠:”c:\mydirctory\myfile.txt"。

要想写入文件,就需要构造一个PrintWriter对象。在构造器中,只需要提供文件名:

PrintWriter out = new PrintWriter("myfile.txt", "UTF-8");

推荐阅读:Java输入输出流总结-IT技术站

3.7 控制流程

Java使用条件语句和循环结构确定控制流程。

3.7.1 块作用域

块(复合语句),是指由一对大括号括起来的若干条简单的Java语句。块确定了变量的作用域。一个块可以嵌套在另一个块中。

但是,不能再嵌套的两个块中声明同名的变量。

3.7.2 条件语句

在Java中,条件语句的格式为:

if(condition) statement //这里的条件必须用括号扩起来

在Java中,更一般的条件语句格式如下所示:

if(condition) statement1 else statement2

其中else部分是可选的。else子句与最邻近的if构成一组。

3.7.3 循环

当条件为true时,while循环执行一条语句/一个语句块。一般格式为:

while(condition) statement

如果开始循环条件的值就为false,则while循环体一次也不执行。

do/while循环语句

它的语法格式为:

do statement while (condition);

这种循环语句先执行语句/语句块,再检测循环条件;然后重复语句,再检测循环条件,依次类推。

3.7.4 确定循环

for循环语句是支持迭代的一种通用结构,利用每次迭代之后更新的计数器或类似的变量来控制迭代次数。

for(int i = 1; i <= 10; i++)
    System.out.println(i);

如果在for语句内部定义一个变量,这个变量就不能再循环体之外使用。如果希望在for循环体之外使用循环计算的最终值,就要确保这个变量在循环语句的前面且在外部声明。

3.7.5 多重选择:switch语句

switch语句将从与选项值相匹配的case标签处开始执行知道遇到break语句,或者执行到switch语句的结束处位置。如果没有相匹配的case标签,而有default子句,就执行这个子句。

3.7.6 中断控制流程语句

  • break

不带标签的break语句,与用于退出switch语句的break语句一样,它也可以用于退出循环语句。

while(years <= 100) {
    balance += payment;
    double interest = balance * interestRate / 100;
    balance += interest;
    if(balance >= goal) break;
    years++;
}

在循环开始时,如果years>100,或者在循环体中balance>=goal,则退出循环语句。

带标签的break语句,标签必须放在希望跳出的最外层循环之前,并且必须紧跟一个冒号。

Scanner in = new Scanner(System.in);
int n;
read_data:
while(……) {
    for(……) {
        System.out.print("Enter a number >= 0:");
        n = in.nextInt();
        if(n < 0)
            break read_data;
    }
}

如果输入有误,通过执行带标签的break跳转到带标签的语句块末尾。对于任何使用break语句的代码都需要检测循环是正常结束,还是由break跳出。

  • continue

与break语句一样,continue将中断正常的控制流程。continue语句将控制转移到最内层循环的首部。

Scanner in = new Scanner(System.in);
while(sum < goal) {
    System.out.print("Enter a number:");
    n = in.nextInt();
    if(n<0) continue;
    sum += n;
}

如果n<0,则continue语句越过了当前循环体的剩余部分,立刻跳到循环首部。

还有一种带标签的continue语句,将跳到与标签匹配的循环首部。

  • break 和 continue的区别:
  1. break用于完全结束一个循环,跳出循环体执行循环后面的语句。
  2. continue和break有点类似,区别在于continue只是终止本次循环,接着还执行后面的循环,break则完全终止循环。可以理解为continue是跳过当次循环中剩下的语句,执行下一次循环。

3.8 大数值

如果基本的整数和浮点数精度不能够满足需求,那么可以使用java.math包中的两个很有用的类:BigInteger和BigDecimal。这两个类可以处理包含任意长度数字序列的数值。BigInteger类实现了任意精度的整数运算,BigDecimal实现了任意精度浮点数运算。

使用静态的valueOf方法可以将普通数值转换为大数值:

BigInteger a = BigInteger.valueOf(100);

加减乘除

// 普通计算:
yihang = yihang * (n - i + 1) / i;
// 大数值计算:
yihang = yiahng.multiply(BigInteger.valueOf(n-i+1)).divide(BigInteger.valueOf(i));

3.9 数组

数组是一种数据结构,用来存储同一类型值得集合。通过一个整型下标可以访问数组中的每一个值。在声明数组变量时,需要指出数组类型(数据元素类型紧跟[])和数组变量的名字。

int[] a; //声明数组变量a

int[] a = new int[100]; //初始化a为一个长度为100的数组,数组的下标从0~99

创建一个数组数组时,所有元素都初始化为0。boolean数组的元素会初始化为false。对象数组的元素则初始化为一个特殊值null,这表示这些元素(还)为存放任何对象。

String[] names = new String[10]; //表示创建了一个包含10个字符串的数组,所有字符串都为null。

要想获取数组中元素的个数,可以使用array.length

3.9.1 for each循环

Java有一种功能很强的循环结构,可以用来依次处理数组中的每个元素(其他类型的元素集合亦可)而不必为指定下标值而分心。

for (variale: collection) statement

定义一个变量用于暂存集合中的每一个元素,并执行相应的语句/语句块。collection这一集合表达式必须是一个数组或者是一个实现了Iterable接口的类对象(ArrayList)。

for(int element: a)
    System.out.println(element);

//使用for循环也可以获得同样的效果,但是for each 语句相比更加简洁、不易出错
for(int i = 0;i < a.length; i++)
    System.out.println(a[i]);

3.9.2 数组初始化以及匿名数组

在Java中,提供了一种创建数组对象并同时赋予初始化值得简化书写形式。

int[] smallPrimes = {2,3,4,5,6,7};

//初始化一个匿名的数组
new int[] {11,32,123,6,45}

在Java中,允许数组长度0。在编写一个结果为数组的方法时,如果碰巧结果为空,则这种语法形式就显得非常有用。注意,数组长度与null不同。

3.9.3 数组拷贝

在Java中,允许将一个数组变量拷贝给另一个数组变量。这时两个变量将引用同一个数组:

int[] arr = smallPrimes;
arr[3] = 5;

如果要将一个数组的所有值拷贝到一个新的数组中去,就要使用Arrays类的copyOf方法:

int copyArray = Arrays.copyOf(arr, arr.length);

3.9.4 命令行参数

每一个Java应用程序都有一个带String arg[]参数的main方法。这个参数表明main方法将接收一个字符串数组,也就是命令行参数。

3.9.5 数组排序

要想对数值型数组进行排序,可以使用Arrays类中的sort方法:

int[] a = new int[1000];
……
Arrays.sort(a);

这个方法使用了优化的快速排序算法。

3.9.6 多维数组

多维数组将使用多个下标访问数组元素,它适用于表示表格或更加复杂的排列形式。

声明一个二维数组:

double[][] balances;

都说酒是陈的香。
原文地址:https://www.cnblogs.com/yihangjou/p/13586299.html