JavaSe学习笔记

Java运行环境的部署(JDK)

我们想要在任意的目录下都可以打开指定的软件,就可以把软件的路径配置到环境变量中。


Javac是JDK提供的编译工具,可以把.java文件编译成.class文件。

Java程序的开发步骤:编写(.Java)>通过Javac.exe编译生成字节码文件(.class)>通过Java.exe对字节码文件进行运行(输出)


JDK(Java开发工具包)5.0/8.0/11.0/17.0 LTS 长期使用版本

JRE(Java运行时环境)

JVM(Java虚拟机)

JavaSE标准类库(API :预先定义好可以直接调用的函数)

他们之间的关系如下:

JDK=JRE+开发工具

JRE=JVM+JavaSE标准类库+运行工具


跨平台中平台的意思就是操作系统(Linux、MocOS、Window)

跨平台的原理是Java不是直接运行在操作系统中的,而是运行在虚拟机中的,我们只需要针对不同的操作系统给出不同的虚拟机就可以了。


Java数据类型

声明long类型变量时需要提供后缀,后缀为“l”或“L”

声明float类型变量时需要提供后缀,后缀为“f”或“F”

boolean类型只有两个数值:true、false 常使用在流程控制语句中

取值范围:

byte<short<int<long<float<double


字符集

制表符'\t'强制延伸至8个空格(补1-8空格)

\ 转义字符

char字符类型''单引号中有且仅有一个字符,字符集ASCLL码 a=97 A=65 48=0


Scanner键盘录入

//1.导包,找到Scanner类在哪,要写在类定义的上面
import java.util.Scanner;

class ScannerDemo{
    public static void main(String[] args){
        //2.创建对象,表示我现在准备要用这个类
        Scanner sc = new Scanner(System.in);
        //3.接受数据
        System.out.print("请输入第一个数:");
        int i = sc.nextInt();
    }
}

体系一:nextint();nextdouble();next(); 遇到空格、制表符、回车、就停止接收后面录入的数据。

体系二:nextLine()可以接受空格、制表符、只有遇到回车才停止接收数据。

占位符:%s   System.out.printf("你好啊%s","张三");//你好啊张三


IDEA

IDEA使用教程

项目(project) module(模块) ackage(包) class(类)

快捷键

Ctrl+Alt+M 抽取方法的快捷键

Shift+f6 改全部变量的快捷键

Ctrl+Alt+T 包裹代码选择语句

Ctrl+Alt+L 格式化代码

Ctrl+Alt+V 自动生成左边

Ctrl+Alt+方向键 返回/跳转

Ctrl+D 复制到下一行

Ctrl+B 查看类源码

Ctrl+N+f12  搜索

Alt+回车 可以选择相对应的提示

Ctrl+Shift+U 小写字母变大写字母

Ctrl+Shift+方向键 移动一行代码

Alt+Fn+Insert Constructor快速生成有参构造方法 Getter and Setter快速生成getset方法


三元运算符
格式: 关系表达式?表达式1:表达式2

如:

int a = 10;
int b = 20;
int max = a>b?a:b;
System.out.println(max);


原码、反码、补码

原码:十进制数据的二进制表现形式,最左边是符号位,0为正,1为负。

利用原码对正数计算是不会有问题的。正数的原、反、补都是一样的。

如:0000 0100(4)+ 0000 0001(1) = 0000 0101 (5)

但如果是负数计算,结果就出错,实际运算的结果,跟我们预期的结果是相反的。

如:1000 0100(-4)+ 0000 0001(1) = 1000 0101(-5)跟正确答案1是相反的。

原因是:二进制后面数字先表示完,最后再由最左边的符号位决定正负的。有两个0[+0(0000 0000)和-0(1000 0000)]也是因此而导致。所以为了解决原码不能计算负数的问题,发明了反码。

反码:正数的反码不变,负数的反码在原码的基础上,符号位不变。数值取反,0变1,1变0。

如: 1000 0100(-4)+ 0000 0001(1) = 1000 0101(-5)

1111 1011 (-4反码)+ 0000 0001 (1) = 1111 1100(再转原码)=1000 0011(-3)

转码运算再转码的意义在于:运算完之后再决定符号位的正负。

但因为符号位导致了有+0和-0的存在,所以

1000 0001(-1)反码1111 1110 +0000 0001(1)= 1111 1111(-0)

-1+1=-0=0 好像也没问题,但是---

当1000 0000(-0)反码1111 111 + 0000 0001(1)= 0000 0000(+0)

-0+1=0,误差为1,继续:

当1000 0101(-5)反码 1111 1010 + 0000 0110(6)= 0000 0000(+0)

-5+6=0,误差为1,继续:

当1000 0100(-4)反码 1111 1011 + 0000 0110(6)= 0000 0001(1)

-4+6=1,误差为1,继续:

当1000 0100(-4)反码1111 1011 + 0000 0111(7)= 0000 0010(2)

-4+7=2,误差还是为1,为什么呢?

还是因为符号位的问题导致在二进制中,有两种表现形式0,一个0000 0000(0),一个1111 1111(-0),所以导致最后运算的结果有1的误差。为了解决原码不能计算负数的问题,又有了补码。

补码:负数的补码=反码+1,因为有两个0,所以把11111111这个原本的-0作为-1的反码的补码,

-4的反码+1=1000 1100 + 0000 0010(2)= 1000 1110(-2补码)  

-4的反码+1=1000 1100 + 0000 0101(5)= 0000 0001(1)

因为反码+1=补码,所以补码到-128有一个补码1000 0000,没有原码也没有反码。

补码解决了负数计算时跨0的问题,也正因如此,数字的存储和计算都是以补码的形式来进行的。

扩展知识:

在不同的数据类型下有不同的字节占用,如:

byte类型的10 1个字节 0000 1010

short字节的10 2个字节 0000 0000 0000 1010

int类型的10 4个字节 0000 0000 0000 0000 0000 0000 0000 1010

long字节的10 8个字节 0000000000000000000000000000000·· 1010

进而解释了隐式转换和强制转换:

byte a = 10;//0000 0010

int b = a;//0000 0000 0000 0000 0000 0000 0000 1010

隐式转换=前面补0

int a = 300;//0000 0000 0000 0000 0000 0001 0010 1100

byte b = (byte)a;//0010 1100

强制转换=截断

public class test08 {
public static void main(String[] args) {
int a = 200;//0000 0000 0000 0000 0000 0000 1100 1000
byte b =(byte)a;//1100 1000//最左边的1是符号位,11001000是补码形式,补码-1=11000111,再转原码是00111000
System.out.println(a);//=200
System.out.println(b);//00111000//-56

int c = 12;
int d = 2 ;
System.out.println(c&d);//逻辑与 0为false 1为true 把两个数都转为二进制,只有两个都是1,才有1,再转成十进制。=0
System.out.println(c|d);//逻辑或 0为false 1为true 把两个数都转为二进制,只要其中一个是1,才是1,再转成十进制。=14
System.out.println(c<<2);//左移 向左移动,低位补0 转2进制整体左移2bit,每左移1次就是×2,然后再转十进制。=48
System.out.println(c>>2);//右转 向右移动,高位补0或1(与右移前原符号位相等) 转2进制整体右移2bit,每右移1次就是除2,然后再转十进制。=3
System.out.println(c>>>2);//右转 向右移动,高位补0 转2进制整体右移2bit,每右移1次就是/2,然后再转十进制。=3
}}


流程控制语句

顺序结构:

Java默认的执行结构,从上往下,依次执行。

分支结构:

  • if语句

if(a>b){}{} 如果表达式不成立,则语句体不再执行。

if(a>b){}else{} 不会都执行也不会都不执行。二者选其一。

if(a>b){}else if(){}else{};n者选其一。

如果对一个boolean类型的变量进行判断,不要用==号,直接把变量写在判断语句中。因为boolean类型的值本身就是判断的结果。而其他判断语句要用==号,因为=是赋值,==才是判断。

补充:

if (flag)相当于 if (flag == true)

if (!flag)相当于 if (flag == false)

if判断语句中使用布尔值作为判断式,只有在布尔值为true时才会执行,为false则跳过,不执行。

  • switch语句

switch(a){case 值1:语句体1;break;case 值2:语句体2;break;default: break;}

如:int a = 10 switch(a){case 10: a;}//case 10 ->{a};

case具有穿透性。当输出语句重复时可以不写break;让case穿透输出。

 jdk12之后优化了switch语句:case 1 ->{}//如果大括号里只有一行代码,{}可以省略。

switch语句中ab取值为byte、short、int、char、JDK5以后可以是枚举,JDK7以后是String。

default可以省略不写,且位置没有上下顺序。

综上所述,if适用于范围判断,swich适用于有限个列举。

循环结构:

  • for循环

for(int i = 1;i <= 10;i++){System.out.println("helloworld");}s

for( 初始语句; 执行条件; 增量 ){循环体}

for循环嵌套的处理逻辑:

只要内循环满足执行条件,是先内循环的,如果内循环不满足执行条件了再跳出内循环到外循环。

  • while循环

while(a >1){}

while(条件判断语句){循环体语句;条件控制语句;}循环下面的语句

for和while的区别:

for循环中:知道循环次数或者循环的范围。

while循环:不知道循环的次数和范围,只知道循环的结束条件。

  • do...while循环

do{循环体语句;条件控制语句;}while(条件判断语句);

先执行后判断。

无限循环:

for(;;){}

while(true){}

do{}while(true);

跳转控制语句:

for (int i = 1; i <= 5; i++) {if (i == 3) { continue;}System.out.println(i);}//1245//

continue:跳过本次循环,继续执行下次循环。

for (int i = 1; i <= 5; i++) {if (i == 3) { break;}System.out.println(i);}//12

break:结束整个循环。

当内外循环嵌套时,假设break是在内循环,这样是无法停止整个循环的,我们可以在外循环格式前输入“xxx:”给外循环命名,这样break xxx就可以跳出指定命名的那个循环了。或在结束整个循环的语句中写:System.exit(0);该输出语句为:停止虚拟机运行。


Random生成随机数:

//1.导包,找到Random类在哪,要写在类定义的上面

import java.util.Random;

class RandomDemo{
    public static void main(String[] args){
        //2.创建对象,表示我现在准备要用这个类
        Random r = new Random();
        int num =r.nextInt();
        //3.接受数据
        System.out.print("请输入一个数:");
        int i = sc.nextInt(100);//包左不包右,0~99
    }
}

生成固定范围随机数:int num = r.nextInt((范围最大值-最小值)+1)+最小值;

如:生成5~15随机数 

数组

数组的定义:

格式1:数据类型[]数组名,如int[]arr【常用】

格式2:数据类型数组名[],如int arr []

数组的静态初始化:

完整格式:数据类型[]数组名=new 数据类型[]{元素1,2,3};如:int[]arr = new int[]{11,22,33};

简化格式:数据类型[]数组名={11,22,33};如:int[]arr = {11,22,33};【常用】

int[]arr1 = new int[]{11,22,33};System.out.println(arr1);//[I@4eec7777

地址值:[I@4eec7777

[:表示当前是一个数组

I:表示当前数组的数据类型都是int类型的

@:表示一个间隔符号(固定类型)

4eec7777:数组真正的地址值(十六进制)

索引(下标):

索引从0开始,最小索引是0,最大索引是length-1

把数据存储到数据中,格式:数组名[索引] = 具体数据/变量;如:arr[0] = 100;

length是Java当中,关于数组的一个长度属性,调用方式:数组名.length

数组遍历:

遍历就是利用循环将数组中所有的内容取出来,取出来之后可以打印、求和、判断,但要注意:遍历指的是去除数据的过程,不要局限的理解为:遍历=打印。

idea中快速生成数组遍历的快捷键为:数组名.fori

一个循环尽量只做一件事情。

数组动态初始化:

初始化时只指定数组长度,由系统为数组分配初始值。

格式:数据类型[]数组名 = new 数据类型[数组长度];如:int[]arr = new int[3];

数组类型默认初始化值:

整数类型:0

小数类型:0.0

字符类型:'\u0000'(空格)

布尔类型:false

引用数据类型:null

Java内存分配

JVM占用的内存空间分为:

栈:方法运行时使用的内存,比如main方法运行。开始执行时进入方法栈中运行,代码执行完毕会出栈。

堆:存储对象或者数组,new来创建的,都存储在堆内存。new出来的东西会在这块内存中开辟空间并产生地址。在堆里面开辟的空间会有地址值。而每一块小空间的地址都是不一样的。

方法区:存储可以运行的class文件。

本地方法栈:JVM在使用操作系统功能时的时候使用,和我们开发无关。

寄存器:给CPU使用,和我们开发无关。


方法

方法是程序中最小的执行单元。如我们经常使用的打印sout就是一个方法,在out类下面out.println就是调用这个方法,里面的东西是参数。重复的代码、具有独立功能的代码可以抽取到方法中。可以提高代码的复用性和可维护性。

方法的格式

public static void main 方法名() {方法体;}

如:public static void main studyJava() {“学习”;}

方法的调用

方法名(); 如:studyJava();

方法必须先定义后调用,方法要写在main方法的里面,类的外面。

调用过程:看到方法进入方法,执行完毕回到调用处。

带参数的方法定义和调用

public static void main 方法名(参数) {...} 如:public static void main (int num){...}

public static void main 方法名(参数1,参数2,..) {...}        

如:public static void main (int num1,int num2){...}。

参数

形参:形式参数,是指方法定义中的参数()方法小括号中,形参

实参:实际参数,是指方法调用中的参数{...}中定义的int a = 1;实参

方法的完整定义和调用(带返回值、参数、return)

public static 返回值 方法名(参数){方法体;return 返回值;}

如:public static int getNum(int a,int b){int c = a + b; return c;}

直接调用:方法名(实参);

赋值调用:整数类型 变量名 = 方法名(实参);

输出调用:System.out.println(方法名(实参));

return:返回值,如果方法执行到了return,那么整个方法全部结束。方法内

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值