just as 学习笔记,本人的学习笔记,本文章里的内容都是个人观点!!!。
本文章纯纯干货!,你可以自己b站看一遍学习视频在来看这个笔记,或者看一下笔记再去看视频。首先先跟大家说一下我个人学习方法,我的学习方法围绕着:是什么、干嘛的、为什么、怎么用,注意啥。这也是本篇文章内容的主要书写方法。本文章解释的是重点知识,没有全部解释,感兴趣的可以自行百度了解。
先下载一下资料!!!
环境搭建学习主要目的:学会安装jdk、书写HelloWorld案例,其他内容了解一下就行。
什么是环境,你可以理解成教室,是不是要先盖起来,装修一下才开始在里面奋笔疾书。写代码也是需要先搭一个环境,才能开始写代码。冲冲冲!
本小节主要认识一下java(了解即可)
java是一门计算机语言,计算机语言就是计算机能听的懂得语言。
java之父:詹姆斯·高斯林
java一共有三个版本:
javaSE:标准版,其他俩个版本的基础,用于桌面应用开发。
javaEE:企业版,用于Web方向的网站开发。
jsvaME:小型版,用于嵌入式开发,过时了!!!知道干嘛就行。
ps:网站 = 网页 + 后台服务器。网站就是从后台服务器拿到数据通过网页渲染展示数据。
本小节讲的是java为什么会热门很重要的一个点(记住了!!)
平台就是操作系统(windows,mac,linux)
跨平台的意思就是:我们写完一个java程序,它可以在3个操作系统上运行,不用根据不同的系统写代码。
为什么能够跨平台!!
因为:我们写完的代码需要进行编译生成字节码文件,一个字节码文件可以在多个操作系统上运行(一次编译,处处运行),能够跨平台是因为我们的字节码文件并不是运行在操作系统上,而是运行在对应系统的虚拟机(JVM)上。不一样的操作系统有不一样的虚拟机。而虚拟机本身并不能跨平台。跨平台的是java程序(运行在虚拟机上的字节码文件)。
本小节蠢讲JRE和JDK是啥东西,干什么。(记一下!!)
JRE(Java Runtime Environment):java | 运行 | 环境 ,JRE不难理英语单词的首个字母。
JDK(Java Develop Kit): java | 开发 | 工具包 ,一样首个字母。
他们的关系如下图:
开发工具:javac.exe (编译代码)、java.exe 运行工具(将字节码文件送到虚拟机里运行)。
核心类库:别人写好的具有特定功能的代码(我们可以直接用的代码)。
JVM:虚拟机,代码真正运行的地方。
so... JDK包含JRE!!!
JDK是干什么用的:编译代码,运行代码 !!!
JRE是干什么用的:运行环境(给代码提供功能支持和运行的地方)!!!
本节,我们要完成JDK的安装!!!然后配置一下环境变量!!!配置环境变量主要是告诉电脑我的jdk装在哪,方便后续开发使用!!!
这样子jdk就安装成功了
我们还需要配置一下环境变量告诉电脑我jdk装在哪里,方便后续开发使用。
右击此电脑点击属性 ,点击高级设置。
点击环境变量,点击新增 注意我们新增都是在系统变量里操作,方便后续使用。
新增系统变量 JAVA_HOME 变量值为 D:\develop\jdk,点击确定
然后点击在Path里新增 %JAVA_HOME%\bin
这样子电脑就知道我们jdk放在哪了,接下来我们来验证一下 (win + r 输入cmd 打开命令提示符)输入 java -version
这个黑窗口就是命令提示符,输入命令之后出现这样就是安装好了。
接下来我们先爽一下
打开资料,在那里输入cmd (下面第一张图) 然后输入 java HelloWorld
ps:以后开发的用到的工具,你就直接在develop里新建一个文件夹,然后安装在里面就好,方便后续管理。
本小节,我们开始蠢写第一个代码,HelloWorld。
注意注意!!!Java是一个非常规范的语言,严格区分大小写和书写格式。
把资料里的HelloWorld.class文件删掉。
看不到后缀的看下面那张图。
删除好,新建一个文件HelloWorld.java,进入编辑。
将代码写进去,然后保存,一样在资料那边输入cmd。输入javac HelloWorld.java 然后你看文件夹会有生成一个字节码文件,然后java HelloWorld。第一个代码就写完了。
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello,World!");
}
}
运行结果:
javac是编译,java是将字节码文件送到虚拟机运行。java的时候省略后缀.class。
案例可能会遇到的问题:
1- 严格区分大小写
2- 看一下HelloWorld有没有写错(文件名和代码第一行的HelloWorld)
变量的内容你要掌握变量是什么,怎么用,注意啥。
可以把变量理解一个箱子,我们可以在里面放东西。在代码里这个箱子叫空间,放的东西叫做数据。数据有非常多的种类,而我们很喜欢整洁,so...我们希望这个空间不是什么牛马都可以蠢放进去,所以我们要去限制它,我们就要用到数据类型。go go go
本小节要蠢讲一下注释、关键字、常量。(知道就行)
注释就是:对代码的补充说明或者描述,不会参与编译。
//这个是单行注释
/*
这个叫做多行注释
~~~
*/
/**
* 这个叫做文档注释 *
*
*/
关键字就是:java里被赋予特定含义的单词(比如:我爱你用来表达爱意)
class:用来定义一个类
public:权限修饰符(了解即可,后面会学到)
static: 静态修饰符(了解即可,后面会学到)
等等 ======> 关键字有挺多的,学到哪认识到哪就行了。
常量就是:在代码的运行的过程中不会改变的值。
常量有六种,你只需要知道常量是什么就可以了,种类后面写代码就会深深的在你脑海里了。
知道怎么定义变量,数据类型就可以了
变量就是:一个内存的存储空间,里面存的数据是可变的。
变量就是用来存储数据的
怎么定义一个变量:
//数据类型 变量名 = 数据;
int num = 0;
int就是数据类型、num是变量名、0就是数据。
数据类型就是:约定我们的变量里能够存放什么样的数据。
数据类型又分基本数据类型跟引用数据类型。引用数据类型,我们目前只需要记住String(字符串 用双引号包裹)。
基本数据类型可以定义整数,小数,字符,布尔值。
基本数据类型一共有八种:byte、short、int、long、float、double、char、boolean。
前面四种是定义整数,folat、double是定义小数、char定义字符、boolean定义布尔值。
同样是定义整数、小数。为什么他们还有分类。
因为:不同的数据类型能够存储的数据大小不一样,byte 1个字节、short 2个字节、int 4个字节、long 8个字节、float 2个字节、double 4个字节、char 1个字节、boolean 1个字节。
定义变量的注意事项(理解起来)
1- 【变量名要见名知意】
2- 【同一个 { } 变量名不能重复定义】
3- 【变量使用前必须要赋值】
4- 【使用float定义数据后面要加F、使用long定义数据后面要加L】:long num = 10101010L
键盘录入知道怎么用就行了,可以让我们写的代码数据是根据我们输入的来定义,而不是写死的。
使用步骤:
1- 导包
2- Scanner sc = new Scanner(System.in);
3- 定义变量去接键盘输入的值
知道什么是标识符,定义的规范即可
标识符就是你给类、方法、变量起的名字。
命名的规范:
1- 方法和变量定义要遵守小驼峰命名法。
2- 类名用大驼峰命名法。
3- 标识符只能由数字、字母、_(英文的下划线)、$组成。
4- 区分大小写。
5- 不能是关键字。
6- 不能是数字开头。
7- 见名知意。
类型转换就是数据类型之间的转换,运算符跟小学的加减乘除一样。
隐式转换的意思就是:自动转换,不用我们动手。
显示转换的意思就是:手动强制转换,需要我们自己动手。强制转换可能会引起精度丢失。
//隐式转换
int a = 1;
double b = a;
//显示转换
//目标数据类型 变量名 = (目标数据类型)值或者变量;
int a = 1;
byte b = (byte)a;
存储空间比较小的数据类型赋值给存储空间大的数据类型会隐式转换。
存储空间大的数据类型赋值给存储空间小的数据类型需要进行强制转换。
存储空间大小:
隐式转换的细节:
byte、short、char 在运算的时候会自动隐式转换成int。
俩个变量相加赋值给比它的类型存储空间小的就会报错,需要强制转换。
俩个常量相加存在常量优化机制,只要相加的值不超过接数据类型的范围,就会自动转换。比如:俩个整数相加他们只要不超过127就可以用byte类型变量去接。
表达式:用运算符把常量或者变量连接起来符合java语法的式子就可以称为表达式。
字符的加操作会通过ASCII码表转换对应的数值然后进行运算。
记住字符a = 97, A = 65 , 0 = 48
int res = 'A' + 1; //66
字符串的加操作,就是拼接。
String res = "hello" + "world";//helloworld
/*
需求:键盘录入一个三位数,将其拆分为个位、十位、百位后,打印在控制台
分析:
①:使用Scanner键盘录入一个三位数
②:个位的计算:数值 % 10
123 除以 10(商12,余数为3)
③:十位的计算:数值 / 10 % 10
123 除以 10 (商12,余数为3,整数相除只能得到整数)
12 除以 10 (商1,余数为2)
④:百位的计算:数值 / 100 % 10
123 除以 100 (商1,余数为23)
*/
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("请输入: ");
int num = sc.nextInt();
int ge = num % 10;
int shi = num / 10 % 10;
int bai = num / 100 % 10;
System.out.println("ge ==== > " + ge);
System.out.println("shi ==== > " + shi);
System.out.println("bai ==== > " + bai);
}
自增:++
自减:--
i++; 等于 i = i + 1;
i--; 等于 i = i - 1;
i++与++i的区别:
单独使用无区别,但是作为表达式参与运算时,i++ = i ,++i = i+1。
短路逻辑运算符跟逻辑运算符的区别:
逻辑运算符俩边的条件都要进行判断,效率对比比较低。
短路逻辑运算符当左边的条件已经能判断出来真假就不再进行右边判断,效率较高。
/*
需求:一座寺庙里住着三个和尚,已知他们的身高分别为150cm、210cm、165cm,请用程序实现获取这三个和尚的最高身高。
*/
public static void main(String[] args) {
int v1 = 150;
int v2 = 210;
int v3 = 165;
int max = v1 > v2 ? v1 : v2;
max = max > v3 ? max : v3;
System.out.println("max ======> " + max);
}
流程结构分为顺序结构、分支结构、循环结构。顺序结构就是按照顺序一直执行下去。
/*
if(条件判断) {
条件为真执行的语句体
}
*/
if(1 == 1) {
System.out.println("yes");
}
/*
if(条件判断语句) {
条件为真执行
}else {
不为真执行
}
*/
if(1 == 2) {
System.out.println("yes");
}else {
System.out.println("no");
}
//if(条件判断语句) {
// 条件为真执行
//}else if(条件判断语句){
// 条件为真执行
//}else {
// 上面if没有一个真时执行
//}
if (1 == 2) {
System.out.println("1 == 2");
}else if(1 == 1){
System.out.println("1 == 1");
}else {
System.out.println("都是错的");
}
ps:如果有一个if为真就不会执行其他分支
注意点:case后面只能是常量,而且不能重复。
case穿透就是当匹配到值,执行语句体,然后语句体没有break;那它会一直执行每个case直到遇到break;在穿透的时候,每个语句都会执行。
/*
需求:小明快要期末考试了,小明爸爸对他说,会根据他不同的考试成绩,送他不同的礼物,
假如你可以控制小明的得分,请用程序实现小明到底该获得什么样的礼物,并在控制台输出。
*/
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int score = sc.nextInt();
if (score >= 0 && score <= 100) {
if (score >= 90) {
System.out.println("奖励竹子炒肉丝");
} else if (score >= 80) {
System.out.println("大嘴巴子");
} else {
System.out.println("别回家了");
}
}
}
/*
答题
*/
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("1 + 1 = ?\r\n" +
"A.1、 B.2、 C.3、 D.4");
String s = sc.next();
switch (s) {
case "A":
System.out.println("答错了");
break;
case "B":
System.out.println("答对了");
break;
case "C":
System.out.println("答错了");
break;
case "D":
System.out.println("答错了");
break;
default:
System.out.println("输入有错");
break;
}
}
//需求:求1-5之间的数据和,并把求和结果在控制台输出
public static void main(String[] args) {
int sum = 0;
for (int i = 0; i < 5; i++) {
sum += i;
}
System.out.println("sum ====> " + sum);
}
//需求:求1-100之间的偶数和,并把求和结果在控制台输出
public static void main(String[] args) {
int sum = 0;
for (int i = 1; i <= 100; i++) {
if(i % 2 == 0) {
sum += i;
}
}
System.out.println("sum =======> " + sum);
}
/**
* 什么是“水仙花数”?
* 水仙花数是一个三位数
* 111 222 333 370 371 520 999
* 水仙花数的个位、十位、百位的数字立方和等于原数*
* 需求:在控制台输出所有的“水仙花数” 每行俩个
*/
public static void main(String[] args) {
int count = 0;
for (int i = 100; i <= 999; i++) {
int ge = i % 10;
int shi = i / 10 % 10;
int bai = i / 100 % 10;
if(ge * ge * ge + shi * shi * shi + bai * bai * bai == i) {
count++;
System.out.print(i + " ");
if(count % 2 == 0) {
System.out.println();
}
}
}
}
//需求:世界最高山峰是珠穆朗玛峰(8844.43米=8844430毫米),假如我有一张足够大的纸,它的厚度是0.1毫米。
//请问,我折叠多少次,可以折成珠穆朗玛峰的高度?
public static void main(String[] args) {
double end = 8844430;
double s = 0.1;
int count = 0;
while(s < end) {
s *= 2;
count++;
}
System.out.println("count ===> " + count);
}
continue:跳过本次循环,执行下一次循环。
break:结束循环
如果知道循环的次数就使用for循环,不知道循环次数使用while循环。
random用来随机获取值。
使用方法:
1- 导包
2- 新建对象
3- 获取随机值
import java.util.Random;
public class RandomDemo {
public static void main(String[] args) {
Random random = new Random();
int r = random.nextInt(10);
System.out.println(r);
}
}
idea配置:
自动导包
提示忽略大小写
修改主题
修改注释颜色
修改字体
解决注释靠左
数据可以理解成一个容器,用来装多个值,定义的数组变量它存储的是地址值指向堆内存。
动态初始化数组主要应用场景:知道要存储几个数据,但是不知道存储的值是多少,那我们就可以使用动态初始化。
动态初始化,会初始化值,整数类型初始值0,小数初始值0.0,String初始值null,boolean初始值false。
静态初始化主要应用场景:明确有几个值,而且都知道值得数据,这样子就可以直接使用静态初始化。
索引:索引就是表现数据在数组中得位置,我们平常都是从1开始往下面排,但是在计算机中是二进制存储,为了节省空间,从0开始排。
我们可以通过索引去访问数组存储得值。
int[] arr = {1,2,3};
sout(arr[0]); // 打印1
使用数组变量名.length可以获取数组得长度。
public static void main(String[] args) {
int[] arr = {1,2,3,4,5,6,7};
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
}
运行结果:
public static void main(String[] args) {
int[] arr = {1,2,3,4,5,6,7};
int max = arr[0];
for (int i = 0; i < arr.length; i++) {
max = max > arr[i] ? max : arr[i];
}
System.out.println("max =====> " + max);
}
运行结果:
public static void main(String[] args) {
int[] arr = {1,2,3,4,5,6,7};
int sum = 0;
for (int i = 0; i < arr.length; i++) {
sum += arr[i];
}
System.out.println("sum =====> " + sum);
}
运行结果:
public static void main(String[] args) {
int[] arr = {1,2,3,4,5,6,7};
int res = 7;
int index = -1;
for (int i = 0; i < arr.length; i++) {
if(arr[i] == res) {
index = i;
}
}
System.out.println("index ====> " + index);
}
运行结果:
//需求:在编程竞赛中,有6个评委为参赛的选手打分,分数为0-100的整数分。
// 选手的最后得分为:去掉一个最高分和一个最低分后 的4个评委平均值 (不考虑小数部分)。
public static void main(String[] args) {
int[] arr = new int[6];
Scanner sc = new Scanner(System.in);
for (int i = 0; i < arr.length;) {
int val = sc.nextInt();
if(val >= 0 && val <= 100) {
arr[i] = val;
i++;
}
}
int max = arr[0];
int min = arr[arr.length - 1];
for (int i = 0; i < arr.length; i++) {
max = max > arr[i] ? max : arr[i];
min = min < arr[i] ? min : arr[i];
}
int sum = 0;
for (int i = 0; i < arr.length; i++) {
sum += arr[i];
}
sum = sum - max -min;
System.out.println("aver ===> " + (sum / (arr.length - 2)));
}
运行结果:
这个就可以开启debug
方法就是一段具有特定功能的代码。我们可以把重复使用的功能封装成一个方法,这样子可以提升代码的复用性。方法需要手动调用。
方法由修饰符(权限)、返回值(方法可以有返回值,在调用完之后可以使用变量去接它的返回值)、方法名、参数(就是你在调用这个方法的时候你可以给它传参,它使用参数去进行操作)、方法体(写代码的地方) 。
形参:就是你写在方法名后面那个括号的变量。它只是形式上的参数,真正的参数是你调用方法传过来的变量。
实参:调用方法时传入的参数就叫做实参。
public static void main(String[] args) {
int a = 10;
int b = 20;
int max = getMax(a,b);
}
public static int getMax(int a, int b) {
return a > b ? a : b;
}
//遍历一个数组,并返回它的最大值最小值
public static void main(String[] args) {
int[] arr = {1, 2, 3, 4, 5};
int[] res = printArrAndGetMaxMin(arr);
System.out.println("数组的最大值是:" + res[0]);
System.out.println("数组的最小值是:" + res[1]);
}
private static int[] printArrAndGetMaxMin(int[] arr) {
if(arr == null) {
System.out.println("数组为空");
return null;
}
System.out.print("[");
for (int i = 0; i < arr.length; i++) {
if (i == arr.length - 1) {
System.out.print(arr[i] + "]");
} else {
System.out.print(arr[i] + ", ");
}
}
System.out.println();
if(arr.length < 2) {
System.out.println("数组长度为1,最大值,最小值是同一个值。");
return null;
}
int max = arr[0];
int min = arr[0];
for (int i = 0; i < arr.length; i++) {
max = max > arr[i] ? max : arr[i];
min = min < arr[i] ? min : arr[i];
}
return new int[] {max,min};
}
运行结果:
二维数组就是用来装一维数组的地址,也是数组。
跟数组一样
//某公司季度和月份统计的数据如下:单位(万元)
// 第一季度:22,66,44
// 第二季度:77,33,88
// 第三季度:25,45,65
// 第四季度:11,66,99
public static void main(String[] args) {
int[][] arr = {
{22, 66, 44},
{77, 33, 88},
{25, 45, 65},
{11, 66, 99}
};
int sum = 0;
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
sum += arr[i][j];
}
}
System.out.println("sum ======> " + sum);
}
运行结果:
资料
奋斗的意义,不在于一定会让你取得多大的成就,只是让你在平凡的日子里,活得比原来的那个自己更好一点。