admin管理员组文章数量:1530040
Java必学的基础部分为1-10章,其中每个部分包含少量的扩展内容,而扩展内容会随着时间增加,对于初学者不必太纠结扩展内容,当基础内容学完,扩展内容便可达到一种豁然开朗的程度。
建议初学自学者根据视频结合自己的理解参考本笔记,右侧有大纲,点击直达相关位置,对于未来的复习也很有帮助。
对于自学,视频建议观看狂神,和尚硅谷。在这里也要感谢他们提供了免费的学习路线和全套的教学视频。本笔记参考了许多教程视频,整合而来。
希望初学者,对Java感兴趣,对做网站感兴趣,对编程感兴趣,对底层充满好奇,对计算机充满好奇,对这个世界充满好奇。
什么东西都不是凭空产生的,多了解底层,了解实现这些功能背后的原理。
如果你想做一个自己的动态网站,相信你自己,通过传统路线很快就能达到。
[info:]
本文使用MarkDown语法编写
0、初见:
编程语言发展史:(点击查看链接)
第一代:机器语言。二进制,直接输入给计算机使用,不经过任何的转换。
第二代:汇编。相对机器语言人性化了不少。
第三代:高级语言。面向过程(如:C语言)和面向对象(如:C++语言、JAVA语言、C#语言、Python、PHP、JavaScript)
Java发展史:
Java是在1991年由SUN公司的James Gosling(Java之父)及其团队所研发的一种编程语言。
在1995年更名为Java(印度尼西亚爪哇岛的英文名称,因盛产咖啡而闻名)。
JAVA语言特性:
-
JAVA是一种面向对象的编程语言
-
简单易学:相对于其他编程语言来说,JAVA语言的语法相对简单,易于学习和理解。
-
平台无关性:JAVA程序可以在不同的操作系统上运行,只要安装了JAVA虚拟机(JVM)即可。
-
面向对象:JAVA是一种纯粹的面向对象的编程语言,通过封装、继承和多态等特性,可以更好地组织和管理代码。
-
安全性:JAVA提供了一些安全性机制,如类加载机制、异常处理机制以及访问控制等,可以保证程序的安全性。
-
高性能:虽然JAVA是解释型语言,但通过JIT编译器的优化,可以提高代码的执行效率。
-
线程支持:JAVA内置了对线程的支持,方便开发多线程程序,实现并发操作。
-
开放性:JAVA提供了大量的开源库和框架,方便开发人员快速构建复杂的应用程序。
-
可移植性:由于JAVA的平台无关性,JAVA程序可以在不同的硬件平台上运行,保证了程序的可移植性。
-
自动内存管理:JAVA通过垃圾回收器(Garbage Collector)来管理内存,开发人员无需手动进行内存管理。
Java的三大版本:
- JavaSE:Java平台的标准版,它提供了Java语言的核心API和基本功能,适用于开发普通的桌面应用程序、命令行工具和服务器端应用程序等。
- JavaME(Java Micro Edition):是Java平台的微型版,专门设计用于嵌入式设备和移动设备的应用程序开发。我们熟知的Android它所运行的app也是由Java编写的(更多可了解kotlin)
- JavaEE(JavaEnterpriseEdition):是Java平台的企业版,用于开发大型、复杂的企业级应用程序。JavaEE提供了一套丰富的API和服务,用于构建分布式、可扩展和安全的企业应用。
JDK\JVM\JRE的区别:
- JDK(Java Development Kit)Java开发工具包,包含Java语言、Java虚拟机、Java类库,是支持Java程序开发的最小环境。
- JVM(Java Virtual Machine)Java虚拟机,运行于各种操作系统Linux,Windows,Solaris等之上,执行编译好的Java字节码class文件。
- JRE(Java Runtime Environment)Java运行时环境,包含JavaSE中核心类库API和Java虚拟机,简单理解为JVM+核心类库API。
配置Java环境变量:
-
下载JDK https://www.oracle/java/technologies/downloads/
-
右键 This PC(此电脑) -> Properties(属性) -> Advanced system settings(高级系统设置) -> Environment Variables(环境变量)
-
新建JAVA_HOME 变量
-
变量名:JAVA_HOME 变量值:电脑上JDK安装的绝对路径
-
-
新建/修改 CLASSPATH 变量
-
变量名:CLASSPATH 变量值:.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;
-
-
新建两条Path路径
-
%JAVA_HOME%\bin %JAVA_HOME%\jre\bin
-
-
打开cmd输入 java 出现一连串的指令说明配置成功了。
O.o 常见的Dos命令:
Win键+R 输入"cmd"打开
切换盘符:
格式:盘符 + :
C:\User\Administrator>d:
D:\>
查看当前目录下所有的文件夹和文件
格式:dir+Enter回车(dir是英文directory的缩写,意为“目录)
切换目录
格式:cd+空格+要切换的目录(cd是英文change directory的缩写)
D:\> cd softwareDevelopment
D:\softwareDevelopment>
输入cd…返回上一层目录
D:\softwareDevelopment>cd..
D:\>
回到此盘根目录
D:\softwareDevelopment\doc\ajax>cd\
D:\>
创建文件夹
格式:md+空格+文件夹名称(md是英文make directory的缩写)
删除文件夹
格式:rd+空格+文件夹名称(rd是英文remove directory的缩写)
创建文件
格式:copy con+空格+文件名
删除文件
格式:del+空格+文件名(del是单词delete的简写)
清屏
格式:cls(cls是英文clear screen的缩写)
退出命令行界面
格式:exit
o.O hello word
新建一个文件夹,创建一个名为Hello后缀为.java的文件
编辑内容:(可以使用notepad++编辑)
public class Hello{
public static void main(String args){
System.out.println("Hello,World!");
}
}
开始编译:
在这个Java文件的地址栏输入cmd回车
输入 javac Hello.java
会在目录里生成class文件
输入 Hello
运行成功后会输入一句Hello,World!
可能遇到的情况:
- Java大小写时非常敏感的,主要大小写
- 尽量使用英文
- 文件名和类名必须保持一致,并且首字母大写
- 结尾分号,使用英文分号
- 以上情况都没遇到则可能是之前Java环境配置出现了问题
如何学习Java
Java是一个面向对象编程的编程语言,重在培养面向对象的编程思想,这是根据自己的理解一步步形成的思想。
遇到困难或者不能理解的部分,要多思考,当然可能依然是似懂非懂的感觉,但是学习到了后面就会逐渐理解。
要学会自己做笔记,最好是自己发表博客,像我一样,每天都要写,每天都要发布。如果你也发表了博客请记得艾特我,我也好奇你写的啥。
必学MarkDown语法
无论是做笔记还是编写博客,或者以后写项目的说明档.md文件都需要学习MarkDown语法,这个很简单也很好学习,教程很多,例如你编辑一篇新的CSDN文档的时候,默认显示的就是语法教程(在编辑界面右上角也有语法说明)。
个人记笔记建议使用Typora,是一款很方便的markdown语法编辑器,这里附上教程:
Typora的使用教程(CSND)
1、注释Comments
package com.bsy;
/**
* @author bsy
* 文档注释
*/
public class Comments {
public static void main(String[] args) {
//编辑注释
//TODO 标签主要标记遇到的问题
//在工具类最下方点击TODO窗口,可以查看当前所有的项目代码中标识的TODO标签
System.out.println("hello worold!!!");
/*
* 长注释
*
*
* 注释在setting → editor → Java 中的 comments中进行设置样式
*
* comments表示注释的意思,翻译可以为“评论”的意思
*
*/
}
}
1.1、标识符Identifier
//TODO 标识符的命名规则
//1,英文字母
String name = "xiaoming";
String xingming = "xiaohong";
//2,可使用的符号
//标识符只能采用下划线和美元$符号,其余不可用,包括空格、@、#、%等
String _name = "";
String $name = "";
//3,数字
//0-9阿拉伯数字只能放在标识符的除开头以外的位置,放在开头会被识别为数字而非标识符
//4,一个作用域内不允许出现同名(标识符不允许重复)。
//5,标识符区分大小写
//6,标识符不能为Java关键字(例如static、public、final等
//7,使用驼峰命名,先小后大;尽量见名知意(看见其名字就知道其含义)。
String userNameFist = "";
//8,标识符长度没有限制
2、基本数据类型Primitive Tpye
package com.bsy;
public class PrimitiveType {
//整数类型Datatype:
//bit位:比特,数据运算的最小单位,采用二进制存储,见下方。
byte numByte = -128;//字节。1byte=8bit位
byte numByte1 = 127;//字节:计算机存储数据的最小单位
short numShort = -32768;//16位
short numShort1 = -32767;
int numInt = -2147483648;//32位
int numInt1 = 2147483647;
long numLong = 30L;//64位,Long类型后面加上L进行标记(范围-9223372036854775808L~9223372036854775807L)
//浮点数
float numFloat = 50.1F;//单精度浮点类型
//Float类型在后面加上F进行表示,部分大小写,不写f会被识别为双精度。范围+/-3.4E+38F(6~7 个有效位)
double numDouble = 3.1415926;//双精度浮点类型
//+/-1.8E+308 (15 个有效位)
//布尔
boolean aBoolean = true;// ture or false
//字符
char aChar = '字';//单一字符(ISO 单一字符集)
//字符串(不是关键字,不属于八大类型,是类)
String name1 = "字符串";
/*
* bit 位 最小存储单位,例如 11001100是一个 八位 二进制 数。
* 1Byte = 8bit(1B = 8b)
* 1KB = 1024B
* 1M 1024KB
* 1G = 1024M
*/
}
2.1、扩展
2.1.1 Float、Double
float 是有限 离散 舍入误差 大约 接近但不等于的。不要用浮点型进行作比较。因为↓
float d1 = 123123123F;
float d2 = d1 +1;
System.out.println(d1 == d2);//ture
如果要使用很大的数值作比较可以使用一个现有的类
BigDecimal 数学工具类
2.1.2 强制转换
所有的字符本质是数字
char a1 = 'a';
char a2 = "中";
System.out.println(a1);//a
System.out.println((int)a1);//97
System.out.println(a2);//中
System.out.println((int)a1);//20013
Unicode编码表对应的编号数字(范围:U0000 - UFFFF)
char a3 = '\u0061';
System.out.println(a3);//a
2.1.3 转义字符
摘录自掘金网
\r 表示回车符,将光标定位到当前行的开头,不会跳到下一行。
\n 表示换行符,换到下一行的开头。
\t 表示制表符,将光标移到下一个制表符的位置,就像在文档中用Tab键一样。
\b 表示退格符号,就像键盘上的Backspace键。
Java以下的字符都有特殊意义,无法直接表示,所以用反斜杠加上另外一个字符来表示。
\’ 表示单引号字符,Java代码中单引号表示字符的开始和结来,如果直接写单引字符('),程序会认为前两个是一对,会报错,因此需要使用转义符“\’”。
\" 表示双引号字符,Java代码中双引号表示字符串的开始和结来,包含在字符串中的双引号需要转义,比如(hesays,\”thankyou\”.)。
\ 标识反斜杠字符,由于在Java代码中的反斜杠(\)是转义字符,因此需要表示字面意义上的\,就需要使用双反斜杠(\)。
2.1.4 布尔值扩展
boolean flag = ture;
if (flag==ture){
}
if (flag){
}//默认等于ture,可以不写=ture
//Less is More! 代码要精简易读,更少就是更多。
2.2、引用数据类型
类、字符串、接口、数组、枚举等可以引用的数据类型都是引用数据类型
String name = "xiaoming";//这就是一个引用数据类型
3、类型转换
Java是强类型语言,运算时要进行类型转换
从上方得知,每种数据类型所能包含数的大小是不同的,例如你用一个32位的int大盒子装小的16位short盒子肯定可以直接装下。但是用小盒子装大盒子不是说不能装,而是会丢失一部分大盒子里的数据(精度丢失见下方)。
低 -------------------------------------------------→高
byte -> short -> char -> int -> long -> float -> double
3.1、强制类型转换
上面说到盒子的例子,在Java里低转高需要进行强制转换。
//高到低
int i = 128;
byte b = (byte)i;//byte最大127此时会发生内存溢出
//强制转换格式: (类型)变量名
3.2、自动类型转换
//低到高
int i = 128;
double b = i;//128.0
demo:
//根据上方的从低到高的顺序举例
byte b = 10;
short s = b;
int i = s;
long lon = i;
float f = lon;
double d = f;
注意:
1,不能对布尔值进行转换。
2,不能吧对象类型转换为不相干类型。
3,在把高容量转换到低容量的时候,要使用强制转换。
3,转换的时候可能存在内存溢出,或者精度问题。
//精度问题
System.out.println((int)23.7);//23
System.out.println((int)-45.89f);//-45
//char
char c = 'a';
int d = c + 1;
System.out.println(d);//98
System.out.println((char)d);//b
//可以将Unicode表打印出来
for(i=0;i<26;i++){
char c = 'a';
int d = c+i;
System.out.println((char)d);
}
扩展:
int money = 100_000_000;//数字之间可以使用下划线分割
int years = 20;
int total = money*years;//内存溢出
long total2 = money*years;//依然内存溢出,因为先计算int类型之后才进行转换
long total3 = money*((long)years);//先把一个数转换为long就可以
System.out.println(total3);
4、变量&常量
变量,可以改变的向量存储
变量:
package com.bsy;
public class Demo1 {
//类变量
static double salary = 2500;
//实例变量
//布尔值:默认false
String name;//默认值 null
int age;//默认值0
//main方法
public static void main(String[] args) {
//局部变量
int i = 10;
System.out.println(i);
Demo1 demo1 = new Demo1();
System.out.println(demo1.age);
System.out.println(demo1.name);
//类变量 static
System.out.println(salary);
}
}
常量:
package com.bsy;
public class Demo2 {
//修饰符不分先后顺序,写成final statci对结果没有影响
static final double PI = 3.14;//常量名使用大写
/*
常量定义格式:
final 常量名 = 值;
*/
public static void main(String[] args) {
System.out.println(PI);
}
}
(命名要见名知意,遵循驼峰命名法。常量使用大写字母加下划线MAX_VALUE。方法名首字母小写)
5、运算符
5.1、算术运算符:
+(加),-(减),*(乘),/(除),%(求余),++(自增),–(自减)
System.out.println(1+2);
System.out.println(2-2);
System.out.println(3*2);
System.out.println(4/2);
System.out.println(1/2);//0(int,int)=>int
System.out.println(1.0/2);//0.5(double,int)=>double
System.out.println(5%2);//1(取余,模运算)
//TODO 最小使用类型位int
byte b1 = 10;
byte b2 = 20;
int b3 = b1 + b2;//如果写按照上面的(byte,byte)=>byte就不行了
byte b4 = (byte)(b1 + b2);//强转可使其为byte类型
//Java计算也是由优先级的
System.out.println(1 + 2 * 3);//7
System.out.println((1 + 2) * 3);//9
5.1.1、自增自减:
// ++ --
//a = a + 1;
int b = a++;//先赋值,再自增。相当于b=a,然后再进行下一步自增,也就是隐藏了一步代码
int c = ++a;//先自增,再赋值。上面自增之后a=4,这里a先自增a=5,再赋值给c。
int i = 0;
int j = i++;//先赋值给j,赋值时i还没有自增。
System.out.println(i +"\n"+ j);//i = 1,j = 0
int i = 0;
int j = ++i;//i先自增为1再赋值给j,此时j为1
System.out.println(i +"\n"+ j);//i = 1,j = 1
5.2、赋值运算符:
=(等于),+=(自加一次等于),-=(自减一次等于),*=(自乘一次等于),/=(自除一次等于),+(字符串连接符)
//等号就是赋值运算符:将等号右边的表达式结果赋值给等候左边的变量
//赋值运算符需要考虑类型的关系
String name = "zhangsan";
byte b = 10;
char c = '字';
//复合赋值运算符
//如果元素进行运算后重新赋值给自己,那么可以将运算和赋值的符合进行简化
int i = 1;
i = i + 1;
i += 1;//其他的 -=、*=、/=同理
//如果使用复合赋值运算,那么数据的类型不会发生变化
byte b = 10;
b = b + 20;//20默认为int类型,而int不能直接转换为byte,所以报错。
b += 20;//但是使用复合赋值运算则不会。
5.3、比较(关系)运算符:
用于比较两个数据之间关系的运算符,返回结果只有:true或者false
(大于),<(小于),>=(大于等于),<=(小于等于),==(比较等于),!= instanceof(不等于)
int i = 10;
int j = 20;
System.out.println(i > j);//false
System.out.println(i < j);//ture
5.4、逻辑运算符:
&(按位与),&&(短路与),|(按位或),||(短路或),!(非,即取反)
5.4.1、与&&或||非!
boolean a = ture;
boolean b = false;
System.out.pintln("a && b:"+(b&&a));//逻辑与运算:两个变量都为真,结果才为真ture
System.out.pintln("a || b:"+(a||b));//逻辑或运算:两个变量只要有一个为真,则结果就为真ture
System.out.pintln("!(a && b):"+!(a&&b));//如果是真,则变为假,如果是假,则变为真。
//逻辑与运算:如果第一个变量都为假,则第二个就不会运算直接输出结果为假:
//短路运算:
int c = 5;
boolean d = (c<4)&&(c++ <4);
System.out.pintln(d);
System.out.pintln(c);//5 因为与运算要求两个都为真结果才为真,但是第一个都为假,所以直接输出结果false,根本不需要第二个运算。如果做了第二个运算说明输出结果为6,本程序说明了&&运算的逻辑。
5.4.2、位运算(都是基于二进制来计算):
位运算符:& | ^ ~ >> << >>>
&(按位与),|(按位或),^(异或运算),<<(左移运算符),>>(右移运算符),>>>(无符号运算符),~(非、取反运算符)
**效率极高!!!**因为是底层,可以做一些很巧妙的计算。
/*
A = 0011 1100
B = 0000 1101
A&B = 0000 1100 (进行每一位的比较,上下都是1才为1,不是则为0)
A|B = 0011 1101 (如果每个位都为0结果才为0,否则为1)
A^B = 0011 0001 (异或运算,两个位相同则为0,否则为1)
~B = 1111 0010 (取反)
<< (左移:相当于 *2)
>> (右移:相当于 /2) 举例:
将2*8 更快的计算出来:(计算机理解为2*2*2*2)
System.out.pintln(2<<3);//16
二进制里面表示的数为:
0000 0000 0
0000 0001 1
0000 0010 2
0000 0011 3
0000 0100 4
0000 1000 8
0001 0000 16
把1数字向左移动一位,数字就变大,2移动一位就变成4了。移动3位就变成16,所以2*2*2*2看乘几个2就移几位。而移动3位就是16。
*/
5.5、条件(三元)运算符?:
三个元素参与运算的运算符
// x ? y : z
//如果x==ture,则结果为y,否则结果为z
int score = 80;
//如果成绩大于 60 则为及格,给一个String类型的变量type赋值为“及格”
String type = score < 60 ? "不及格" : "及格";
5.6、扩展赋值运算符:
+= -= *= /=
int a = 10;
int b = 20;
a += b;//a = a+b
a -= b;//a = a-b
……
5.6.1、字符串连接符 +
int a = 10;
int b = 20;
//字符串连接 + 两侧只要一方出现String类型,就变成字符串拼接
System.out.pintln(""+a+b);//1020
System.out.pintln(a+b+"");//30
//程序是自上而下自左而右运算的,当字符串在前面则识别为字符串拼接,当运算在前面则先进行运算。
5.6.2、优先级()
跟数学算数一样,优先算一部分。
System.out.println(1 + 2 * 3);//7
System.out.println((1 + 2) * 3);//9
5.7、Math 数学工具类:
很多特殊的运算都需要到它,例如幂运算。
6、包机制
包的本质就是文件夹
**包名:**域名倒置。例如com.baidu
**导包:**import
**导入包下所有类:*通配符
import com.clover.base.*;
7、JavaDoc
@author 作者名
@version 版本号
@since 指明需要最早使用的jdk版本
@param 参数名
@return 返回参数情况
@throws 异常抛出情况
可使用CMD命令生成说明文档:
javadoc -encoding UTF-8 -charset UTF-8 Doc.java
(encoding编码格式,charset字符集编码)
使用IDEA生成doc文档
Tools > Generate JavaDoc
参数举例:-encoding UTF-8 -charset UTF-8 -windowtitle “文档HTML页面标签的标题” -link http://docs.Oracle/javase/7/docs/api
8、Java流程控制
Java基础的第二部分,前面就像是游戏的新手教程,现在可以开始玩了。
8.1、Scanner对象
获取用户的输入
8.1.1、next()
package com.bsy;
import java.util.Scanner;
public class scannerDemo1 {
public static void main(String[] args) {
//创建一个扫描器对象,用于接收键盘数据
Scanner scanner = new Scanner(System.in);//System.in输入,System.out输出
System.out.println("使用next方式接收:");
//判断用户有没有输入
if (scanner.hasNext() == true){
//默认为ture可以省略不写
String str = scanner.next();
System.out.println("输出的内容为" +str);
}
scanner.close();//IO流类的用完关掉,节省资源。好比水龙头用完要关掉。
/**
* 1、一定要读取到有效字符后才可以结束输入。
* 2、对输入有效字符之前遇到的空白,next()方法会自动将其去掉。
* 3、只有输入有效字符后才将其后面输入的空白作为分隔符或者结束符。
* 4、next()不能得到带有空格的字符。
*/
}
}
8.1.2、nextLine()
package com.bsy;
import java.util.Scanner;
public class scannerDemo2 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("使用nextLine方式接收:");
if (scanner.hasNext()){
String str = scanner.nextLine();
System.out.println("输出内容为:"+str);
}
scanner.close();
/**
* 1、以Enter为结束符,也就是说nextLine()方法返回的输入回车之前的所有字符。
* 2、可以获得空白。
*/
}
}
不使用if语句:
package com.bsy;
import java.util.Scanner;
public class scannerDemo3 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输出数据:");
String str = scanner.nextLine();
System.out.println("输出的内容为:"+str);
scanner.close();
}
}
8.1.3、next()的多种用法
package com.bsy;
import java.util.Scanner;
public class scannerDemo4 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in)
版权声明:本文标题:Java基础笔记(无限整合更新) 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/dianzi/1726762648a1083310.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论