Java基础

如何运行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);
	}
    }
}

编译之后,运行程序输入参数,并执行其中的语句

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值