Java之旅
java大小写敏感
public class Hello
Hello是类名 class定义类
java语句总是从main方法开始执行!
Java入口程序规定的方法必须是静态方法,方法名必须为main
,括号内的参数必须是String数组
一个字节=八个比特
1byte=8bit
对于float
类型,需要加上f
后缀。
定义变量的时候,如果加上final
修饰符,这个变量就变成了常量:
常量在定义时进行初始化后就不可再次赋值,再次赋值会导致编译错误。
var关键字
有些时候,类型的名字太长,写起来比较麻烦。例如:
StringBuilder sb = new StringBuilder();
这个时候,如果想省略变量类型,可以使用var
关键字:
var sb = new StringBuilder();
int x = 1; // 变量x从这里开始定义
...
{
...
String s = "hello"; // 变量s从这里开始定义
...
} // 变量s作用域到此结束
...
// 注意,这是一个新的变量s,它和上面的变量同名,
// 但是因为作用域不同,它们是两个不同的变量:
String s = "hi";
它有一个作用域,就是从定义处开始,到语句块结束。**超出了作用域引用这些变量,编译器会报错。**尽量将变量定义在尽可能小的作用域,并且,不要重复使用变量名。
特别注意:整数的除法对于除数为0时运行时将报错,但编译不会报错。
溢出不会出错,却会得到一个奇怪的结果。
整数运算在除数为0
时会报错,而浮点数运算在除数为0
时,不会报错,但会返回几个特殊值:
double d = 1.2 + 24 / 5; // 5.2
计算结果为5.2
,原因是编译器计算24 / 5
这个子表达式时,按两个整数进行运算,结果仍为整数4
短路运算
布尔运算的一个重要特点是短路运算。如果一个布尔运算的表达式能提前确定结果,则后续的计算不再执行,直接返回结果。
因为false && x
的结果总是false
,无论x
是true
还是false
,因此,与运算在确定第一个值为false
后,不再继续计算,而是直接返回false
。
如果变量b
的值为true
,则表达式变为true && (5 / 0 > 0)
。因为无法进行短路运算,该表达式必定会由于除数为0
而报错
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-V2i8LNyC-1617603825976)(C:\Users\86132\AppData\Roaming\Typora\typora-user-images\image-20210403161556785.png)]
因为\
是转义字符,所以,两个\\
表示一个\
字符
注意要区分空值null
和空字符串""
,空字符串是一个有效的字符串对象,它不等于null
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fVKkvNuq-1617603825976)(C:\Users\86132\AppData\Roaming\Typora\typora-user-images\image-20210403163358068.png)]
java不能像c++一样在一行语句中执行多步操作!!!
数组
数组一旦创建后,大小就不可改变。
可以用数组变量.length
获取数组大小:
int[] ns = new int[] { 68, 79, 91, 85, 62 };//编译器自动推算数组大小为5
还可以进一步简写为:
int[] ns = {
68, 79, 91, 85, 62 };
对于数组ns
来说,执行ns = new int[] { 68, 79, 91, 85, 62 };
时,它指向一个5个元素的数组:
ns
│
▼
┌───┬───┬───┬───┬───┬───┬───┐
│ │68 │79 │91 │85 │62 │ │
└───┴───┴───┴───┴───┴───┴───┘
执行ns = new int[] { 1, 2, 3 };
时,它指向一个新的3个元素的数组:
ns ──────────────────────┐
│
▼
┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐
│ │68 │79 │91 │85 │62 │ │ 1 │ 2 │ 3 │ │
└───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┘
但是,原有的5个元素的数组并没有改变,只是无法通过变量ns
引用到它们而已。
输出
在前面的代码中,我们总是使用System.out.println()
来向屏幕输出一些内容。
println
是print line的缩写,表示输出并换行。因此,如果输出后不想换行,可以用print()
输入
和输出相比,Java的输入就要复杂得多。
首先,我们通过import
语句导入java.util.Scanner
,import
是导入某个类的语句,必须放到Java源代码的开头
要判断引用类型的变量内容是否相等,必须使用equals()
方法:
if (s1.equals(s2))
注意:执行语句s1.equals(s2)
时,如果变量s1
为null
,会报NullPointerException
:
要避免NullPointerException
错误,可以利用短路运算符&&
:
if (s1 != null && s1.equals(“hello”))
使用switch 注意有break,小心穿透效应!
数组
遍历数组可以使用for
循环,for
循环可以访问数组索引,for each
循环直接迭代每个数组元素,但无法获取索引;
使用Arrays.toString()
可以快速获取数组内容。
可以直接使用Java标准库提供的Arrays.sort()
进行排序;
对数组排序会直接修改数组本身。
二维数组就是数组的数组,三维数组就是二维数组的数组;
多维数组的每个数组元素长度都不要求相同;
打印多维数组可以使用Arrays.deepToString()
;
最常见的多维数组是二维数组,访问二维数组的一个元素使用array[row][col]
。
面向对象基础
一、方法
一个class
可以包含多个field
,例如,我们给Person
类就定义了两个field
:
class Person {
public String name;
public int age;
}
显然,直接操作field
,容易造成逻辑混乱。为了避免外部代码直接去访问field
,我们可以用private
修饰field
,拒绝外部访问: