跟康师傅学Java-基础SE
一、Java语言概述
1. 基本概念
什么是Java?干什么的?
前端是服务员,java做后台的,服务器,好比餐馆的厨师!
Java之父:詹姆斯.高斯林(James Gosling)
软件:一系列按照特定顺序组织的计算机数据和指令的集合。分为系统软件和应用软件。
程序Programs = 数据结构Date Structures+算法Algorithms
人机交互方式
图形化界面GUI
命令行方式CLI
DOS命令
微软推出的DOS操作系统单用户单任务,windows系统之前,DOS命令
Win+R 输入 cmd 进入CLI界面
dir # 查看目录
md # make director缩写 创建目录
cd * # 进入*目录
cd .. # 回退到上一个目录
rd * # remove director 删除当前文件夹下的空目录* ——> file类与IO流章节实现递归删除
del *.txt # 删除当前文件夹下的以.txt结尾的所有文件(也可以指定删除某个文件)
cls # 清屏
语言 = 语法 + 逻辑
面向过程的语言:C(偏向计算机底层操作,OS、网络、硬件驱动等)、Pascal、Fortran
面向过程/面向对象(具备面向对象的一些特征)的:C++
跨平台的纯面向对象的语言:Java 基于类的编程语言、运用最广的项目语言、数量多
C#、Python(补充、胶水语言、开发效率高)、JavaScript(前端王者、脚本语言)、Scala、php(服务器端脚本语言)……
Go语言:云计算领域事实上的标准语言、尤其在Docker/Kubernetes等项目中。
Java技术体系平台:

Java SE(标准版)Java基础
支持面向桌面级应用(如windows下的应用程序)的Java平台,即定位个人计算机的应用开发。
用户界面接口AWT及Swing,网罗功能与国际化、图像处理能力以及输入输出支持等。
Java EE 学习重点(企业版)
为开发企业环境下的应用程序提供的一套解决方案,即定位在服务器端的web应用后端开发。
Java SE的扩展,增加了用于服务器开发的类库
Java ME(小型版)被安卓 ios 替代
支持java程序运行在**移动终端(手机、机顶盒)上的平台**,即定位在消费性电子产品的应用开发。
Java ME是 Java SE的内伸,精简了Java SE的核心类库,同时也提供自己的扩展类、增加了适合微小装置的类库:javax.microedition.io*等。
2. Java 开发环境
2.1 JDK JRE
JDK(Java Development Kit):Java程序开发工具包,包含JRE和开发人员使用的工具。
JRE(Java Runtime Environment):Java程序的开发环境,包含 JVM(java虚拟机)和运行时所需要的核心类库

JDK = JRE + 开发工具集(例如java编译工具等)
JRE = JVM + Java SE 标准类库
2.2 JDK的版本选择
**装长期支持版本 Java 5 8 11 17 21……同1.5 1.8 1.11 1.17 1.21 **
安装文件说明:

2.3 配置path环境变量
环境变量
What? 答:windows操作系统执行命令时,所要搜寻的路径。
**Why?**答:希望在命令行的任意路径下使用javac.exe等工具时,任意目录下都可以找到这个工具所在的目录。
How?
1,直接编辑系统的环境变量
2,使用变量来添加环境变量
2.4 运行过程

javac HelloWorld.java # 编译(语法层面),必须在该文件目录下才能成功编译 (注:windows 不区分大小写)
编译生成的字节码文件名为类名,而非java文件名。
注:编译后会生成若干个字节码文件(每声明一个类就对应一个字节码文件)。
java HelloChina # 运行HelloChina.class文件 使用类名,且无需带后缀
HelloWorld.java 文件内容如下:
class HelloChina{
public static void main(String[] args){
System.out.println("Hello,world!你好呀!!");
}
}
① class “类”,后面跟类名。
② main()方法格式固定,必须牢记!public 权限,static 加载的时机,void表示无返回值;表示程序的入口
public static void main(String[] args){
}
形参 String[] args 可以变 ,可以写成:String args[] 或 String[] a或String a[]
args :全称为 arguments(参数)
③ 严格区分大小写!
④基本输出语句
System.out.println() :自动换行
System.out.print():不会自动换行
⑤一个源文件中可以声明多个类,但是最多只能有一个类使用public进行声明且要求声明为public的类的类名与源文件名相同。
2.5 注释
注释掉的信息不参与编译。
单行注释: //
多行注释:/* */ 注:①多行注释不能嵌套使用
文档注释:/** */ (Java特有)
文档注释内容可以被JDK提供的工具javadoc所解析,生成一套以网页文件形式体现的该程序的说明文档。
/**
文档注释演示。这是我的第一个Java程序!^_^
@author zjw
@version 1.0
*/
public class HelloWorld{
/**
Java程序的入口
@param args main方法的命令参数
*/
public static void main(String[] args){
System.out.println("hello");
}
}
编译命令如下。mydoc:指定生成的文件名。
javadoc -d mydoc -author -version HelloWorld.java

问题原因:未进行 public class HelloWorld的声明!
3. Java API文档
API (Application Programming Interface,应用程序接口),Java现成的类库调用接口,是Java提供的基本编程接口。
Java API文档,即为JDK使用说明书、帮助文档。
API文档:
- 在线看:https://docs.oracle.com/en/java/javase/17/docs/api/index.html
- 离线下载:https://www.oracle.com/java/technologies/javase-jdk17-doc-downloads.html
4. Java 核心机制
4.1 优缺点
优点:
①跨平台性:可移植性好,如Java的int永远都是32位,不像c++可能是16,32,可能根据编译器厂商规定的变化。
通过Java编写的应用程序在不同的系统平台上都可以运行。
**原理:**在操作系统上安装了一个Java虚拟机(JVM),由JVM来负责Java程序在该系统中的运行。
②面向对象性:面向对象是一种程序设计技术,适合大型软件的设计和开发。面向对象编程支持封装、继承、多态等特性,让程序更好达到高内聚、低耦合的标准。
③安全性高:适合于网络/分布式环境,需要提供一个安全机制以防恶意代码的工具。如安全防范机制(ClassLoader类加载器),可以分配不同的命名空间以防替代本地的同名类、字节代码检查。
④健壮性:吸收了C/C++语言的优点,但去掉了其影响程序健壮性的部分(如指针、内存的申请与释放等),提供了一个相对安全的内存管理和访问机制。
⑤简单且高性能(如通过JIT即just in time即时编译技术提高运行效率)JIT在程序运行时提前把热点代码翻译成机器指令。
缺点:语法复杂、严谨,一般适用于大型网站的开发,整个架构会比较重,并非适用于所有领域。
IOS设备:Objective C、Swift
浏览器中的处理:JavaScript
windows程序:C++或C#
Java:服务器端编程和跨平台客户端应用领域。
4.2 JVM功能说明
JVM(Java Virtual Machine ,Java虚拟机):是一个虚拟的计算机,是Java程序的运行环境。JVM具有指令集并使用不同的存储区域,负责执行指令,管理数据、内存、寄存器。


功能①:实现Java程序的跨平台性。
功能②:自动内存管理(内存分配、内存回收)
- Java程序在运行过程中,涉及到运算的
数据的分配、存储等都由JVM来完成 - Java消除了程序员回收无用内存空间的职责。提供了一种系统级线程跟踪存储空间的分配情况,在内存空间达到相应阈值时,检查并释放可被释放的存储器空间。
- GC的自动回收,提高了内存空间的利用效率,也提高了编程人员的效率,很大程度上减少了因为没有释放空间而导致的
内存泄漏。
面试题答案:Java程序还是会出现内存溢出和内存泄露问题。
内存溢出:超出了本身的容量范畴。
**内存泄露:**程序执行过程中不再使用的内存空间,JVM通过相关算法判定之后并不认为它是垃圾。内存泄露过多会导致内存溢出。
GC:Garbage Collection本质是内存的自动管理,用来回收堆中的不再需要(使用)的对象。
**Java的GC机制:**在JVM中有一个低优先级的垃圾回收线程,正常情况下不会执行,只有在虚拟机空闲或当前堆内存不足时才会触发执行,扫描那些没有被引用的对象,并将它们添加到要回收的对象集合中,然后进行回收操作。
5. 企业真题
1,一个“.java“源文件中是否可以包括多个类?有什么限制?
答:是。一个源文件可以声明多个类,但是最多只能有一个声明为public且类名需同源文件名一致。
2,Java的优势?
答:社区及其繁荣,有大量的开源框架可以调用;跨平台性、面向对象性、简单高效、健壮性好
3,常用的命令行操作都有哪些?
答:熟悉常用的dos命令:dir 、 cd 、cd.. 、 cd/ cd\ 、md、rd等
4,Java目前主要得到应用场景有哪些?
JavaEE后台开发、Android客户端的开发、大数据的开发
5,Java中是否存在内存溢出、内存泄露?如何解决?举例说明(拼**)
答:是。
6,如何看待Java是一门半编译半解释型的语言?(携程)

二、变量与运算符
1. 关键字
官方地址: https://docs.oracle.com/javase/tutorial/java/nutsandbolts/_keywords.html
const 与 goto 为Java的保留字,not used但占有。
2. 标识符
Java中变量、方法、类、包等要素命名时使用的字符序列,成为标识符。即需要我们自己起名字的地方。
命名规则:(必须遵守!否则编译不通过)
由26个英文字母大小写,0-9 ,_或 $ 组成
数字不可以开头。 会分不清是变量还是值例如 int 123L = 12; double d2 = 123L ,为了“自洽”
不可以使用关键字和保留字,但能包含关键字和保留字。
Java中严格区分大小写,长度无限制。
标识符不能包含空格。
命名规范:(建议,否则会遭到鄙视)
包名:多单词组成时所有字母都小写:xxxyyyzzz。
例如:java.lang、com.atguigu.bean
类名、接口名:多单词组成时,所有单词的首字母大写:XxxYyyZzz
例如:HelloWorld,String,System等
变量名、方法名:多单词组成时,第一个单词首字母小写,第二个单词开始每个单词首字母大写:xxxYyyZzz
例如:age,name,bookName,main,binarySearch,getName
常量名:所有字母都大写。多单词时每个单词用下划线连接:XXX_YYY_ZZZ
例如:MAX_VALUE,PI,DEFAULT_CAPACITY
3. 变量
3.1分类及其注意事项
变量是程序中不可或缺的组成单位,最基本的存储单元。(内存层面)
Java中变量的三要素:数据类型、变量名、存储的值。(注:Java强类型的,每一个变量都需要指明其类型)
数据类型 变量名 = 变量值
其中,变量值最重要。
Java中的变量按照数据类型分类:
基本数据类型(8种):
整型: byte 、short 、int(default) 、long 对应的字节数:1 、 2 、 4 、 8
浮点型:float 、double(default)
字符型:char
布尔型:boolean
引用数据类型:
类(class)
数组(array)
接口(interface)
枚举(enum)
注解(annotation)
记录(record)
注意:
①变量只在其对应作用域内有效。
②在同一个作用域内不能声明两个同名的变量。
③变量值在赋值时,必须满足变量的数据类型,且在数据类型有效的范围内变化。
④声明long类型变量时,需要提供后缀,大写的L或小写的l
long l1 = 12345678L;
声明float类型变量时,需要提供后缀,大写的F或小写的f
float f1 = 1.23f;
⑤float类型的表示范围要大于long类型的表示范围,但是精度不高。
⑥Java中定义变量时采用合法的前向引用即先定义后使用。
3.2 浮点型精度的说明
①并不是所有的小数都可以精确地表示 。二进制浮点数不能精确表示0.1、0.01、0.001这样10的负次幂。
②浮点类型float、double的数据不适合在不容许舍入误差的金融计算领域。如果需要精确数字计算或保留指定位数的精度,需要使用BigDecimal类替换浮点型变量。
3.3 字符类型 char
Java中的所有字符都使用Unicode编码,故一个字符可以存储一个字母,一个汉字,或其他书面语的一个字符。
char(2个字节)的表示形式:
①使用一对单引号''表示,内部有且仅有一个字符。
②直接使用Unicode值来表示字符型常量'\uXXX',XXX表示一个十六进制的整数。
char c1 = '\u0036';
System.out.println(c1);
③使用转义字符。
| 转义字符 | 说明 | Unicode表示方式 |
|---|---|---|
\n |
换行符 | \u000a |
\t |
制表符 | \u0009 |
\" |
双引号 | \u0022 |
\' |
单引号 | \u0027 |
\\ |
反斜线 | \u005c |
\b |
退格符 | \u0008 |
\r |
回车符 | \u000d |
④使用具体字符对应的数值,比如ASCLL码。
char c11 = 97;
System.out.pringln(c11); // 'a' = 97 'A'=65 '0'=48
3.4 布尔类型 boolean
只有两个值:true false,Java中不存在用零表示false,非零表示true的用法!
布尔类型占用的字节数一般不谈,真正在内存中分配的字节数与int一样,即占4个字节。
3.5 基本数据类型的自动提升与强制类型转换
研究范围:不包含boolean类型
运算规则:
①自动类型提升:容量小的变量与容量大的变量做运算时,结果自动转换为容量大的数据类型。
注:这里的容量大小指的是其表示数据范围大小而不是实际占用的内存大小。特别注意数据范围 float(4) > long(8)
byte、short、char --> int --> long --> float --> double --> String
特殊: ① byte、short、char类型之间两两做运算,结果为int
long l1 = 123L;
long l2 = 123; // 自动类型提升,int --> long
long l3 = 123123123123; // 等式右边为int类型,因为超出了int的范围所以报错
long l4 = 123123123123l; // 使用8个字节存储的long类型的值
float 变量赋值时必须在值后边加'F'或'f',否则报错
float f1 = 12.3f;
float f2 = 12.3; // 默认12.3为double类型,大转小所以报错,即编译不通过
byte b1 = 10;
int i1 = b1 + 1; // 整型常量规定为int类型
double d1 = b1 + 12.3 // 浮点型常量是double类型
② 强制类型转换:(自动提升的逆运算) 范围大的转换为范围小的需要使用强转符(),在()内指明要转换为的数据类型
double d2 = 12; // int自动提升为double类型
int i2 = (int)

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



