基础不牢,地动山摇,Java基础干货满满(建议收藏)

简介: 学了十天 Java SE了,最近事有点多,学习进度有点拖,不过,今天算是完成了SE的第一个阶段.

文章目录


过去


三大版本


Java 语言特点


Java开发工具


跨平台 Java虚拟机(JVM)


什么是 JDK,JRE?


注释


变量


+号的使用


数据类型


8大基本类型


引用数据类型


Java API文档


运算细节


基本数据类型转换


运算符


优先级


进制转换


位运算符(原码,反码,补码)


命名规范


关键字和保留字


获取用户输入 Scanner


程序控制结构


if


if-else


if-else if -.......else


switch


switch 和 if 的比较


for 循环控制


while 循环控制


do while 循环控制


多重循环


跳转控制语句-break


跳转控制语句-continue


跳转控制语句-return


编程思想


过去


1995年,sun公司发布Java的第一个版本

2009年,甲骨文公司收购sun


三大版本


Java SE 标准版


Java EE 企业版


Java ME 小型版


Java 语言特点


Java 语言是面向对象的(oop)


Java 语言是健壮的。Java 的强类型机制、异常处理、垃圾的自动收集等是 Java 程序健壮性的重要保证


Java 语言是解释型


Java 语言是跨平台性的。[即: 一个编译好的.class 文件可以在多个系统下运行,这种特性称为跨平台]


……


Java开发工具


sublime


Eclipse


IDEA(有基础推荐,用的很多,确实强大,IDEA使用Java开发的哦)


跨平台 Java虚拟机(JVM)


JVM 是一个虚拟的计算机,具有指令集并使用不同的存储区域。负责执行指令,管理数据、内存、寄存器,包含在JDK 中

对于不同的平台,有不同的虚拟机

Java 虚拟机机制屏蔽了底层运行平台的差别,实现了“一次编译,到处运行”


dde2a4eda8c14797af77e2d5bcd36948.webp.jpg


你 get 到了吗?


什么是 JDK,JRE?


JDK


JDK 的全称(Java Development Kit Java 开发工具包)

JDK = JRE + java 的开发工具 [java, javac,javadoc,javap 等]


JDK 是提供给 Java 开发人员使用的,其中包含了 java 的开发工具,也包括了 JRE。所以安装了 JDK,就不用在单独安装 JRE


JRE


JRE(Java Runtime Environment Java 运行环境)

JRE = JVM + Java 的核心类库[类]


包括 Java 虚拟机(JVM Java Virtual Machine)和 Java 程序所需的核心类库等,如果想要运行一个开发好的 Java 程序,计算机中只需要安装 JRE 即可。


JDK = JRE + 开发工具集

JRE = JVM + Java SE 标准类库(java 核心类)


注释


用于注解说明解释程序的文字就是注释,注释提高了代码的阅读性(可读性);注释是一个程序员必须要具有的良好编程习惯。将自己的思想通过注释先整理出来,再用代码去体现。


1.单行注释 //

2.多行注释 /* */

3.文档注释 /** *


变量


变量是程序的基本组成单位


变量相当于内存中一个数据存储空间的表示


变量声明


int a;


变量赋值


a = 2;


声明及赋值


int a = 2;


+号的使用


当两边是数字,就做数学运算

当两边有一边是字符串,做拼接运算


数据类型



Java是强类型语言,必须要知道你的类型


在内存中根据不同类型分配不同大小的空间


8大基本类型


数值型:


整数 byte(1)short(2) int(4)long(8)

小数 float(4)double(8)

字符型:


char(2)

布尔型


boolean(true)(false)


引用数据类型


类(class)

接口(interface)

数组([])


Java API文档


Java API在线文档 点击查看


运算细节


浮点数在机器中存放的方式: 浮点数=符号位+指数位+尾数位


尾数部分可能丢失,造成精度的损失,小数都是近似值


对于浮点数的陷阱,可以通过绝对值处理,绝对值的差小于我们能接受的范围,就认为是相等的


double a = 2.7;
double b = 8.1/3;
if(Math.abs(a-b <= 0.000001)){}


在Java中,char的本质是一个整数,默认输出时,是Unicode码对应的字符


char 类型是可以进行运算的,相当于一个整数


Java 中不可以用 0 或非 0 的整数代替false 和 true,这和C语言不同


取模的本质:


一个公式:a % b = a - a/b * b


基本数据类型转换



自动类型转换


Java程序在运行赋值或进行运算时,精度小的会自动向精度大的转换(兼容)


表达式结果自动提升为操作数中最大的类型

byte,short,char 三者进行运算时,首先转为 int 型


(byte,short)和char 之间不会相互自动转换


把精度大的给精度小的,不做处理,就会报错


强制类型转换


自动类型转换的逆过程,将容量大的数据类型转换为容量小的数据类型。使用时要加上强制转换符 ( ),但可能造成精度降低或溢出,使用时需注意


会使用括号来提升优先级

char 可以保存 int 的常量值,但不可以保存 int 的变量值,需要强转

byte和short,char类型在运算时,当作 int 类型处理


运算符


运算符是一种特殊的符号,用以表示数据的运算、赋值和比较等


算术运算符


赋值运算符


关系运算符 [比较运算符]


逻辑运算符


位运算符 [需要二进制基础]


三元运算符


a>b?a:b(a大于b吗,如果为真,就返回a,否则返回b),二分支缩写


算术运算符:+,-,*,/,%


逻辑运算符:&&,&,!,||,|


比较运算符:>,<,=,==,>=,<=,!=


移位运算符:>>右移除以2,<<左移乘以2


会用括号就🆗了,用好括号


%模运算,就是取余数


&&,逻辑与,相当于and,两者都为真才为真


&,二进制的and


||,逻辑或,相当于or,只要有一个满足就执行


|,二进制下的or


!非,取反操作,假变真,真变假


优先级


59b59a6b9f3346ff840613ec3879765e.png


进制转换


2进制,8进制,16进制-------------------10进制

2—10


0b1101—0b是标记,用来标记它是一个2进制数


1*2^0+0*2^1+1*2^2+1*2^3=13


8—10


0110


8进制第一个数是0来做标记


0*8^0+1*8^1+1*8^2=72


16—10


0x或0X标记


0x123A


10*16^0+3*16^1+2*16^2+1*16^3=4666


10进制------------------------2进制

把该数不断除以2,直到商为0为止,然后将每步得到的余数倒过来


8进制--------------------------2进制

把该数不断除以8,直到商为0为止,然后将每步得到的余数倒过来


16进制------------------------2进制

把该数不断除以16,直到商为0为止,然后将每步得到的余数倒过来


二进制的最高位表示的是符号位,0表示正数,1表示负数


正数的原码,反码,补码都一样(三码合一)


负数的反码 = 它的原码符号位不变,其他位取反,0变1,1变0


负数的补码 = 它的反码+1,负数的反码 = 负数的补码-1


0的反码,补码都是0


Java没有无符号数,Java中的数都是有符号的


计算机运算时,都是以补码的方式进行的


看运算结果的时候,要看他的原码


位运算符(原码,反码,补码)


Java中有7个位运算(&,|,^,~,>>,<<,>>>)


按位与& //两位全为1,结果是1,否则是0


按位或| //两位有一个为1,结果为1,否则为0


按位异或^ //两位一个为0,一个为1,结果为1,否则为0


按位取反~ //0bian1,1bian0


2&3


首先得到2的补码,要想得到补码,首先得到2的原码,2是int型,4个字节,1字节是8bit,因此2的原码是: 00000000 00000000 00000000 00000010 ,因为正数三码合一,所以它的补码就是原码,同理 3的补码就是:00000000 00000000 00000000 000000101,然后按位与


2 00000000 00000000 00000000 00000010
3 00000000 00000000 00000000 00000011
& 00000000 00000000 00000000 00000010
//这是运算过后得到的补码,看结果要看原码,正数的三码合一,OK
结果就是 00000000 00000000 00000000 00000010 所以2&3就是2


~-2


-2的原码是 10000000 00000000 00000000 00000010 符号位1代表是一个负数,运算时是以补码方式运算的,想要补码,先得到反码,反码+1=补码,-2的反码,符号位不变,其他取反,11111111 11111111 11111111 11111101,反码+1=补码:11111111 11111111 11111111 11111110取反,~-2 00000000 00000000 00000000 00000001,运算后时一个正数,三码合一,即原码就是,转换为10进制为1


~2


2的补码: 00000000 00000000 00000000 00000010
~2操作:  11111111 11111111 11111111 11111101
运算后的反码: 11111111 11111111 11111111 11111100
运算后的原码: 10000000 00000000 00000000 00000011
   结果就是  -3


>> 算术右移
<< 算术左移
>>> 无符号右移  低位溢出,高位补0
没有<<<符号


int a = 1>>2; //00000000 00000000 00000000 00000001=>00000000 00000000 00000000 00000000
低位溢出,符号位不变,使用符号位补溢出的高位,本质就是1/2/2 = 0


int b = 1<<2; //00000000 00000000 00000000 00000001=>00000000 00000000 00000000 00000100
符号位不变,低位补0,本质就是1*2*2 = 4


4<<3=4*2*2*2=32
1>>2=1/2/2=0
15>>2=15/2/2=3


-10.5%3
-10.5-(-10)/3*3 = -10.5+9 = -1.5


int a = 66;
System.out.println(++i+i);//67+67=134


命名规范



包名:多单词组成时所有字母都小写:aaa.bbb.ccc //比如 com.hsp.crm

类名、接口名:多单词组成时,


所有单词的首字母大写:XxxYyyZzz [大驼峰],例如: TankShotGame


变量名、方法名:多单词组成时,第一个单词首字母小写,第二个单词开始每个单词首字母大写:xxxYyyZzz [小驼峰, 简称 驼峰法],例如: tankShotGame


常量名:所有字母都大写,多单词时每个单词用下划线连接:XXX_YYY_ZZZ


关键字和保留字


关键字定义:被 Java 语言赋予了特殊含义,用做专门用途的字符串(单词)

关键字特点:关键字中所有字母都为小写


Java 保留字:现有 Java 版本尚未使用,但以后版本可能会作为关键字使用。自己命名标识符时要避免使用这些保留

字 byValue、cast、future、 generic、 inner、 operator、 outer、 rest、 var 、 goto 、cons


获取用户输入 Scanner


在编程中,需要接收用户输入的数据,就可以使用键盘输入语句来获取,需要一个 扫描器(对象), 就是


Scanner


Scanner scanner = new Scanner(System.in);


程序控制结构


三大流程控制语句


1.顺序控制

2.分支控制

3.循环控制


顺序控制


程序从上至下逐行执行,中间没有任何的跳转和判断


分支控制


1.单分支 if

2.双分支 if-else

3.多分支 if-else if -…else


if



if(i%5==0){
    System.out.print(i+"\t");
}


if-else



/**
 * @Author: liu sen
 * @Version: 1.0
 * @Date: 2021/08/31/1:05
 */
public class demo18 {
    public static void main(String[] args) {
        int a = 3;
        if(a>5){
            System.out.println("大于5");
        }else{
            System.out.println("小于5");
        }
    }
}


if-else if -…else



public class Demo05 {
    public static void main(String[] args) {
        int score = 0 ;
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入成绩,童鞋");
        int s = scanner.nextInt();
        if(s>=60 && s<=100){
            System.out.println("恭喜,没挂科");
        }else if(s>=0 && s<60){
            System.out.println("额,你懂");
        }else{
            System.out.println("不是整数");
        }
        scanner.close();
    }
}


switch



case中的值不能是变量,只能是常量

default 语句是可选的,当没有匹配的 case 时,执行 default

break 使程序在执行完分支退出 switch


/**
 * @Author: liu sen
 * @Version: 1.0
 * @Date: 2021/08/31/1:08
 */
public class demo19 {
    //break用于跳出,防止穿透
    public static void main(String[] args) {
        char c = 'a';
        switch (c){
            case 'a':
                System.out.println("a");
                break;
            case 'b':
                System.out.println("b");
                break;
            default:
                System.out.println("其他");
        }
    }
}


switch 和 if 的比较



1.如果判断的具体数值不多,而且符合 byte、 short 、int、 char, enum[枚举], String 这 6 种类型。虽然两个语句都可以使用,建议使用 swtich 语句。


2.其他情况:对区间判断,对结果为 boolean 类型判断,使用 if,if 的使用范围


for 循环控制



1.for 关键字,表示循环控制


2.for 有四要素: (1)循环变量初始化(2)循环条件(3)循环操作(4)循环变量迭代


3.循环操作 , 这里可以有多条语句,也就是我们要循环执行的代码


4.如果 循环操作(语句) 只有一条语句,可以省略 {}, 建议不要省略


循环条件是返回一个布尔值的表达式


for(;循环判断条件;) 中的初始化和变量迭代可以写到其它地方,但是两边的分号不能省略。


循环初始值可以有多条初始化语句,但要求类型一样,并且中间用逗号隔开,循环变量迭


代也可以有多条变量迭代语句,中间用逗号隔开


while 循环控制



1.循环条件是返回一个布尔值的表达式

2.while 循环是先判断再执行语句


/**
 * @Author: liu sen
 * @Version: 1.0
 * @Date: 2021/08/31/1:33
 */
public class demo20 {
    public static void main(String[] args) {
        int i = 5;
        while (--i > 0){
            System.out.println("i="+i);
        }
    }
}


输出:


db7f8b517a6e4f638d60ad0ee3e3fbaf.png


do while 循环控制



do while 是关键字

也有循环四要素, 只是位置不一样


先执行,再判断,也就是说,一定会至少执行一次

最后 有一个 分号 ;


循环条件是返回一个布尔值的表达式

do…while 循环是先执行,再判断, 因此它至少执行一次


/**
 * @Author: liu sen
 * @Version: 1.0
 * @Date: 2021/08/31/1:33
 */
public class demo20 {
    public static void main(String[] args) {
        //统计 1---200 之间能被 5 整除但不能被 3 整除的 个数
        // 化繁为简
        //(1) 使用 do-while 输出 1-200
        //(2) 过滤 能被 5 整除但不能被 3 整除的数 %
        //(3) 统计满足条件的个数 int count = 0;
        //先死后活
        //(1) 范围的值 1-200 你可以做出变量
        //(2) 能被 5 整除但不能被 3 整除的 , 5 和 3 可以改成变量
        int i = 1;
        int count = 0; //统计满足条件的个数
        do {
            if( i % 5 == 0 && i % 3 != 0 ) {
                System.out.println("i=" + i);
                count++;
            }
            i++;
        }while(i <= 200);
        System.out.println("count=" + count);
    }
}


多重循环



将一个循环放在另一个循环体内,就形成了嵌套循环。其中,for ,while ,do…while 均可以作为外层循环和内层循环【建议一般使用两层,最多不要超过 3 层, 否则,代码的可读性很差】


实质上,嵌套循环就是把内层循环当成外层循环的循环体。当只有内层循环的循环条件为 false时,才会完全跳出内层循环,才可结束外层的当次循环,开始下一次的循环


设外层循环次数为 m 次,内层为 n 次,则内层循环体实际上需要执行 m*n


跳转控制语句-break



break 语句用于终止某个语句块的执行,一般使用在 switch 或者循环 for , while , do-while 中


{ ……
break; ……
}


跳转控制语句-continue



continue 语句用于结束本次循环,继续执行下一次循环。


continue 语句出现在多层嵌套的循环语句体中时,可以通过标签指明要跳过的是哪一层循环


{ ……
continue; ……
}


跳转控制语句-return



return 使用在方法,表示跳出所在的方法


编程思想



化繁为简 (把一个大问题拆分为小问题解决)


先死后活 (先设置成常量,实现后可以把常量用变量来替代,程序的扩展性大大提升)


一段代码实现一个功能 (高内聚低耦合)





相关文章
|
3月前
|
存储 Java
最新Java基础系列课程--Day10-IO流文件处理(一)
最新Java基础系列课程--Day10-IO流文件处理
|
4月前
|
存储 缓存 Java
最新Java基础系列课程--Day10-IO流文件处理
最新Java基础系列课程--Day10-IO流文件处理
|
17天前
|
搜索推荐 Java
Java基础(快速排序算法)
Java基础(快速排序算法)
23 4
|
2月前
|
缓存 分布式计算 Java
Java基础深化和提高-------IO流
Java基础深化和提高-------IO流
108 0
|
3月前
|
缓存 Java Apache
最新Java基础系列课程--Day10-IO流文件处理(三)
最新Java基础系列课程--Day10-IO流文件处理
|
3月前
|
Java
最新Java基础系列课程--Day10-IO流文件处理(二)
最新Java基础系列课程--Day10-IO流文件处理
|
8月前
|
设计模式 缓存 分布式计算
|
6月前
|
存储 缓存 Java
Java基础知识第二讲:Java开发手册/JVM/集合框架/异常体系/Java反射/语法知识/Java IO
Java基础知识第二讲:Java开发手册/JVM/集合框架/异常体系/Java反射/语法知识/Java IO
167 0
Java基础知识第二讲:Java开发手册/JVM/集合框架/异常体系/Java反射/语法知识/Java IO
|
7月前
|
存储 缓存 Java
【JAVA基础】 IO详解
【JAVA基础】 IO详解
37 1
|
8月前
|
存储 缓存 Java