Java笔记1——Java概述与基础

一、Java概述

1.JDK、JRE、JVM三者之间的关系,以及JDK、JRE包含的主要结构有哪些?
JDK(Java开发工具) = JRE +Java的开发工具(包括javac.exe,java.exe,javadoc.exe)
JRE(Java运行时环境)= JVM + Java核心类库


2.为什么要配置path环境变量?如何配置?
path环境变量是windows操作系统执行命令时索要搜寻的路径。

通过配置path环境变量,我们可以使某个程序,比如javac.exe,在任意目录下都可以运行,而不用跑到javac存在的目录下进行dos命令。

【配置方法】
JAVA_HOME = bin的上一层目录
path = %JAVA_HOME%\bin


二、Java 基础

2.1 关键字和保留字

  • 关键字(Keyword):被Java语言赋予了特殊的含义,被用做专门用途的字符串(都是小写)。比如class、interface、int等。
  • 保留字(reserved word):现有Java版本尚未使用,以后可能作为关键字使用。比如goto。

2.2 标识符(Identifier)

  • 标识符:Java对各种变量、方法和类等要素命名时使用的字符序列成为标识符。(凡是自己可以起名字的地方都叫标识符)

  • 定义合法标识符规则:

    • 由26个英文字母大小写,0-9,_或$组成
    • 数字不可以开头
    • 不可以使用关键字和保留字
    • 区分大小写,长度不限制
    • 不能包含空格
  • Java中的名称命名规范

    • 包名:多单词组成时所有字母都小写:xxxyyyyzzz
    • 类名、接口名:多单词组成时,所有单词的首字母大写:XxxYyyZzz
    • 变量名、方法名:多单词组成时,第一个单词首字母小写,第二个单词开始每个单词首字母大写:xxxYyyZzz
    • 常量名:所有字母都大写,多单词组成时,用下划线链接:XXX_YYY_ZZZ

2.3 变量与数据类型

Java中每个变量必须先声明,后使用。如下格式

数据类型 变量名 = 变量值;

变量按照数据类型进行分类:
数 据 类 型 { 基 本 数 据 类 型 { 数 值 型 { 整 数 类 型 ( b y t e , s h o r t , i n t , l o n g ) 浮 点 类 型 ( f l o a t , d o u b l e ) 字 符 型 ( c h a r ) 布 尔 型 ( b o o l e a n ) 引 用 数 据 类 型 { 类 ( c l a s s ) 接 口 ( i n t e r f a c e ) 数 组 ( [ ] ) 数据类型\begin{cases}基本数据类型\begin{cases}数值型\begin{cases} 整数类型(byte,short,int,long)\\浮点类型(float,double)\end{cases} \\ 字符型(char) \\ 布尔型(boolean)\end{cases} \\ 引用数据类型 \begin{cases}类(class)\\ 接口(interface) \\ 数组([])\end{cases}\end{cases} {(byte,short,int,long)(float,double)(char)(boolean)(class)(interface)([])

数据类型大小范围/说明
byte1个字节-128~127
short2个字节 − 2 15 -2^{15} 215 ~ 2 15 − 1 2^{15}-1 2151
int4个字节 − 2 31 -2^{31} 231~ 2 31 − 1 2^{31}-1 2311
long8个字节 − 2 63 -2^{63} 263~ 2 63 − 1 2^{63}-1 2631,long需要以l或L结尾,比如long l1 = 100L;
单精度float4个字节-3.403E38 ~ 3.403E38,float需要以f或F结尾,比如float f1 = 1.1F;
双精度double8个字节-1.798E308~1.798E308
char2个字节
boolean不是true就是false

float之所以比int表示范围大,是因为他的空间被分为两部分,一部分是具体的数,一部分是幂。但是精度比较小。

2.3.1 自动类型转换

数值型数据类型按照取值范围排序:byte、short、int、long、float、double。当容量小的数据类型的变量与容量大的数据类型变量做运算时,结果自动提升为容量大的数据类型。
特别的:当byte、char、short三种进行运算时,结果为int。(包括自身运算,比如byte和byte)

2.3.2 强制类型转换

强制类型转换是自动类型转换的逆运算。
使用强转符,进行截断操作,可能会导致损失精度,如下所示:

double d1 = 12.9;
int i1 = (int)d1;//截断操作
System.out.println(i1);//输出12

//没有精度损失
long l1=123;
short s1 = (short)l1

2.3.3 String类型

  • String属于引用数据类型,不是基本数据类型。
  • String可以和8种基本数据类型进行连接运算。
int number = 1001;
String numberStr = "学号";
String info = numberStr + number;//+:连接运算
System.out.println(info);//输出 学号1001

char c = 'a';
int num = 10;
String str = "hello";
System.out.println(c+num+str);//107hello
System.out.println(c+str+num);//ahello10
System.out.println(c+(num+str));//a10hello
System.out.println((c+num)+str);//107hello
System.out.println(str+num+C);//hello10a

System.out.println("* *");//输出* *
System.out.println('*'+'\t'+'*');//输出93,因为char类型作运算结果为int

2.3.4 二进制

计算机底层都以补码存储数据。
二进制第一位为符号位,1为负数,0为正数。
正数原码、反码、补码都相同。
反码为原码除符号位外其余位取反。
补码为反码加一。


2.4 运算符

2.4.1 算术运算符

运算符运算说明
+正号
-负号
+加号
-减号
*
/
%取余
++自增不会改变自身数据类型
自减不会改变自身数据类型
+字符串连接String a = “a”;String b = “b”;那么a+b的结果就为"ab”

2.4.2 赋值运算符

运算符说明
=当“=”两侧数据类型不一致,可以使用自动类型转换或强制类型转换原则进行处理
+=a+=b 与 a=a+b相同,但是不会改变数据类型,比如short s = 2;s+=2;是可以的,s=s+2是不行的(因为会被转成int类型)下面的操作同理
-=a-=b 与 a=a-b相同
*=a*=b 与a=a*b相同
/=a/=b 与 a=a/b相同
%=a%=b 与 a=a%b相同

2.4.3 比较运算符

运算符说明范例结果
==相等于4==3false
!=不等于4!=3true
<小于4<3false
>大于4>3true
<=小于等于4<=3false
>=大于等于4>=3true
instanceof检测是否是类的对象“Hello” instanceof Stringtrue

2.4.4 逻辑运算符

逻辑运算符操作的都是布尔类型。

运算符说明
&逻辑与
|逻辑或
!逻辑非
&&短路与
||短路或
^逻辑异或
aba&ba&&ba|ba||b!aa^b
truetruetruetruetruetruefalsefalse
truefalsefalsefalsetruetruefalsetrue
falsetruefalsefalsetruetruetruetrue
falsefalsefalsefalsefalsefalsetruefalse
  • 逻辑与& 和 短路与&&的区别
    运算结果没区别
    但是短路与若发现一个变量为false,就不进行之后的计算,如下所示:
	int num1 = 1;
	int num2 = 1;
	boolean b = false;
	if(b&(num1++>0)){
		....
	}
	else{...}

	if(b&&(num2++>0)){
		...
	}
	else{...}
	System.out.println(num1);//2
	System.out.println(num2);//1
  • 逻辑或| 和 短路或||的区别
    运算结果没区别
    但是短路或若发现一个变量为true,就不进行之后的计算。
  • 工作中推荐使用短路与和短路或。

2.4.5 位运算符

位运算符运算范例
<<左移3<<2 = 12 --> 3*2*2 = 12
>>右移3>>1 = 1 --> 3/2 = 1
>>>无符号右移3>>>1 = 1 -->3/2 =1
&与运算6&3 = 2
|或运算6|3 = 7
^异或运算6^3 = 5
~取反运算~6 = -7
  • 位运算符操作的都是整形的数据。

2.4.6 三元运算符

  • 结构为:(条件表达式)?表达式1:表达式2;
  • 如果条件表达式为true,则执行表达式1,否则执行表达式2。
  • 表达式1和表达式2要是相同类型。
	int m = 1,n = 2;
	System.out.println(m>n?m:n);//输出2

2.5 程序流程控制

  • 1.if-else if -else(条件判断结构)

  • 2.switch-case(执行效率比if-else高)

  • 3.for循环

    for (;;){;
    }
    int num = 1;
    for(System.out.println('a');num<=3;System.out.println("c"),num++){
    System.out.println("b");	
    }//输出结果abcbcbc
    

    执行过程:①➡②➡③➡④➡②➡③➡④➡②➡③➡④➡…

  • 4.while循环

  • 5.do-while循环


2.6 数组

  • 数组(Array)是多个相同类型数据按一定顺序排列的集合,并使用一个名字命名,并通过编号的方式对这些数据进行统一管理。
  • 数组是引用类型变量。
  • 创建数组对象会在内存中开辟一整块连续的空间。
  • 数组的长度一旦确定,就不能修改。

2.6.1 数组操作

//1.数组初始化
int[] arr;//声明
//1.1静态初始化:数组的初始化和数组元素的赋值操作同时进行
arr = new int[]{1001,1002,1003,1004};

//1.2动态初始化:数组的初始化和数组元素的赋值操作分开进行
String[] names = new String[5];


//2.如何调用数组的指定位置的元素
names[0] = "name";

//3.如何获取数组的长度
//属性:length
System.out.println(names.length);//输出5

2.6.2 数组元素的默认初始化值

类型初始值
整型0
浮点型0.0
char0或’\u0000’,非’0’
booleanfalse
引用数据类型null

2.6.3 数组的内存解析

JVM内存分配可以分为

  • 栈(stack):存放局部变量。
  • 堆(heap):存放对象、数组。
  • 方法区:内有常量池和静态域

数组声明初始化的时候。

  • 首先会在中开辟一个数组长度 × \times × 类型大小的空间,存放数据。
  • 接着数组变量(数组名)会存在中,并有一个指向他存放在堆中数据的首地址。
  • 使用引用计数算法,判断堆中的对象是否仍在使用,如果计数为0,会在之后进行垃圾回收。

2.6.4 数组中常见的异常

  • 数组角标越界的异常:ArrayIndexOutOfBoundsExcetion
  • 空指针异常:NullPointerException