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环境变量:

  1. 下载JDK https://www.oracle/java/technologies/downloads/

  2. 右键 This PC(此电脑) -> Properties(属性) -> Advanced system settings(高级系统设置) -> Environment Variables(环境变量)

  3. 新建JAVA_HOME 变量

    1. 变量名:JAVA_HOME
      变量值:电脑上JDK安装的绝对路径
      
  4. 新建/修改 CLASSPATH 变量

    1. 变量名:CLASSPATH
      变量值:.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;
      
  5. 新建两条Path路径

    1. %JAVA_HOME%\bin
      %JAVA_HOME%\jre\bin
      
  6. 打开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