Java基础一

搭建Java环境

一、安装jdk(java开发工具包)

在这里插入图片描述

二、设置环境变量

不想每次都从当前目录中找该命令,有两种方法
① 直接在path中添加这个地址 C:\Program Files\Java\jdk1.8.0_211\bin
在这里插入图片描述
② 先创建一个自定义的环境变量 名为JAVA_HOME (java的家目录 ),值为C:\Program Files\Java\jdk1.8.0_211,在path中添加 %JAVA_HOME%\bin
(%变量名% 表示取值的意思,取值后拼接上 \bin) --> C:\Program Files\Java\jdk1.8.0_211\bin
在这里插入图片描述
在这里插入图片描述
如果以后需要更换java的版本,只需要更改JAVA_HOME即可,不需要更改环境变量,还有一些软件需要通过JAVA_HOME这个变量找到jdk的家目录

修改后环境变量之后,需要重启终端环境变量才能生效。

三、安装idea(Java开发工具)

双击exe安装,安装位置换成D盘
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
jihuo
选择不需要导入配置
在这里插入图片描述
页面风格随意,黑色或白色风格
在这里插入图片描述
安装插件,file右击选择Settings,
在这里插入图片描述
在这里插入图片描述

创建一个新的工程,第一种普通的java工程,学习语法期间都是创建普通的java工程
在这里插入图片描述
选择自己的jdk,ideal是用来编写代码的,jdk用来编译和执行代码的,否则代码无法运行
在这里插入图片描述
工程代码存放目录C:\Users\86150\IdeaProjects,默认在当前用户的家目录中创建一个IdeaProjects目录,以后创建的所有工程都在这个目录中
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Java底层知识

一、JDK、JRE、JVM三者之间的关系

在这里插入图片描述

二、Java程序运行流程

在这里插入图片描述
① 源代码文件.java经过javac编译器编译成字节码文件.class,它们都存储在磁盘当中,由于Java程序是由CPU来运行的,但CPU不能直接与磁盘进行交互,CPU可以直接与内存进行交互,所以需要在内存中申请一定的空间,将文件从磁盘加载到内存中去
② 通过JVM中的类加载子系统,通过加载、链接、初始化等操作,
③ 将字节码文件加载到数据区中
④ 方法区存放mian()、字节码文件,栈区存放执行流程,堆区进行数据存储,从堆区—》栈区—》方法区依次执行释放
⑤ 通过执行引擎的解释器和JIT将字节码文件翻译成机器码
⑥ 机器码反馈给底层机器,程序完毕后退出虚拟机

三、JVM实现跨平台的原理

一次编译,到处运行
提供不同版本的JVM,通过JVM来执行Java程序,并同时通过不同版本的JVM将代码翻译成机器码给对应的操作系统识别

三、源代码文件与字节码文件

在这里插入图片描述

idea自带工具反编译的class文件

在idea 打开 跟源代码 差不多
在这里插入图片描述

反编译成十六进制文件

安装BinEd、jclasslib插件
选择字节码文件,右击选择Open As Binary
在这里插入图片描述
必须在HEX十六进制情况下,才可以看到CAFEBABE
魔数是编译器自动加上去的,CAFEBABE是字节码文件的身份标识,
有CAFEBABE才是合法的字节码文件,才能被JVM虚拟机运行
在这里插入图片描述

反编译成汇编指令

cmd是dos系统,是操作系统自带的命令行终端
在这里插入图片描述
Idea自带的内置命令行终端,相当于在终端中打开,cmd和Idea自带的内置命令行终端不是一个东西,但是它们作用相同
在这里插入图片描述
javap 反编译 字节码 - > 源代码
在这里插入图片描述
javap -v -p 字节码 - > 汇编指令
在这里插入图片描述
javap -v -p 字节码文件 > 文件名.txt
将字节码转变成汇编指令写入到文件名.txt中去,方便程序员查看
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
最终运行的是字节码文件,而不是源代码文件,运行环境默认与编译环境一样,运行环境必须大于或等于编译的版本才能运行

Java基础知识

一、命名规范

类文件是JAVA代码的最小组织单元,文件名后缀名是.java,命名规范是大驼峰 (所有单词的首字母全部大写) eg:HelloWorld.java
类文件不能重名, 但可以使用包来定义多个命名空间,包本质上就是文件夹
包名命名规范
1. 包名全部小写字母
2. 包名的格式为 公司类型.公司名.项目名.模块名
包名中的 . 对应的是一个目录层级
常见的公司类型:
com 国际型商业公司
cn 国内商业公司
edu 教育机构
org 非营利性民间组织
gov 政府机构

二、基本操作

1、直接点击代码旁的绿色三角符号

在这里插入图片描述
2、右击文件
在这里插入图片描述
3、右击空白处,选择run运行
在这里插入图片描述
4、文件重命名
在这里插入图片描述

三、字符集

分类

ASCII 双字节编码 美国人编码,包含128个字符
ISO-8859-1 双字节编码 欧洲的编码,包含256个字符
GB2312 国标码 双字节编码 GB2312标准共收录6763个汉字
GBK 国标码 双字节编码 共收入21886个汉字和图形符号
Unicode 万国码,包含了世界上所有的语言和符号

ASCII码

32是空格
33~47为常用的标点符号
48~57为0到9十个阿拉伯数字
58~64为常用的标点符号
65~90为26个大写英文字母
91~96为常用的标点符号
97~122为26个小写英文字母
123~126为常用的标点符号
127是删除

四、4类8种基本(简单)数据类型

注意:
1、java的数据类型与mysql数据库的数据类型很相似,但不是一回事
2、mysql的数据类型是用来定义表中的字段的数据类型,表在磁盘文件中(永久性,持久性,程序退出,系统关机断电以后文件不会丢失,除非手动删除)
java的数据类型是用来定义变量的数据类型,而变量在内存中(瞬时性,暂时性,程序退出,系统关机断电后内存中所有的数据全部自动擦除)
3、内存的读写速度要远远高于磁盘

CPU 逻辑运算处理器 CPU会将运算结果临时存入内存中,不需要存入磁盘,会浪费存储空间,磁盘读写慢
GPU 图形处理器
SSD 固态硬盘 速度快
HDD 机械硬盘

4类8种基本(简单)数据类型
在这里插入图片描述

package edu.tongda.demo1;
//我们在学习语法写测试代码的时候,包名会以demo1作为延伸 包名 小写
//类名也是以demo1作为延伸 类名 首字母大写
public class Demo1 {
    //psvm 快速出现一个打印的入口
    //这是一个java程序的运行入口,若没有则该类文件不能够被run执行的
    public static void main(String[] args) {
        // 测试8种基本数据类型
        // 使用类型关键字向内存申请内存空间
        // 语法:数据类型 变量名 = 值
        // 数据类型是你想要申请的内存空间的类型,数据类型有8个
        // 变量名是指向你申请到的内存空间的地址的一个代号
        // 值是存入到那块内存空间中的数据

        //超过范围会报错 不能编译 当然不能被运行
        //当程序中有红色波浪号时,代表程序中有错误,不能被运行
        byte a = -128; // -128 ~ 127
        short b = 32767; // -32768 ~ 32767
        int c = 100000000;
        long d = 100000000000000L; // long类型的数据需要加 L 标识
        float e = 9.5F; // long类型的数据需要加 F 标识
        double f = 9349.67645;
        char g = 'x'; // char类型可以存储任意一个字符,用单引号,注意只能一个字符
        boolean h =false; //boolean类型只能存储true和false这2个值
        
        System.out.println(a); //sout 快速在控制台打印
        System.out.println(b); //ctrl+D 快速复制一行
        System.out.println(c); //ctrl+X 快速删除一行
        System.out.println(d);
        System.out.println(e);
        System.out.println(f);
        System.out.println(g);
        System.out.println(h);
    }
}

五、运算符

1、算数运算符
+ - * / %

public class Demo2 {
    public static void main(String[] args) {
        //打印6379的千位、百位、十位和个位
        int num = 6379;
        int a = num / 1000;
        int b = num / 100 % 10;
        int c = num / 10 % 10;
        int d =num % 10;
        System.out.println(a); // 6
        System.out.println(b); // 3
        System.out.println(c); // 7
        System.out.println(d); // 9
    }
}

2、比较运算符
> < >= <= == !=

   public class Demo3 {
    public static void main(String[] args) {
        int a = 50;
        int b = 51;
        // 比较运算符有6种,运算结果只有2个 true false
        // 运算结果为布尔值,true/false,其数据类型是 boolean
        System.out.println(a > b); //false
        System.out.println(a < b); //true
        System.out.println(a >= b); //false
        System.out.println(a <= b); //true
        System.out.println(a == b); //false
        System.out.println(a != b); //true
    }
}

3、逻辑运算符
短路 不短路
与 && & 发音和含义与AND一样
或 || | 发音和含义与OR一样
非 !
短路性能高于不短路

	public class Demo4 {
    public static void main(String[] args) {
        System.out.println();
            int a = 20;
            int b = 21;
            int c = 30;
            int d = 60;

        //逻辑运算符最终运算结果也是布尔值
        //测试与运算符 打印运算结果
        System.out.println(a < b && c % 3 == 0); //true
        System.out.println(a > b && c % 3 == 0); //false
        System.out.println(a < b || c % 3 == 0); //true
        System.out.println(a > b || c % 3 == 0); //true
        System.out.println(a > b && c % 3 == 0); //false
        System.out.println(a > b && c % 3 == 0); //false
        System.out.println(!(c % 3 == 0)); //false
        System.out.println(!(a > b && c % 3 == 0)); //true
    }
}      

4. 自增和自减运算符
++

public class Demo5 {
    public static void main(String[] args) {
        // ++ 自增1
        // -- 自减1

        //一条语句申请多个内存空间,内存的数据类型必须一样才可以这样写,否则应写成多条指令
        int a = 10, b = 20;
        // ++ 可以出现在变量名前面 ++a/--a 或后面 a++/a--
        // ++/--在前面:先++ 或 -- , 再执行其他运算
        // ++/--在后面:先执行其他运算,在执行 ++ 或 --
        System.out.println(a); 
        System.out.println(a++ == 11); // false
        System.out.println(a); // 11
        System.out.println(--a == 11); //false
        System.out.println(a); // 10
    }
}
public class Demo6 {
    public static void main(String[] args) {
        int a = 10, b= 11, c=12;
        //短路与不短路的区别

        //System.out.println(a > b && ++b == c);
        //短路与 false 10 11 12
        //System.out.println(a > b & ++b == c);
        //不短路与 false 10 12 12
        //System.out.println(a ++ == b || c-- == b);
        // 短路或 false 11 11 11
        //System.out.println(a ++ == b | c-- == b);
        // 不短路或 false  11 11 11
        System.out.println(++a == b || c-- == b);
        // 短路或 true 11 11 12
        //System.out.println(++a == b | c-- == b);
        // 不短路或 true 11 11 11
        System.out.println(a);
        System.out.println(b);
        System.out.println(c);
    }
}

5、赋值运算符
= += -= *= /= %=

 public class Demo7 {
    public static void main(String[] args) {
         // = += -= *= /= %=
        //注:1个 = 是赋值,2个 == 是比较是否相等
        //什么是赋值:就是把右边的值存入到左边的变量所指向的内存空间的过程
        //右边可以知识直接量、变量、运算表达式
        int a = 10;
        int b = a;
        int c = a +b;
        a += 10;
        a -= 5;
        a *= 3;
        a /= 3;
        a %= 5;
        System.out.println(a);
        System.out.println(b);
        System.out.println(c);
    }
}

6、7种位运算符(自己写代码用不到,官方源码或面试可能会问到,与二进制相关)
& 按位与
| 按位或
~ 按位非
^ 按位异或
<< 左移
.>> 右移
.>>> 无符号右移

public class Demo8 {
    public static void main(String[] args) {
        // 向内存申请一块4个字节(一个字节是8个bit)的存储空间
        // 变量a指向这块内存的指针
        //8421
        int a = 5; //00000000 00000000 00000000 00000101
        int b = 9; //00000000 00000000 00000000 00001001

        // & 符号左右运算结果是布尔值的时候做不短路与运算
        // & 符号左右运算结果是整数的时候做按位与运算
        //按位与运算规则是:两个数字的二进制的每一位进行按位运算,都为1才是1
        System.out.println(a & b); //00000000 00000000 00000000 00000001 1

        // | 符号左右运算结果是布尔值的时候做不短路或运算
        // | 符号左右运算结果是整数的时候做按位或运算
        //按位或运算规则是:两个数字的二进制的每一位进行按位运算,都为0才是1
        System.out.println(a | b); //00000000 00000000 00000000 0001101 13

        //单目(一元)运算符:表达式中只有一个操作数
        //双目(二元)运算符:表达式中有两个操作数
        //~符号做按位非运算,单目运算符,每个二进制位全部取反,包括符号位
        System.out.println(~a); //11111111 11111111 11111111 1111 1010 -6的补码
        System.out.println(~b); //11111111 11111111 11111111 1111 0010   -10
		
		//二进制的 原码 反码 和 补码之间的关系
		//计算机只认识0和1,所有的数字计算机中都是以二进制的补码形式存储

		//正数的原码=反码=补码
		//负数的反码=反码除符号位按位取反
		//负数的补码=反码+1
        //原码---补码
        //原码                     11111111 11111111 11111111 0110
        //反码(符号位除外,取反) 10000000 00000000 00000000 1001
        //补码 (+1)              10000000 00000000 00000000 0110

        //补码---原码
        //补码 11111111 11111111 11111111 11111010
        //反码(-1) 11111111 11111111 11111111 11111001
        //原码(符号位除外,取反) 10000000 00000000 00000000 00000110 -6

        //补码 11111111 11111111 11111111 11111010
        //取反(符号位除外,取反) 10000000 00000000 00000000 00000101
        //原码(+1) 10000000 00000000 00000000 00000110 -6

        //9
        //00000000 00000000 00000000 00001001 9的原码
        //11111111 11111111 11111111 11110110 按位取反的结果 结果的补码

        //补码---原码
        //方法一:
        //(符号位除外,取反) 10000000 00000000 00000000 00001001
        //(+1)10000000 00000000 00000000 00001010 -10
        //方法二:
        //(-1)11111111 11111111 11111111 11110101
        //(符号位除外,取反)10000000 00000000 00000000 00001010 -10

        //5 00000000 00000000 00000000 00000101
        //9 00000000 00000000 00000000 00001001
        //& 00000000 00000000 00000000 00000001 同1为1
        //| 00000000 00000000 00000000 00001101 有1为1
        //^ 00000000 00000000 00000000 00001100 同0异1
        //~ 取反

        //7  00000000 00000000 00000000 00000111
        //11 00000000 00000000 00000000 00001011
        //&  00000000 00000000 00000000 00000011 同1为1  3
        //| 00000000 00000000 00000000 00001111 有1为1   15
        //^ 00000000 00000000 00000000 00001100 同0异1   12
        //~7 11111111 11111111 11111111 11111000
        // (-1) 11111111 11111111 11111111 11110111
        //(符号位除外,取反)10000000 00000000 00000000 00001000 -8
        //~11 11111111 11111111 11111111 11110100
        // (-1) 11111111 11111111 11111111 11110011
        //(符号位除外,取反)10000000 00000000 00000000 00001100 -12
        
        int c = 7;
        int d = 11;
        System.out.println(c&d);
        System.out.println(c|d);
        System.out.println(c^d);
        System.out.println(~c);
        System.out.println(~d);

        // << 左移运算符 丢弃高位,低位补0
        //面试题?
        //如何用最快的速度计算   3*4 (3<<2)   8/2 (8>>3)
        // 左移n位 相当于 a * 2^n
        // 3 0011
        System.out.println(3<<1);  // 0110 6
        System.out.println(3<<2);  // 1100 12
        System.out.println(3<<3);  // 1 1000 24
        // >> 右移运算符 丢弃低位,正数高位补0,负数高位补1
        // 右移n位 相当于 a / 2^n
        //1000 8
        System.out.println(8>>1);  // 0100 4
        System.out.println(8>>2);  // 0010 2
        // 0001 1
        System.out.println(8>>3);
        // >>> 无符号右移运算符,丢弃低位,高位补0
        System.out.println(-8>>1);
        System.out.println(-8>>2);
        System.out.println(-8>>3);

        //负数的无符号右移 数会非常大
        System.out.println(-8>>>1);
        System.out.println(-8>>>2);
        System.out.println(-8>>>3);
    }
}

7、三目运算符
格式:条件表达式 ? 值1 : 值2
执行流程:条件为true,返回值1,若为false,则返回值2

六、程序流程控制语句

[见链接]

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小白*进阶ing

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值