前言

我之前有认真学过C语言但基本都是学的一直半解疫情期间在家认真做个笔记,虽然笔记已经找不到了并且内容也已经忘了差不多了。我现在学java的状态和之前学c状态是一样的,所以开这篇Java的技术blog提醒自己认真学习同时警示自己的学习状态。以前一直沉迷与硬件的知识想知道二进制字节码被操作系统翻译成操作码的是怎么样把硬件的API封装成函数调用从而进行操作的所以自己做了一个八位的cpu,但完全高估了自己的能力导致自己郁闷怀疑人生。所以有些事还是浅尝辄止,专心做当下的事。
工具
Editplus
eclipse
IntelljIDEA
Java基础
java基础是学生JavaEE,大数据,Android开发是基石。

一 Java学习前言

认识java

java面向对象语言

java是一种面向对象语言,真正的面向对象,任何函数和变量都以类(class)封装起来。

优点

1.既然是真正的面向对象,那就要做到彻底的封装。这是java和C以及c++最大的不同,java所有的源码以及编译后的文件都以类的形式存在。 java没有所谓的类外部定义,所有的函数(方法)以及变量(属性)都必须在类内部定义。这样就不会出现一个类被切割成这里一块那里一块的情况,这样做使得整个程序的结构异常清晰。
2.是完全屏蔽了指针,同时引入了垃圾回收机制(GC) 写出来的任何一个程序内存上的开销,都不受你控制。乍一看,似乎你受到了束缚,但实际上不是这样,因为虽然你的程序无法对内存进行管理,降低了一定的速度,但你的程序会非常非常的安全,因为你无法调用一个空指针.
3.安全虚拟机跨平台 java程序特点是安全。这个安全是针对你的系统来说得,系统在跑了java程序之后会特别地稳定,而且还能跨平台。如果使用用c/c++,要针对每一款手机写一套程序。

认识JDK

99年sun公司将java应用平台做一个划分这三大块这三大块就是JSE,JEE以及JM。 java 2的标准版(java 2 standard edition),也就是最基础的java语言部分,无论学什么java技术,J2SE都是必须掌握的,要使用J2SE就必须安装JDK(java development kit)。

JDK包含有五个部分:核心API,集成API,用户界面API,发布技术还有java虚拟机(JVM)。先说运行环境,运行环境最主要要说的就是java虚拟机(JVM)

JDK的JVM

JVM(Java java的设计者们提出了一个虚拟机的概念,在操作系统之上建立一个统一的平台,实现跨平台的功能。程序员所写的每一个程序都先运行在虚拟机上,所有操作都必须经过虚拟机才能和操作系统交互,这样做不仅统一了所有操作系统,同时也保证了操作系统的安全。要死机的话,死的是虚拟机(JVM)而操作系统并不会受此影响,而我们所说的java运行环境指的主要是JVM。
| | program | |
|:——-:|:————- | ———-:|
| | JVM | |
|unix|Linux|window|

JDK的API

API(Application Programming Interface)应用程序编程接口。在java里面,就是一些已经写好了的类打成的包。常用的类,可以简单理解成java的工具集。

JDK的发布技术

JDK的发布技术就是编译器,将.java文件转换成.class文件的一种技术。这三部分组成了JDK,有了JDK,就可以开发出J2SE应用软件了,最原始的只要用一个记事本写几行代码就可以了,但一般来说我们会使用效果比较好的开发工具,也就是IDEA。

总之,我们通过IDEA写的源代码以.class文件文本储存,通过JDK编译成.class的字节码文本文件然后这个class文件就能够被jvm加载,而不同的操作系统通过运行对应版本jvm来载入这个class文件运行,则实现了平台无关性。

二 简单认识java应用程序

一 编写和保存源代码

编写源代码

使用任何一个文本编辑器都可以,vscode notepad++ …

保存源代码

如果源文件中有很多类,那么只能有一个是public类,如果有一个类是public类,那么源文件的名字必须与这个类的名字完全相同 ,扩展名是java;如果源文件没有public类,那么源文件的名字只要和某个类的名字相同,并且扩展名是Java就可以了。

二 编译

进入某一个磁盘中的相关目录下使用javac编译器文件编译源文件

三 运行

应用程序的主类

一个Java应用程序必须有一个类含有
public static void main (String args[])

解释器

使用Java虚拟机中的Java解释器(java.exe)来解释执行其字节码文件。Java应用程序中是从主类的main方法开始执行。因此,需要进入主类字节码所在的目录,然后使用Java解释器(java.exe)运行主类的字节码。

总结
JDK中
javac:Java编译器,将Java源代码换成字节代;
java:Java解释器,直接从类文件执行Java应用程序代码;
先编译 .java文件――――>.class文件
运行 *.class ――加载――> JVM
jvm加载二进制文件

javac编译后得到的class文件是二进制指令,但不是机器指令,而是java虚拟机可识别的指令。这样class文件就有了可移植行。你可以把class文件拿到windows、linux或者solaris等不同的系统上去,在jvm上执行。
java是启动jvm,jvm负责对class文件的内容进行处理,将字节码文件解释或者编译为机器指令,执行。

三 Java基础

0.1 注释

单行注释 //
多行注释 /** */
文本注释 //javadoc 文档注释
文档注释内容可以被JDK提供的工具Javadoc 所解析,生成一套以网页文件形式体现的该程序的说明文档。

System.out.println(): 先输出数据,然后换行
System.out.print(): 只输出数据

0.2 标识符和关键字

标识符
Java所有的组成部分都需要名字。类名,变量名以及方法名都被称为标识符。所有的标识符都应该以大小写字母或者$,_数字都可以,但首字母不能是数字且不能是关键字
被Java语言赋予了特殊含义,用做专门用途的字符串。关键字中所有的字母都为小写。
保留字
goto const
命令的规范
包名:所有字母都小写
类名 接口名:所有单词首字母大写
变量名 方法名:第一个单词首字母小写,其余单词首字母大写
常量名:所有字母都大写

0.3数据类型

基本类型

1
2
3
4
5
6
7
8
9
10
11
12
//整数
int num1=10;
byte num2=20;
short num3 =30;
long num4=30L; Long类型要在数字后面加个L
//浮点数
float num5=5.1F;//float类型要在数字后面加个F
double num6=3.1415926535;
//字符
char name ='国';// 可以是汉字,因为是Unicode编码也可以是进制数
//布尔值
boolean flag=true;

引用类型

数组
接口API

0.4类型转换

double > float > long > int > short > byte

自动转换

· 所有byte/short/char都被提升为int。
· 如果有一个操作数为long,整个表达式提升为long。float和double情况也一样

强制转换

强制转换时会出现内存溢出
强制转换格式如下:

1
2
3
4
5
6
(target-type) value;
int money=100000000;
int year=100;
int total=money*years;//计算时内存溢出了
long total2=money*years;//默认时int,转换之前存在问题
long total2=money*(long)years;//先把一个数转换为Long

拓展知识点:Java是面向对象语言,其概念为一切皆为对象,但基本数据类型算是个例外哦,基本数据类型大多是面向机器底层的类型,它是 “值” 而不是一个对象,它存放于“栈”中而不是存放于“堆”中,但Java一切皆为对象的概念不是说说而已,它为每一个基本数据类型都做了相应的包装类,我们日常使用中大多情况下都会使用着这些包装类:
boolean Boolean
char Character
byte Byte
short Short
int Integer
long Long
float Float
double Double
String(字符串)
包装类就是一个对象,它存放于“堆”中。

0.5 变量

java变量时程序中最基本的存储单元,其要素包括变量名,变量类型和作用域。

变量的作用域
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class Demo

//属性:变量
//类变量 static
//实列变量:从属于对象;如果不自行初始化,那么这个类型为默认值(布尔默认为F)

//main方法
public static void main(String[] args){
//局部变量,必须声明和初始化值

//类变量 static

}
//其他方法

0.6 常量

1
final 常量名=值;

变量的命名规范
所有变量,方法,类名:见面知意
类成员变量:首字母小写和驼峰原则:monthSalary
局部变量:首字母小写和驼峰原则
常量:大写字母和下划线:MAX_VAJUE
类名:首字母小写和驼峰原则:Man,GoodMan
方法名:首字母小写和驼峰原则:run(),runRun();

0.7 运算符与表达式

算术运算符与算术表达式:+,-,*,/,%,++,–

赋值运算符与赋值表达式 = ,+=,-=,*=,/=

关系运算符与关系表达式 >,<,>=,<=,==,!+instanceof

逻辑运算符与逻辑表达式 &&,||,!

位运算符&,|,^,<<,>>,>>>

1
2
左移*2    <<
右移/2 >>

条件运算符? :

1
2
x?y:z
//如果x==true,则结果为y,否则为z;

字符串连接符

1
2
3
System.out.println(""+a+b); 1020
System.out.println(a+b+""); 30
//连接符如果左右有字符的话那么另一个也会被转化为字符

math类
运算符优先级

0.8 包机制

公司域名倒置作为包名
为了能够使用某一个包的成员,我们需要在Java程序中明确导入该包。使用”import”语句可完成此功能。

阿里巴巴开发手册

0.9 javaDoc

javadoc命令用来生成自己的API文档

1
2
3
4
5
6
7
8
9
/**
*@author xiyan
*@version 1.0
*@return
*@thorws Exception
*/
public String test(String name) throws Exception{
return name;
}

java帮助文档
https://www.oracle.com/cn/java/technologies/java-se-api-doc.html

四 流程控制

一 用户交互Scanner

java给我们提供了这样一个工具类,我们可以获取用户的输入。java.util.Scanner是java5的新特性,我们可以通过Scanner类来获取用户的输入。
基本语法

1
2
3
4
5
6
7
**Scanner scanner = new Scanner(System.in);**//一个扫描器对象,用于接收键盘数据
**scanner.close();**//凡是属于IO流的类如果 不关闭会一直占用资源
if(scanner.hasNext())
if(scanner.hasNextLine)//通过Sanner类的next()与nextLine()方法获取输入的字符串,在读取前我们一般需要使用hasNext()与hasNextLine()判断是否还有输入的数据

String s =scanner.next;
String s =scanner.nextLine;

next()
1.一定要读到有效字符才可以结束输入
2.对输入有效字符之前遇到的空白,next()方法会自动将其去掉。
3.只有输入有效的字符后才将其后面输入的空白作为分隔符或者结束符
4.next()不能得到带有空白的字符串

nextLine()
1.以enter为结束符,也就是说nextLine()方法返回的是输入回车之前的所有字符。
2.可以获得空白

二 顺序结构

语句与语句之间,框与框之间是按从上到下的顺序进行的,它是由若干个依次执行的处理步骤组成的,它是任何一个算法都离不开的基本算法结构

选择结构

if选择结构

if单选择结构

语法

1
2
3
if(布尔表达式){
//如果布尔表达式为true将执行的语句
}

if双选择结构

语法

1
2
3
4
5
6
if(布尔表达式){
//如果布尔表达式为true将执行的语句
}
else{
//如果布尔表达式为false将执行的语句
}

嵌套if选择结构

if多选择结构

语法

1
2
3
4
5
6
7
8
9
if(布尔表达式1){
//如果布尔表达式1为true将执行的语句
}else if(布尔表达式2){
//如果布尔表达式2为true将执行的语句
}else if(布尔表达式3){
//如果布尔表达式3为true将执行的语句
}else{
//如果以上布尔表达式都不为ture执行代码
}

Switch多选择结构

switch case语句判断一个变量与一系列值中某个值是否相等,每一个值称为一个分支。
语法

1
2
3
4
5
6
7
8
9
switch(expression){
case value : //语句
break;//可选
case value : //语句
break;//可选
//可以有任意数量的case语句

default : 语句 //可选
}

循环结构

while循环

语法

1
2
3
while(布尔表达式){
//循环内容
}

1.只要布尔表达式为true,循环就会一直执行下去我们大多数是会让循环停止下来的,我们需要一个让表达式失效的方法来结束循环
2.少部分情况需要循环一直执行比如服务器的请求相应监听等。

do while循环

语法

1
2
3
4
do{
//代码语句
}while(布尔表达式);

1.对于while语句而言,如果不满足条件,则不能进入循环。但有时候我们需要即使不满足条件也至少执行一次。
2.do …while循环和while循环相似,不同的是,do…
while循环至少会执行一次.

for循环

语法

1
2
3
4
5
for(初始化,布尔表达式 ,迭代){
//代码语句
}


最先执行初始化步骤,可以声明一种类型,但可初始化一个或者多个循环控制变量,也可以是空语句。然后,检测布尔表的值。如果为true,循环体被执行。如果为false,循环终止,开始执行循环后面的语句。执行一次循环后,更新循环控制变量(迭代因子控制循环变量的增减)。
再次检测布尔表达式。循环执行上面的过程。

增强for循环

五 方法

方法的定义和调用

java方法是语句的集合,它们在一起执行一个功能
1.方法是解决一类问题的步骤的有序组合
2.方法包含于类或对象中
3.方法在程序中被创建,在其他地方被引用
设计方法的原则方法的本意是功能块,就是实现某个功能的语句块的集合。我们设计方法的时候,最好保持方法的原子性,就是一个方法只完成一个功能,这样利于我们后期的扩展。

定义

方法中包含一个方法头和一个方法体
修饰符:这是可选的告诉编译器如何调用该方法。定义该方法的访问类型。
返回值类型:方法可能会放回值,returnValueType是方法返回值的数据类型。有些方法执行所需的操作,但没有返回值。在这种情况下,returnValueType是关键字void。
方法名是方法实际名称。方法名和参数表共同构成方法签名。
参数类型参数就像是一个占位符。当方法被调用时,传递值给参数。这个值被称为实参或者变量。参数列表时指方法的参数类型,顺序和参数的个数。参数是可选的,方法可以不包含任何参数。

形式参数:在方法被调用时用于接收外界输入的数据。站位符
实参调用方法时实际传给方法的数据

方法体方法体包含具体的语句,定义该方法的功能

1
2
3
4
5
6
7
修饰符 返回值类型 方法名(参数类型 参数名){
...
方法体
...
return 返回值;
}
//return除了可以返回值也可以终止函数

方法的调用

调用方法:对象名.方法名(实参列表)
当方法返回一个值的时候,方法调用通常被当做一个值。

1
int larger = max(30,40);

如果方法返回值是void,方法调用一定是一条语句。

1
System.out.println("Hello,Kuangshen");

值传递(Java)和引用传递

方法的重载

重载就是在一个类中,有相同的函数名称,但形参不同的函数。
方法的重载规则
1.方法名称必须相同
2.参数列表必须不同(个数不同,或类型不同,参数排序顺序不同)
3.方法的返回值类型可以相同也可以不相同。
4.仅仅返回值类型不同不足以成为方法的重载。
实现理论
方法的名称相同时,编译器会根据调用方法的参数个数,参数类型等逐个匹配,以选择对应的方法,如果匹配失败,则编译器报错。

命令行传参

有时候希望运行一个程序时候再传递给他消息。这要靠传递命令行参数给main()函数实现。

可变参数

1.JDK1.5开始,Java支持传递同类型的可变参数给一个方法
2.在方法声明中,在指定参数类型后加一个省略号(…)
3.一个方法中只能指定一个可变参数,它必须是方法的最后一个参数。任何普通的参数必须在它之前声明。

函数递归

递归结构
递归头:什么时候不调用自身方法。如果没有头将陷入死循环。
递归体: