如何运行java程序
java程序运行的过程如下:
java规定public static void main(String[] args)是java程序固定的入口方法,java程序总是从main函数开始执行的,然后编译成字节码,在jvm上面运行.
java是纯面向对象的语言,以类为基本单位,主函数也是在类下,示例:
public class Main
{
public static void main(String[] args)
{
System.out.println("ubuntu");
}
}
Main是类名,main是主函数.
编译:javac Main.java
生成Main.class文件
运行:java Main
java11中新增加的一个功能,直接运行一个单文件的源码.
java Main.java //不依赖第第三方库,但实际上很少碰见不依赖第三方库.
变量和数据类型
在java中,变量分为基本类型变量和引用类型变量.
基本数据类型:
整数类型: byte,short,int,long
浮点: float,double
字符类型: char(除了表示ASCLL,还可以表示Unicode字符,在java的内存中总是使用Unicode字符)
布尔类型: boolean
所用字节数:
常量是由final修饰符
final double PI = 3.14; // PI是个常量
var关键字可以识别类型,在类名太长的时候可以使用.
StringBuilder sb = new StringBuilder();
var sb = new StringBuilder(); // 上下两句等价
字符串类型
字符串类型是引用类型.引用类型类似于c/c++中的指针,更像是给数据起一个别名,包括类也是引用类型,基本数据类型是在栈中存储,而引用类型的内容则是存储在堆中,别名或者数据变量名放在栈中.
String str = "abcd";
String str = "ab\"cd";
String str = "ab\\cd";
字符串由"…“表示,str代表着”…“字符串,而内容则是放在堆中,随时更改.如果中间需要"符号,需要用一个转义字符”,因为\也是转义字符,所以用\表示.
常见转义字符:
" 表示字符"
’ 表示字符’
\ 表示字符
\n 表示换行符
\r 表示回车符
\t 表示Tab
\u 表示一个Unicode编码的字符
例如:
String s = "\u4e2d\u6587"; // s表示"中文"
字符串连接
字符串之间通过+连接,而且会将其他数据类型转换成字符串类型.
public class Main {
public static void main(String[] args) {
int age = 25;
String s = "age is " + age;
System.out.println(s);
}
}
java的字符串还有所谓的不可变特性,其实就是引用类型的属性一样.
public class Main {
public static void main(String[] args) {
String s = "hello";
System.out.println(s); // 显示 hello
s = "world";
System.out.println(s); // 显示 world
}
}
在内存中是这样的:
代表着原来的"hello"一直在,无法通过s访问了,但是s命名一直不变,内容却变成了"world".
引用类型的变量可以是空,用null表示,表示不存在,变量不指向任何内容.
String s1 = null; // s1是null
String s2; // 没有赋初值值,s2也是null
String s3 = s1; // s3也是null
String s4 = ""; // s4指向空字符串,不是null
数组类型
数组也是引用类型,和c/c++声明不太一样,java中的数组类型也是作为一种引用类型存在的,使用类型[]声明,初始化用new 类型[整数].
java数组特点:
1. 数组所有元素初始化为默认值,整型都是0,浮点型是0.0,布尔型是false;
2. 数组一旦创建后,大小就不可改变。
3. 访问数组中的元素,使用索引下标.数组索引从0开始.可以修改人一一个元素.
而且java中对数组的操作要比c/c++严谨,如果超出了范围,就会报错,因为数组是引用类型,在申请别名的时候就是相应的个数.
public class Main {
public static void main(String[] args) {
// 5位同学的成绩:
int[] ns = new int[5];
int n = 5;
System.out.println(ns[n]); // 索引n不能超出范围,抛出异常
}
}
定义一个数组可以直接指定元素
int[] ns = new int[] { 68, 79, 91, 85, 62 };
int[] ns = { 68, 79, 91, 85, 62 }; // 上下两句等价
因为数组也是引用类型,具有数组大小不可变的特性.
public class Main {
public static void main(String[] args) {
// 5位同学的成绩:
int[] ns;
ns = new int[] { 68, 79, 91, 85, 62 };
System.out.println(ns.length); // 5
ns = new int[] { 1, 2, 3 };
System.out.println(ns.length); // 3
}
}
内存中分布如下:
每个数组的别名或者变量名没有变,但是内容改变了,但是每个数组的大小确实没有改变.
字符数组
若数组中的元素是引用类型,修改元素之后,同样按照常规理解,但是数组中存储是变量的别名,而不是内容,有可能这个别名未命名,但是是实际存在的.内容改变,指向的也改变了.
存储结构如下:
输入输出
java中使用System.out.println()来向屏幕输入.
格式化输出和c类似.
public class Main {
public static void main(String[] args) {
double d = 3.1415926;
System.out.printf("%.2f\n", d); // 显示两位小数3.14
System.out.printf("%.4f\n", d); // 显示4位小数3.1416
}
}
占为符也和c类似
java中使用Scanner类来从控制台中读取内容.需要引入Scanner包
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in); // 创建Scanner对象,System.in代表标准输入流
System.out.print("Input your name: "); // 打印提示
String name = scanner.nextLine(); // 读取一行输入并获取字符串
System.out.print("Input your age: "); // 打印提示
int age = scanner.nextInt(); // 读取一行输入并获取整数
System.out.printf("Hi, %s, you are %d\n", name, age); // 格式化输出
}
}
循环语句
循环语句和c/c++类似,包括for,while,do while,还有基本的判断语句if等等…
for each循环经常用来遍历数组,for each基本格式如下
public class Main {
public static void main(String[] args) {
int[] ns = { 1, 4, 9, 16, 25 };
for (int n : ns) {
System.out.println(n);
}
}
}
其中n代表数组中的数据类型,ns代表遍历数组的名称,但无法制定遍历顺序.而且在java中,for each无法修改其中的数据元素.
switch
在java12中,switch可以使用类似于模式匹配的方法,不要用break.
public class Main {
public static void main(String[] args) {
String fruit = "apple";
switch (fruit) {
case "apple" -> System.out.println("Selected apple");
case "pear" -> System.out.println("Selected pear");
case "mango" -> {
System.out.println("Selected mango");
System.out.println("Good choice!");
}
default -> System.out.println("No fruit selected");
}
}
}
直接用->符号来表示,若满足case直接跳出,并执行语句.
不仅如此,switch还可以直接返回值.
public class Main {
public static void main(String[] args) {
String fruit = "apple";
int opt = switch (fruit) {
case "apple" -> 1;
case "pear", "mango" -> 2;
default -> 0;
}; // 注意赋值语句要以;结束
System.out.println("opt = " + opt);
}
}
若在case中需要大多语句来表达,可以使用yield来返回该条case的值.
public class Main {
public static void main(String[] args) {
String fruit = "orange";
int opt = switch (fruit) {
case "apple" -> 1;
case "pear", "mango" -> 2;
default -> {
int code = fruit.hashCode();
yield code; // switch语句返回值
}
};
System.out.println("opt = " + opt);
}
}
二维数组打印
可以使用java自带的deepToString(数组名)方法打印.
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
int[][] ns = {
{ 1, 2, 3, 4 },
{ 5, 6, 7, 8 },
{ 9, 10, 11, 12 }
};
System.out.println(Arrays.deepToString(ns));
}
}
命令行参数
java程序的入口是main()方法,main方法接受一个命令行参数,这个参数类型就是字符串数组String[].
public class Main {
public static void main(String[] args) {
for (String arg : args) {
System.out.println(arg);
}
}
}
编译之后,运行程序输入参数,并执行其中的语句