基础语法
第一个程序
使用编辑器创建一个Hello.java的文本文件(Java源码文件后缀为.java)
public class Hello{
public static void main(String[] args) {
System.out.println("hello world!");
}
}
打开命令行,执行编译命令
javac Hello.java
此时目录下产生一个Hello.class的字节码文件(字节码文件后缀为.class),执行运行命令,JVM则加载并运行Hello.class字节码
java Hello
控制台打印输出hello world!

早前,Java是一种纯粹的面向对象的编程语言,因此它的main函数也必须在一个类中声明。在编写Java代码时,首先必须得有一个类
变量与常量
在声明变量与常量时,基本与Dart语言类似
// 定义整型变量
int x = 100;
// 定义浮点型变量
double y = 3.14;
// 定义字符变量
char ch = 'a';
// 定义常量
final String name = "张三";
PS:Java10增加了var语法声明变量,但只能用于局部变量和for循环中
数据类型

总体上分为两种,基本数据类型和引用数据类型
8种基本数据类型

一些面试中常区分基本数据类型和引用数据类型
- 存储位置不同
在方法中定义的非全局基本数据类型变量的数据是存储在栈中的;而引用数据类型变量的数据是存放在堆中的,栈中仅存放数据在堆中的地址
- 传递方式不同
基本数据类型做方法参数时,是按值传递的;而引用数据类型做方法参数,是按引用传递
注意:此处所谓堆栈指JVM内部实现的概念,与C/C++编程中堆栈概念不一样,Java中的对象只能分配到堆中。
关于Java的值传递和引用传递,外国人有不同的说法,详见此处
字符
Java中,一个char保存的是一个Unicode字符,因此与C语言不同,char也可以表示中文。需要注意,Java中的char只能使用单引号''包裹
char c1 = 'z';
char c2 = '中';
字符串
与char类型不同,字符串String类型是引用类型,且字面量必须使用双引号"abc"括起来
String s1 = "编程之路";
String s2 = "从0到1";
// 使用“+”进行字符串拼接
String s3 = s1 + s2;
System.out.println(s3);
Java中的字符串是不可变类型,因此使用+进行大量字符串拼接时,性能较低,应使用StringBuffer或StringBuilder,Dart中也有类似的处理。
// StringBuilder是线程不安全的,但性能高于StringBuffer
// 单线程中应使用StringBuilder
StringBuilder sb = new StringBuilder("hello,");
sb.append("Bruce!");
sb.append("Hi!");
sb.append("Fine!");
System.out.println(sb);
PS:Java13 新增三引号"""语法,可用于表示字面量为多行的字符串
字符中的一些常用操作
// 字符串内容的比较必须使用equals方法而不是 “==”
String str = "hello";
System.out.println("hello".equals(str));
System.out.println("hello".equals(str == "hello"));
// 查找子串
"Hello".indexOf("l"); // 2
"Hello".lastIndexOf("l"); // 3
// 判断是否在头部或尾部包含子串
"Hello".startsWith("He"); // true
"Hello".endsWith("lo"); // true
// 字符串截取
"Hello".substring(2); // "llo"
"Hello".substring(2, 4); // "ll"
// 替换子串
String s = "hello";
s = s.replace('l', '-');
System.out.println(s); // "he--o"
// 去除首尾空格
" He l lo ".trim(); // "He l lo"
// 字符串分割
String s2 = "aa-bb-cc-dd";
String[] sArr = s2.split("-");
// 使用Arrays.toString可以打印数组
System.out.println(Arrays.toString(sArr)); // ["aa", "bb", "cc", "dd"]
// 字符串数组合并
String[] arr = {"x", "y", "z"};
String str2 = String.join("==", arr);
System.out.println(str2); // "x==y==z"
// 字符串分解为char数组
// 注意,Java的char数组与C语言不同,不包含\0结束符
char[] chs = "Helloworld".toCharArray();
数组
Java中的数组是一种固定长度的有序的相同类型元素的存储空间,与C语言中的数组相似,索引从0开始
// 声明一个数组变量
int[] arr;
// 通过字面量声明一个整型数组
int[] arr1 = new int[] { 68, 79, 91, 85, 62 };
// 简写形式
int[] array = { 6, 9, 1, 12, 23 };
// 声明一个长度为8的空数组
double[] arr2 = new double[8];
arr2[0] = 3.12;
arr2[1] = 1.48;
// 对数组调用length获取长度
System.out.println(arr1.length); // 5
需要注意:
空数组的所有元素都会被初始化为默认值,整型都是
0,浮点型是0.0,布尔型是falseboolean[] bs = new boolean[6]; System.out.println(bs[0]);数组一旦创建后,大小就不可改变
Java也存在多维数组
// 声明一个二维数组
int[][] scores = {
{ 82, 90, 91 },
{ 68, 72, 64 },
{ 95, 91, 89 },
{ 67, 52, 60 },
{ 79, 81, 85 },
};
二维数组表示,一个数组的元素也是数组。如上例,二维数组可以用来表示一个二维表。
数据类型转换
// 基础数据类型转字符串
String.valueOf(123); // "123"
String.valueOf(45.67); // "45.67"
String.valueOf(true); // "true"
// 字符串转基础数据类型
int num = Integer.parseInt("123"); // 123
boolean flags = Boolean.parseBoolean("true"); // true
double price = Double.parseDouble("0.5"); // 0.5
Java在处理数值类型时,存在自动类型转换的情况,即取值范围小的类型自动转换为取值范围大的类型
byte < short、char < int < long < float < double
分支与循环
Java中的分支和循环语句,与Dart基本相同
// if...else 逻辑分支
int n = 70;
if (n >= 90) {
System.out.println("优秀");
} else {
if (n >= 60) {
System.out.println("及格了");
} else {
System.out.println("挂科了");
}
}
if (n >= 90) {
System.out.println("优秀");
} else if (n >= 60) {
System.out.println("及格了");
} else {
System.out.println("挂科了");
}
// case 条件分支
int option = 1;
switch (option) {
case 1:
System.out.println("Selected 1");
break;
case 2:
System.out.println("Selected 2");
break;
case 3:
System.out.println("Selected 3");
break;
}
再来看循环语句
// while 循环
int sum = 0;
int n = 1;
/* 循环条件n小于等于100 */
while (n <= 100) {
sum = sum + n;
n ++; // n自增
}
System.out.println(sum);
// do...while 循环
int count = 0;
int l = 1;
do {
count += l;
l ++;
} while (l <= 100);
System.out.println(count);
// for循环打印奇数
for (int i=1; i<=10; i++) {
if (i % 2 == 0) {
continue;
}
System.out.println("i = " + i);
}
// 使用Java中的for each循环遍历数组
String[] lg = { "dart", "java", "go", "python"};
for (String n : lg) {
System.out.print(n + ", ");
}
// 传统for循环遍历,带索引
for (int i=0; i<lg.length; i++) {
int n = lg[i];
System.out.println(n);
}
公众号“编程之路从0到1”
