Java基础知识

AI摘要:

对应《疯狂Java讲义(第5版)》1-3 ,4.1-4.4章节

基础概念

  • JVM(Java Virtual Machine),即java虚拟机,在执行字节码时,把字节码解释成具体平台上的机器指令执行。

  • JRE(Java Runtime Environment,Java运行环境),包含JVM标准实现及Java核心类库。JRE是Java运行环境,并不是一个开发环境,所以没有包含任何开发工具(如编译器和调试器)

  • JDK(Java Development Kit)是整个JAVA的核心,包括了Java运行环境(Java Runtime Envirnment),一堆Java工具(javac/java/jdb等)和Java基础的类库(即Java API 包括rt.jar)

执行方法

  • 编译型语言

    对于编译型语言,开发完成以后需要将所有的源代码都转换成可执行程序,比如 Windows 下的.exe文件,可执行程序里面包含的就是机器码。只要我们拥有可执行程序,就可以随时运行,不用再重新编译了,也就是“一次编译,无限次运行”。

    如C/C++、Objective-C、Swift、kotlin

  • 解释型语言

    对于解释型语言,每次执行程序都需要一边转换一边执行,用到哪些源代码就将哪些源代码转换成机器码,用不到的不进行任何处理。

    如JavaScript、Ruby、Python

  • 先解释,后编译

    Java需要先经过编译步骤,将源代码编译为与平台无关的字节码(.class文件),再由JVM解释执行相应的字节码

编译Java程序

1
javac -d destdir srcFile

-d destdir指定编译生成字节码文件的存放路径,srcFile为Java源文件的位置。

运行Java程序

1
java Java类名

交互式开发工具

jshell

文档注释

javadoc

结构化程序设计

三种基本结构:顺序结构、选择结构、循环结构

主要原则:自顶向下,逐步求精,模块化,面向功能

最小的设计单元为函数

局限性: ①设计不够直观,与人类思维不一致,需保客观世界分解为功能

​ ②适应性差,可扩展性不强,自顶向下修改模块结构,维护成本高

面向对象程序设计

基本思想:使用类、对象、继承、封装、消息等基本概念,尽可能运用人类的自然思维方式,从客观存在的事物出发构造软件系统,把它们抽象的表示为类,作为系统的基本构成单元

类与对象

类是对象的抽象,对象是类的实例

类之间的结构关系:一般➡️特殊(继承), 整体➡️部分结构(组装)

面向对象的三种基本特性:继承、封装、多态

继承:子类继承父类,作为特殊的父类,将直接获得父类的属性和方法。

封装:将对象的实现细节隐藏起来,通过一些公用方法暴露对象功能

多态:子类对象可以直接赋给父类变量,但运行时仍然表现出子类的行为特征

抽象:忽略一个主题中与当前目标无关的方面,以便更充分的注意与当前目标有关的方面

强类型语言

也称为强类型定义语言。Java 是一种总是强制类型定义的语言

①要求变量的使用要严格符合定义

②所有变量都必须先声明后使用

可以在编译过程中发现程序的错误,保证程序更加健壮。

标识符规则

字母、下划线(_)、美元符($)开头,后可跟数字、字母、下划线(_)、美元符($)

Java严格区分大小写

所有关键字均小写

Java关键字

关键字大致含义
abstract表明类或者成员方法具有抽象属性
assert断言,用来进行程序调试
boolean基本数据类型之一,声明布尔类型的关键字
break提前跳出一个块
byte基本数据类型之一,字节类型
case用在 switch 语句之中,表示其中的一个分支
catch用在异常处理中,用来捕捉异常
char基本数据类型之一,字符类型
class声明一个类
const保留关键字,没有具体含义
continue回到一个块的开始处
default默认,例如,用在 switch 语句中,表明一个默认的分支
do用在 do-while 循环结构中
double基本数据类型之一,双精度浮点数类型
else用在条件语句中,表明当条件不成立时的分支
enum枚举
extends表明一个类型是另一个类型的子类型,这里常见的类型有类和接口
final表示不可变,最终的
finally用于处理异常情况,用来声明一个基本肯定会被执行到的语句块
float基本数据类型之一,单精度浮点数类型
for一种循环结构的引导词
goto保留关键字,没有具体含义
if条件语句的引导词
implements表明一个类实现了给定的接口
import表明要访问指定的类或包
instanceof用来测试一个对象是否是指定类型的实例对象
int基本数据类型之一,整数类型
interface接口
long基本数据类型之一,长整数类型
native用来声明一个方法是由与计算机相关的语言(如 C/C++语言)实现的
new用来创建新实例对象
package
private一种访问控制方式:私用模式
protected一种访问控制方式:保护模式
public一种访问控制方式:共用模式
return从成员方法中返回数据
short基本数据类型之一,短整数类型
static表明具有静态属性
strictfp用来声明 FP_strict(单精度或双精度浮点数)表达式遵循IEEE 754 算术规范
super表明当前对象的父类型的引用或者父类型的构造方法
switch分支语句结构的引导词
synchronized表明一段代码需要同步执行
this指向当前实例对象的引用
throw抛出一个异常
throws声明在当前定义的成员方法中所有需要抛出的异常
transient声明不用序列化的成员域
try尝试一个可能抛出异常的程序块
void声明当前成员方法没有返回值
volatile表明两个或者多个变量必须同步地发生变化
while用在循环结构中
null引用数据类型默认初始值

数据类型分类

  • 基本类型

    boolean 和数值类型(byte、short、int、long、char、float、double)

  • 引用类型

    类似于指针,包括类、接口、数组、空类型(null)

整数常量默认为int型,如果超出int范围,需加L,如long bigValue = 9223372036854775807L

二进制以0b开头,八进制以0开头,十六进制以0x开头,如int octalValue = 013,十进制值为11

浮点型默认为double型,加f表示float型,如5.12f

科学计数法形式 5.12e2

特殊浮点型 Float,Double 如 Float.NaNDouble.NEGATIVE_INFINITYFloat.POSITIVE_INFINITY

正数除以0.0得到正无穷大,负数除以0.0得到负无穷大,0除以0.0或负数开方为非数

数值中可使用下划线分隔,如3.14_15_92_65_36

动态类型 var

var定义的变量类型由编译器自动推断

类型转换

byte➡️short➡️int➡️long➡️float➡️double

char➡️int

0~65535的int可自动转换为char类型 ‘\u0000’~‘\uFFFF’

  • 自动类型转换

    表数范围小的可以向表数范围大的自动转换

    基本类型和字符串连接时转为字符串型

  • 强制类型转换

    (targetType)value

    整数直接截断高位,可能由正变负数

    小数直接截断小数部分

  • 表达式类型自动提升

    • byte、short、char类型将自动提升为int
    • 算数表达式的数据类型自动提升到与表达式中最高等级操作数同样的类型

直接量与常量池

数值类型、char(’a’、’\u0061’)、Stirng(”Crazy Java”)、null型

编译时就能确定值

Java会使用(constant pool)来缓存第一次使用的直接量

运算符

自加(++):位置在左, 位置在右

右移(>> , >>>):>> 符号位代替高位,>>> 0代替高位

运算符的优先级

运算符
括号 分隔符()、[ ]、.
非、正,负号!、+(正)、-(负)
自增,自减,取反++、–、~
强制类型转换符(type)
乘,除,取余*、/、%
加,减+、-
移位运算<<、>>、>>>
大小关系<、<=、>、>=、instanceof
相等关系==、!=
按位与&
按位异或(在java中,这不是幂次方的符号)^
按位或|
逻辑与(短路与)&&
逻辑或(短路或)||
条件运算(三目运算)? :
赋值运算=、+=、-=、*=、/=、%=
位赋值运算&=、|=、^=、~=、<<=、>>=、>>>=

循环控制

可以使用标签,直接跳出外层循环

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class BreakTest2
{
public static void main(String[] args)
{
// 外层循环,outer作为标识符
outer:
for (int i = 0 ; i < 5 ; i++ )
{
// 内层循环
for (int j = 0; j < 3 ; j++ )
{
System.out.println("i的值为:" + i + " j的值为:" + j);
if (j == 1)
{
// 跳出outer标签所标识的循环。
break outer;
}
}
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class ContinueTest2
{
public static void main(String[] args)
{
// 外层循环
outer:
for (int i = 0 ; i < 5 ; i++ )
{
// 内层循环
for (int j = 0; j < 3 ; j++ )
{
System.out.println("i的值为:" + i + " j的值为:" + j);
if (j == 1)
{
// 忽略outer标签所指定的循环中本次循环所剩下语句。
continue outer;
}
}
}
}
}

foreach循环

遍历数组或集合,不能改变数组元素的值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class ForEachTest
{
public static void main(String[] args)
{
String[] books = {"轻量级Java EE企业应用实战" ,
"疯狂Java讲义",
"疯狂Android讲义"};
// 使用foreach循环来遍历数组元素,
// 其中book将会自动迭代每个数组元素
for (String book : books)
{
System.out.println(book);
}
}
}

Java基础知识
https://blog.cngo.rr.nu/posts/d2ff.html
作者
cngo
发布于
2024年7月14日
许可协议