ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

java知识一(基础知识)

java知识一(基础知识) 一、介绍1.1 Java的三大技术平台Java分为三个主要版本针对不同应用场景:JavaSE(Java Standard Edition):标准版是Java技术的核心和基础适用于桌面应用和基础开发。JavaEE(Java Enterprise Edition):企业版提供企业级应用开发的一整套解决方案如Web服务、分布式系统等。JavaME(Java Micro Edition):小型版专为移动设备和嵌入式设备设计如老式功能手机、智能卡等。1.2 JAVA的产品JAVA的产品叫JDK(Java Development Kit)是Java开发工具包必须安装才能使用Java。JDK 8(LTS)(2014)——长期支持版广泛使用JDK 11(LTS)(2018-9)——长期支持版JDK 17(LTS)(2021-9)——长期支持版JDK 21(LTS)(2023-9)——长期支持版注意 LTS(Long-Term Support):长期支持版提供长期维护和更新适合生产环境使用。1.3JDK的组成JDK包含以下核心组件:1.3.1 JVM(Java Virtual Machine):Java虚拟机是真正运行Java程序的地方实现“一次编写到处运行”。1.3.2 核心类库:Java官方提供的预写程序供开发者调用如集合、IO、网络等。1.3.3 JRE(Java Runtime Environment):Java运行环境包含JVM和核心类库用于运行Java程序。1.3.4 JDK(Java Development Kit):Java开发工具包(包括上面所有JVM、核心类库、JRE)开发工具:如javac(编译器)、java(运行器)等用于编写和调试Java程序。关系:JDK JRE 开发工具;JRE JVM 核心类库;即JDK JVM 核心类库 开发工具1.4 环境变量1.4.1 点击我的电脑》系统属性》高级系统设置》环境变量》选择用户变量/系统变量(建议系统变量)》双击新建》创建JAVA_HOME变量名(方便其他软件使用)变量值为java安装目录中 bin 目录上一级如图是D:\java1.7》在当前页面找到path变量名双击》新建输入%JAVA_HOME%\bin(以后java目录换了只需修改JAVA_HOME变量名里面的变量值就行了)》点击确认推出path》点击确认退出环境变量》点击确认退出系统属性1.5 简单代码使用创建 HelloWorld.java 文件进入文件所在地址栏输入cmdjavac HelloWorld.java编译文件java HelloWorld.java执行文件命令行会打印出hello world!publicclassHelloWorld{publicstaticvoidmain(String[]args){System.out.println(hello world!);}}如果出现问题D:\code\javajava HelloWorld错误:找不到或无法加载主类 HelloWorld原因:java.lang.ClassNotFoundException:HelloWorld 核心原因类路径Classpath问题 JVM 寻找类的方式是通过 CLASSPATH 环境变量或者-cp/-classpath 命令行参数来确定搜索路径的。如果没有正确设置即使 .class 文件就在当前目录JVM 也可能找不到它。 方案一明确指定类路径最推荐一劳永逸 java-cp . HelloWorld java-classpath . HelloWorld 命令解释java:执行 Java 程序的命令。-cp . 或 -classpath .:这是关键。-cp 是-classpath 的缩写. 代表当前工作目录。这个参数告诉 JVM“在现在所在的这个文件夹里查找你要运行的类HelloWorld”。HelloWorld:要运行的主类名。1.6 IDEA创建Java项目的代码结构工程(Project) 》 模块(Module) 》 包(Package) 》 类(Class)工程根目录 (Project Root) └── 模块目录 (Module) └── src/main/java (源代码根目录) └── 包目录 (Package,如 com/example/demo) ├── 文件 (File,如 UserService.java) │ └── 包含类 (Class)-方法 (Method) └── 文件 (File,如 UserController.java) └── 包含类 (Class)-方法 (Method)1.7 java 进制转换1.7.1 八进制、十六进制基于1111 》8 4 2 1 15为了便于观察和表示二进制推出了八进制和十六进制。八进制每3位二进制作为一个单元(因2^38)最小数是0最大数是7共8个数字(0–7)这就是八进制。示例十进制97→二进制01100001分组(从右向左每3位一组不足补前导0)001、100、001 》1、4、1对应八进制141即01,100,001→141十六进制每4位二进制作为一个单元(因2^416)最小数是0最大数是15依次用0 ~ 9和A ~ F表示(A10,B11,C12,D13,E14,F15)这就是十六进制。示例十进制97→二进制01100001分组(每4位)0110、0001→6、1→61十进制250→二进制11111010分组1111、1010→F(15)、A(10)→FAJava程序中支持书写二进制、八进制、十六进制的数据分别需要以以下前缀开头二进制0B或0b八进制0(注意仅以0开头无其他字母)十六进制0X或0x1.7.2 二进制计算成十进制方法按权展开求和(从右往左每一位的权值为2^nn从0开始递增)权值表计算1101的值 |2^3|2^2|2^1|2^0| |---|---|---|---| |8 |4 |2 |1 |权重 |× |× |× |× | |1 |1 |0 |1 |二进制值 |8 | 4| 0| 1| 13 |1.7.3 二进制计算成八进制规则每3位二进制作为一个单元(因2^38)最小数0最大数7(0–7共8个数字)。二进制转八进制01100001→分组(从右往左每3位一组不足补前导0)001、100、001→对应八进制数字1、4、1→1411.7.4 二进制转十六进制规则每4位二进制作为一个单元(因2^416)最小数0最大数15。0–15共16个数字依次用09和AF代表(A10,B11,C12,D13,E14,F15)。二进制转十六进制01100001→分组(每4位)0110、0001→6、1→6111111010→分组1111、1010→F(15)、A(10)→FA1.8 标识符标识符就是名字(如类名、变量名…都是标识符)。取名字是有规则的,命名规则:一般由数字、字母、下划线(_)和美元符($)等组成不能以数字开头不能是关键字不能包含一些特殊字符(、%、# …)变量名建议首字母小写满足驼峰模式 int studyNumber 59;类名建议首字母大写满足驼峰模式 HelloWorld Student1.9 Java的基本数据类型分类基本数据类型4大类8种;整型默认类型是 int,浮点型(小数)默认类型是 double。下图列出了每种类型的内存占用大小以及对应的数值范围。如byte占一字节8位对应范围是2^8256,所以是-128到127(0占一位)1.10 变量定义变量定义:变量就是内存中的一块区域可以理解成一个盒子用来装程序要处理的数据的定义格式:数据类型 变量名称数据intage18;数据类型:限制盒子中只能存储某种数据形式例如:int(整数类型)、double(小数类型)变量名称:首字母建议小写要有意义:赋值操作 数据:要存入变量的具体数值inti30;// 注意随便写一个整数数字面量默认是int类型的334254235555这个数据虽然没有超过long的范围但是超过了int的范围所以报错如果希望334254235555这个是long类型需要显示的指定加上L或者llongl1334254235555L;floatf1.1f;// 注意随便写一个浮点数字面量默认是double类型的如果希望1.1是float类型的必须加上f或者Fdoubled2.2;1.11 方法定义:方法是一种用于执行特定任务或操作的代码块代表一个功能。作用:它可以接收数据进行处理并返回一个处理后的结果。通俗理解:方法就像是把一段代码打包起来给它起个名字以后想用的时候直接叫这个名字就行了不用重复写代码。1.11.1 方法的完整定义格式修饰符 返回值类型 方法名(形参列表){方法体代码(需要执行的功能代码)return返回值;}publicstaticintmax(inta,intb){intmaxab?a:b;returnmax;}publicstatic(方法的修饰符):Java的固定写法int(返回值类型):表示这个方法执行完后会返回一个什么类型的数据。这里是int说明会返回一个整数。max(方法名称):给方法起的名字用来调用它。(inta,intb)(形参列表):这是方法执行所需的原材料。这里需要两个整数a和b才能进行比较。intmaxab?a:b;(方法的执行代码):这是真正的干活区域利用三元运算符判断谁大谁小。returnmax;(返回处理后的结果):把计算出来的结果送出去。1.11.2 方法使用核心原则:方法必须被调用才能执行。调用格式:方法名称(数据);例如要使用上面定义的max方法需要传入两个具体的数字像这样:max(10,20);1.11.3 无参无返回值和有参有返回值注意:如果方法不需要返回数据返回值类型必须声明为void(无返回值声明)方法内部不可以使用return返回数据打印3行HelloWorld不需要参数也不需要返回值。publicstaticvoidprintHelloWorld(){System.out.println(HelloWorld);System.out.println(HelloWorld);System.out.println(HelloWorld);}void:表示该方法没有返回值。():括号内为空表示该方法不需要接收任何外部数据无参数。 方法体内部只是单纯地执行了三句打印语句。 获取一个指定位数的验证码并返回。 是否需要接收数据需要需要接收位数intlen。 是否需要返回数据需要返回生成的验证码String。 代码实现:publicstaticStringgetCode(intlen){Stringcode;for(inti0;ilen;i){intnum(int)(Math.random()*10);//生成0-9的随机数codenum;// 拼接到字符串上}returncode;// 返回最终生成的字符串}String:这是返回值类型说明调用这个方法后会得到一个字符串结果。(intlen):这是形参列表调用者必须传入一个整数告诉方法需要生成几位数的验证码。Math.random():Java内置的数学工具类用于生成随机数。returncode:将最终生成的验证码字符串返回给调用者。1.11.4 方法可以重载方法重载只关心方法名称相同形参列表不同其他无所谓定义:在一个类中如果出现多个方法的名称相同但是它们的形参列表是不同的(参数类型、个数或顺序不同)那么这些方法就称为方法重载。publicstaticvoidmain(String[]args){System.out.println(printVariable(hello,world));printVariable(0B01100001);//97printVariable(0141);//97printVariable(0xFA);//250printVariable(97);//97}// 重载1:接收一个整数publicstaticvoidprintVariable(inta){System.out.println(a);}// 重载2:接收一个字符串(参数类型不同)publicstaticvoidprintVariable(Stringstr){System.out.println(str);}// 重载3:接收一个整数和一个字符串(参数个数不同)publicstaticvoidprintVariable(inta,Stringstr){System.out.println(a);System.out.println(str);}// 重载4:接收一个字符串和一个整数// 注意方法重载只关心方法名称相同形参列表不同其他无所谓voidprintVariable(Stringa,intstr){System.out.println(a);System.out.println(str);}staticStringprintVariable(Stringa,Stringstr){returnastr;}1.11.5 无返回值方法中的 return 用法无返回值方法中可以直接通过单独的return立即结束当前方法的执行publicstaticvoiddiv(doublea,doubleb){if(b0){System.out.println(除数不能为0);return;//提前结束方法。卫语言风格}System.out.println(a/b);}1.12 类型转换存在不同类型的变量赋值给其他类型的变量1.12.1 自动类型转换类型范围小的变量,可以直接赋值给类型范围大的变量。(如byte-int)自动类型转换顺序byte-short-int-long-float-doublechar-intbytea12;printInt(a);publicstaticvoidprintInt(intb){System.out.println(b);}//自动类型转换在计算机中的执行原理(补全)a(byte类型,8位)00001100b(int类型,32位)000000000000000000000000000011001.12.2 强制类型转换默认情况下,类型范围大的变量直接赋值给小范围类型的变量会报错,可以通过强制类型转换强行将类型范围大的变量/数据赋值给类型范围小的变量语法:数据类型 变量2(数据类型)变量1/数据inta20;// a(32 位):00000000 00000000 00000000 00010100byteb(byte)a;// b(8 位):00010100System.out.println(b);// 输出:20inti1500;// i(32 位):00000000 00000000 00000101 11011100bytej(byte)i;// j(8 位):11011100System.out.println(j);// 输出:-36注意:强制类型转换可能造成数据(丢失)溢出浮点型强转成整型,直接丢掉小数部分,保留整数部分,小数强制转换成整数是直接截断小数部分,保留整数。1.12.3 表达式的自动类型转换在表达式中小范围类型的变量会自动转换成表达式中较大范围的类型再参与运算。类型提升顺序:byte、short、char → int → long → float → double注意:表达式的最终结果类型由表达式中的最高类型决定。在表达式中byte、short、char是直接转换成int类型参与运算的。publicstaticdoublecalc(inta,intb,doublec,charr){// 表达式的最终结果类型是由最高类型决定的返回doublereturnabcr;}publicstaticintcalc2(bytea,byteb){// byte short char运算时会直接提升成int运算返回intreturnab;}publicstaticbytecalc3(bytea,byteb){// 强转bytebytec(byte)(ab);returnc;}1.13 输入输出输出把程序中的数据展示出来。System.out.println(Hello World!);输入程序读取用户键盘输入的数据。通过Java提供的Scanner程序来实现。Scanner是Java提供好的API程序员可以直接调用。API(Application Programming Interface应用程序编程接口)Java 写好的程序可以直接拿来调用。Java 为写好的程序提供了相应的程序使用说明书(API文档)。API文档下载地址(JDK21)https://www.oracle.com/java/technologies/javase-jdk21-doc-downloads.htmlJDK ├─ javac、java等开发工具 └─ JRE ├─ JVM └─ 程序(API)// 1. 导包告诉程序去JDK哪里找Scanner程序用importjava.util.Scanner;publicclassScannerDemo1{publicstaticvoidmain(String[]args){printUserInfo();}// 需求键盘输入用户名和年龄然后打印出来publicstaticvoidprintUserInfo(){// 2. 创建对象(得到一个Scanner扫描器对象)ScannerscnewScanner(System.in);// 3. 获取用户输入System.out.println(请输入用户名);// 让程序在这一行暂停等到输入一个字符串名称直到按了回车键之后把名字交给变量username记住再往下走 读取字符串(遇到空格/回车停止)Stringusernamesc.next();System.out.println(您叫username);System.out.println(请输入年龄);// 让程序在这一行暂停等到输入一个整数直到按了回车键之后把年龄交给变量age记住再往下走intagesc.nextInt();System.out.println(您多少岁age);System.out.println(请输入您的体重kg);doubleweightsc.nextDouble();sc.close();// 优化关闭 Scanner释放资源}}使用Scanner接收用户键盘输入的数据需要三个步骤1.导包告诉程序去JDK的哪个包中找扫描器技术import java.util.Scanner;2.创建对象得到键盘扫描器对象Scanner sc new Scanner(System.in);3.接收用户输入数据// 读取整数intagesc.nextInt();// 读取字符串(不含空格)Stringnamesc.next();4.关闭Scanner释放资源sc.close();注意System、String在JDK中的java.lang包下lang包不需要手动导包是默认自动导入的包1.13.1 idea自动导包设置1.14 基本的算术运算符|符号|作用|说明|||加|||-|减|||*|乘|||/|除|Java中两个整数相除结果还是整数运算的最高类型是整数小数部分会被直接舍弃||%|取余|两个数据做除法的余数|1.14.1 号在Java中的特殊用途(能算则算不能算就连接在一起)符号在有些情况下可以做连接符。符号与字符串运算的时候是用作连接符的其结果依然是一个字符串。若两边的操作数都是数字(或可转换为数字的类型如字符的ASCII码),则做加法运算若两边有一个是字符串则做字符串连接将其他类型转换为字符串后拼接。“abc” 5 — “abc5”inta5;System.out.println(abca);//abc5System.out.println(a5);//10System.out.println(itheimaaa);//itheima5aSystem.out.println(aaitheima);//975itheima 102itheima1.15 自增自减运算符自增:放在某个变量前面或者后面对变量自身的值加1自减:–放在某个变量前面或者后面对变量自身的值减1注意事项、--只能操作变量不能操作字面量、--在变量前后单独使用没有区别inta10;a;a;System.out.println(a);//12a--;--a;System.out.println(a);//10、--不是单独使用(如在表达式中、或同时有其它操作)放在变量前后会存在明显区别 在变量的前面先进行变量自增/自减再使用变量inta10;intrsa;(先加再用)System.out.println(rs);//11System.out.println(a);//11在变量的后面先使用变量再进行变量自增/自减intb10;intrsb;(先用再加)System.out.println(rs);//10System.out.println(b);//111.16 赋值运算符1.16.1 基本赋值运算符 () 从右边往左看。int a 10; // 先看右边把数据10赋值给左边的变量a存储。1.16.2 扩展赋值运算符|符号| 用法 | 作用 | 底层代码形式 | | | ab | 加后赋值 | a (a的类型)(a b); | |- | a-b | 减后赋值 | a (a的类型)(a - b); | |* | a*b | 乘后赋值 | a (a的类型)(a * b); | |/ | a/b | 除后赋值 | a (a的类型)(a / b); | |% | a%b | 取余后赋值| a (a的类型)(a % b); |注意:扩展的赋值运算符隐含了强制类型转换。1.17 关系运算符、三元运算符|符号| 例子| 作用 | 结果 | | | ab | 判断a是否大于b | 成立返回true、不成立返回false | | | ab| 判断a是否大于或者等于b| 成立返回true、不成立返回false | | | ab | 判断a是否小于b | 成立返回true、不成立返回false | | | ab| 判断a是否小于或者等于b| 成立返回true、不成立返回false | | | ab| 判断a是否等于b | 成立返回true、不成立返回false | |! | a!b| 判断a是否不等于b | 成立返回true、不成立返回false |判断数据是否满足条件最终会返回一个判断的结果这个结果是布尔类型的值true或者false。注意在java中判断是否相等一定是“不要把”“误写成”1.17.1 三元运算符格式条件表达式 ? 值1 : 值2;执行流程首先计算关系表达式的值如果值为true返回值1如果为false返回值2。inta10;intb70;intmaxab?a:b;System.out.println(较大值max);//较大值70Stringresultb60?通过:挂科;System.out.println(result);//通过//求三个整数的较大值inta10;intb70;intc60;intmaxab?a:b;maxmaxc?max:c;System.out.println(较大值max);//较大值70intminbc?(ca?c:a):(ab?a:b);//先判断最外层条件 (b c)再选择执行右边还是左边的内层条件System.out.println(较小值min);//较小值101.18 逻辑运算符把多个条件放在一起运算,最终返回布尔类型的值:true、false。|符号|叫法|例子|运算逻辑|||逻辑与|21 32|多个条件必须都是true,结果才是true;有一个是false,结果就是false||||逻辑或|21|35|多个条件中只要有一个是true,结果就是true;||!|逻辑非|!(21)|就是取反:你真我假,你假我真。!truefalse、!falsetrue||^|逻辑异或|21 ^ 31|前后条件的结果相同,就直接返回false,前后条件的结果不同,才返回true|||短路与|21032|判断结果与一样,过程不同:左边为false,右边则不执行。|||||短路或|21||35|判断结果与|一样,过程不同:左边为true,右边则不执行。|注意:java中 和| 无论左边是false还是true右边都要执行由于 ||运算效率更高在开发中常用。1.18.1 逻辑运算符特点 :有一个为false、结果是false :一个为false、结果是false但前一个为false,后一个条件不执行了 | :有一个为true、结果是true || :一个为true、结果是true但前一个为true后一个条件不执行了 ! :!falsetrue、!truefalse ^ :相同是false、不同是true。 实际开发中、常用的逻辑运算符还是: 、|| 、!inta111;intb2;System.out.println(abba);//false 发现左边条件为false右边直接不执行System.out.println(b);//2System.out.println(abba);//即便发现左边条件为false右边依然执行System.out.println(b);//3inti10;intj20;System.out.println(ij||ji);// true 发现左边条件为true右边直接不执行System.out.println(j);//20System.out.println(ij|ji);//true 即便发现左边条件为true右边依然执行System.out.println(j);//21
返回列表