第一章 Java初识

Java 初识

JVM

JVM(Java Virtual Machine)也即 Java 虚拟机,是 Java 平台无关性实现的关键。有些高级语言,如果要在不同的平台上运行(Windows 、Linux),则需要编译成不同的目标代码。引入 JVM 之后, Java 在不同的平台上运行,是不需要重新编译的

Java 程序执行过程

源文件(.java)->编译器(compiler)编译生成字节码文件(.class)->解释器(interpreter)进行执行->Program
# 这里解释执行的过程,就是由 JVM 来完成的

JVM 解释执行编译过程中生成的字节码文件,把字节码文件解释成具体平台上的机器指令执行。实现一次编译,到处运行

JDK

JDK(Java Development Kit),也即 Java 语言的软件开发工具包。在我们的开发阶段,Java 程序的编译和执行就是依靠 JDK 完成的

两个主要组件:
1、javac 编译器,将源程序转成字节码
2、java 运行编译后的 Java 程序(.class 后缀的)

javac HelloWorld.java  在同一目录下生成 HelloWorld.class 文件
java HelloWorld 输出 HelloWorld!

JRE

JRE(Java Runtime Environment),也即 Java 运行时环境。包括 JVM,Java 核心类库和支持文件。如果只需要运行 Java 程序,下载并安装 JRE 即可。如果要开发 Java 软件,则需要下载 JDK。在 JDK 中附带有 JRE

JDK,JRE,JVM 之间的关系

在这里插入图片描述

Java 环境配置

配置环境变量

计算机 -> 右键属性 -> 高级系统设置 -> 环境变量 -> 在系统变量中找到 path
-> 在 path 最后加分号用于分隔已有的环境变量,并在最后加上 jdk 的路径,这里就是 E:\jdk1.8.0_92\bin

注:如果是在命令行中执行 javac 命令,配置完环境变量之后需要重启命令行

下图为 JDK 的安装目录,里面有熟悉的 javac.exe 和 java.exe
在这里插入图片描述
在这里插入图片描述

Java 命令行执行

带参数

# 源码
public static void main(String[] args) {
	System.out.println(args[0]);
}
# 执行,其中的 HelloWorld!是作为参数传入的
# args[0],args[1]是通过空格来分隔的
javac ArgsDemo.java
java ArgsDemo HelloWorld!

Eclipse

bin 目录

.class 文件的路径

保存

在 Eclipse 中,保存就是一次编译的过程

Java 语法

标识符

类名,变量名,方法名都是标识符

命名规则:
1、可以由字母,数字,下划线(_),美元符($)组成,不能以数字开头
2、严格区分大小写
3、不能是关键字(Eclipse 中紫颜色的部分)
4、标识符的命名最好能反映出其作用

变量

命名规范

变量的三个元素:变量类型、变量名和变量值

变量名命名规则:
1、满足标识符命名规则
2、符合驼峰法命名规范(age,stuName)
3、尽量简单,做到见名知意
4、变量名的长度没有限制

类名命名规则:满足Pascal命名法规范(每个单词首字母都大写)

局部变量

方法级的变量

栈,堆,常量池都是在内存中划出的区域。方法级的变量(局部变量)都是存储在栈中的
在这里插入图片描述
以 int n =100; 为例

1、先在栈中开辟一个 int 大小的空间(占用4字节)
2、将 100 这个整型字面值存储到开辟的空间当中(变量的名字 n 可以看做 100 所在的内存空间的别名)

变量定义

int x,y;
int x=0,y;
int x=0,y=0;

数据类型

在这里插入图片描述
在这里插入图片描述
1个字节是8位(8个二进制位)

字面值(变量值)

整型

Java 中有三种表示整数的方法:十进制、八进制、十六进制

八进制:以0开头,包括0-7的数字
十六进制表示:以0x或0X开头,包括0-9的数字,及字母a-f,A-F(a表示10,后面以此类推)

// L 可大写可小写
long num = 0xa2cdf3ffL

默认 int

浮点型

默认 double,也可以在值后加 d 或 D

范围大的变量可以给范围小的赋值会报错,反之不会。想不报错可以进行强制类型转换,但会造成数据丢失

double 表示的双精度浮点型范围是最大的

// 会报错,默认的 double 为双精度浮点型,float 为单精度浮点型
float f = 1234.328
double num = 123;
// 输出为 123.0
// 用科学计数法表示浮点型数据
// 表示1.23乘以10的5次方,E也可以小写
double a = 1.23E5;

字符型

字符型字面值用单引号内的单个字符表示

char a = 'a';
// 输出结果为 A,ASCII 码
char b = 65;
char ch = 'a';
ch++;
// 输出结果为 b
System.out.println(ch);
// 循环输出26个字母
char ch = 'a';
while(ch<='z'){
	System.out.println(ch);
	ch++;
}

字符串

字符串不属于基本数据类型,字符串中可包含0个或多个字符

编码

ASCII 码

为什么要使用编码?计算机都是用二进制来表示数据的,编码就是人们约定的一些规则

ASCII 码即美国标准信息交换代码,主要用于显示现代英语和其他西欧语言。使用7位或8位二进制数组合来表示128或256种可能的字符

7位二进制数组合 – 标准 ASCII 码,主要用来表示大小写字母,标点符号等
8位二进制数组合 – 扩展 ASCII 码

在这里插入图片描述

Unicode 编码

又称万国码,目标是支持世界上所有的字符集

Unicode 表示法为在值前面加前缀 \u

// 正常情况下,单引号中只能包含单个字符
char a = '\u005d'

输出换行

1、’\n’
2、System.out.println();

转义字符

在这里插入图片描述

// 这里的 \t 表示 Tab 键,必须是双引号,不能是单引号
System.out.println("a"+"\t"+"b");
// 单引号时输出的是一个整数
int a=3,b=5;
System.out.println(a+'\t'+b);
// 如何在使用单引号的情况下实现字符串的拼接
System.out.println(""+a+'\t'+b);
public String info() {
	String str = "专业信息如下:\n专业名称:" + this.getSubjectName();
	return str;
}

//返回结果
专业信息如下:
专业名称:计算机科学与应用

类型转换

数据表示范围小的可以转换成数据表示范围大的(自动类型转换)
在这里插入图片描述
图中无论实线,虚线都是自动类型转换

特例:
定义一个 char 类型时是可以给他赋值为一个整型的,但是整型的范围有限制的。因为 char 类型表示的是 0-65535 之间的整型

char a = 65;
char b = (char)65536;

常量

命名规则:一般用大写字母表示。一个单词使用全大写;多个单词则全大写,每个单词中间用下划线连接 MIN_VALUE

// a 的值不能再被改变
final int a = 1;

逻辑运算符

表达式由运算符和操作数组成

算数运算符

+
-
*
/
%
++
--

++,–属于单目运算符,±*/%都属于双目运算符

// 分子分母都是整型时,/的结果为整除后的结果,如13/5=2
// 分子分母有一个是浮点型时,结果就是正常相除的结果,如13.0/5=2.6
13%5=3
13.5%5=3.5
// 自增放在前面,则先执行加1运算
num2=++num1
上述表达式可以拆分为(假定num1=1)
num1=num1+1;
num2=num1;
也即
num1=2,num2=2

// 反过来
num2=num1++
拆分
num2=num1
num1=num1+1
也即
num1=2,num2=1
int x=4;
int y=(x++)+5;
最终x=5,y=9

赋值运算符

=
+=
-=
*=
/=
%=

关系运算符

比较的结果是一个 boolean

>
<
>=
<=
==
!=
'A'>'B' 结果为false,比较的是两个字符的ASCII值
float f = 5.0f;
long l = 5;
f==l 结果为true,只要值相等就返回true

逻辑运算符

逻辑运算符用来连接一个或多个条件,判断这些条件是否成立。结果是 boolean

&&
&
||
|
!
# &&& 有什么区别
&& 如果前面的表达式已经为false了,后面就不算了
&  不影响,正常算

&& 又叫短路运算符(||同理),如果第一个表达式的值就能决定表达式最后的结果,运算符右边的表达式就不再计算了

条件运算符

三目运算符

布尔表达式?表达式1:表达式2
当表达式的值为true,则返回表达式1的值,反之则返回表达式2的值

流程控制

if - else if -else

if(score>=90)
	System.out.println("优");
else if(score>=80) //相当于score>=80 &score<90
	System.out.println("良");
else if(score>=60)
	System.out.println("中");
else 
	System.out.println("不及格");

switch

switch 判断的是常量值

switch(表达式){
	case 常量表达式1:
		语句1-- 可以是多条语句
		break;
	case 常量表达式2:
		语句2;
		break;
	default:
		语句3;
}
// 不加 break 的坏处
int a = 1;
switch(a){
	case 1:
		System.out.println("1");
	case 2:
		System.out.println("2");
		System.out.println("2");
	default:
		System.out.println("other");
}
# 输出结果
1
2
2
other
# 首先匹配 case 1,但由于其内没有 break 语句。则无论后面的 case 匹不匹配,都会输出,直到 default	

首先计算 switch 圆括号中表达式的值,然后依次与 case 语句后的常量表达式进行比较。若匹配,则执行相应 case 后的语句。如果遇到 break 语句则直接跳出 switch 结构。若 case 条件都不满足,则只运行 default 中的内容。default 可以省略

JDK 7.0 以后 case 表达式的值支持 String 类型,以前只支持 byte,short,int,char

循环结构

while

do-while

do-while 循环至少执行一次

// 输出 1-4
int n = 1;
do{
	System.out.println(n);
	n++;
}while(n<5)

构建一个 1-10 之间的随机数

// Math.random() 构建一个[0,1)之间的小数,double类型的值
int num = (int)Math.random()*10+1

# Math.random() [0,1) -> Math.random()*10 [0,10) -> Math.random()*10+1 [1,11)
# (int)10.910

for

for 循环三个表达式都是可以省略的,但是分号不能省略

// 省略表达式1
int i = 1;
for(;i<=10;i++){
	//输出
}

增强型 for 循环

for(int n : arr){
	System.out.println(n);
}

调试

在这里插入图片描述
OutLine 表示的是当前程序的结构

一维数组

基本语法

// 数组创建。数组创建时,数组长度必须指定
数据类型[] 数组名 = new 数组类型[数组长度];
// 数组的初始化
int[] arr = {1,2,3,4,5};
// 数组的长度
arr.length = 5

数组在内存中的存储

数组会被分配连续的内存空间

局部变量和数组的默认值问题

局部变量没有默认值,数组有默认值

int 默认值为0
String 默认值为null
float 默认值为0.0

判断数组为空

当数组作为成员变量时,默认值为 null,是否为空的判断方式为 ==null

int[] array;
// 这里会报错,因为这个一维数组没有初始化
// The local variable array may not have been initialized
boolean flag = (array==null);

//正确方式,输出为 true
int[] array = null;
boolean flag = (array==null);

二维数组

基本语法

// 数组声明
// 创建一个三行三列的二维数组,每一行相当于一个一维数组 intArray[0]
int[][] intArray = new int[3][3];
// 只指定行数
int[][] intArray = new int[3][];
intArray[0] = new int[3]; // 第一行有三列
intArray[1] = new int[4]; // 第二行有四列
intArray[1] = new int[5];
// 初始化
int[][] num = {{1,2,3},{4,5,6},{7,8,9}};
// 二维数组的行数
num.length

方法

方法定义及调用

public class Demo{
	主方法{
		// 这里要调用 print 方法,必须创建对象
		// 因为 print 不是静态方法
		Demo demo = new Demo();
		demo.print();
	}
	
	public void print(){
		System.out.println("");
	}
	
	public void test(){
		//这里和主方法进行调用不同
		//主方法调用 print 方法必须创建对象,但 test 方法可直接用方法名调用 print 方法
		//这种调用方式,test 方法 和 print 方法需要在一个类中
		print();
	} 
}

方法重载

方法名相同,参数列表不同(返回值不在考虑范围)

方法传值

基本类型传值

方法不改变原变量的值

public class ExchangeDemo{
	public void add(int m){
		m++;
		// 输出m等于5
	}
	主方法{
		int m = 4;
		add(m);
		// 输出m等于4
		// 这里m的值并没有因为调用 add 方法而改变
	}
}

引用数据类型

方法会改变原变量的值,如上述例子中,方法参数由 int m,变为 int[] a

可变参数列表

基本使用

public class ArgsDemo{
	public void sum(int... n){
		int sum = 0;
		for(int i : n){
			sum = sum + i;
		}
		System.out.println(sum)
	}

	主方法{
		ArgsDemo ad = new ArgsDemo();
		ad.sum(1);
		ad.sum(1,2);
		// 可以将数组传递给可变参数列表
		// 反之不行
		int[] a = {1,2,3,4,5};
		sum(a);
	}
	
	// 如果方法有多个参数,则可变参数必须是最后一个参数
	// 即一个方法中只能有一个可变参数
	public void sum(int n,int... n){}

	// 会报方法重复定义
	public void sum(int[] n){}

	// 不算方法重复定义
	public void sum(int n){}
}

可变参数作为方法参数的重载

public int plus(int a,int b){
	//
}

public int plus(int... a){
	//
}

主方法{
	// 调用的是第一个方法
	plus(1,2);
}

Windows 基本命令

切盘

#切换到 E 盘 
e:

查看当前目录下的文件

dir
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值