第一章-Java基础笔记

Java语言的概述

​ Java是一门面向对象的语言,Java相对于C语言来说学习相对简单,它主要的三大特点就是:封装、继承、多态,并且只需要进行一次源码编译,在任何装有对应版本的JVM虚拟机环境的计算机下运行;




Java的三个版本

  • JavaSE

    • 主要用于桌面应用的开发
  • JavaME

    • 主要用于嵌入式系统的开发
  • JavaEE

    • 主要用于企业级的WEB端开发和服务器开发



Java环境介绍

JDK - 提供了开发者的一些工具包,并包含了[JRE和JVM]

JRE - Java的运行环境,提供了运行时需要的类库,并包含了[JVM]

JVM - Java的虚拟一块内存区域,用于执行Java的代码




Java跨平台交互图

Java跨平台图




Java代码的运行机制

​ 后缀点java的文件会通过 javac命令 进行文件的编译成一个能够被JVM读懂的字节码文件,通过加载、校验、初始化的过程都内存中,通过JVM寄存器读取文件中的行号,进行执行相关代码;

Java的文件运行图




注释

​ 注释是为了在编写程序时对某个类、方法或是一段代码进行功能作用的说明,它不会被编译成代码执行,只是起到一个描述作用,便于对代码的理解;

​ Java中的注释分为3种:

​ 单行注释 ://

​ 多行注释 :/* */

​ 文档注释 :/** */
对注解的内容生成JavaDoc文档
DOS命令进入到要生成Doc文档的层级目录,执行:javadoc -encoding UTF-8 -charset UTF-8 文件名称

/**
* @Author JavaCat7
* @Description 这是一个文档注释
*/
public class Demo{
    /**
    * @Parameter args   对参数的描述
    * @Description 这是一个文档注释
    */
    public static void main(String[] args){
        //这是一个单行注释
        System.out.println("Hello Java");
        
        /*
        	这是多行注释
        	这是多行注释
        */
        
    }
    
}



标识符

​ 每个人都有名字,而标识符是为了给代码中的类、接口、方法、变量取一个名字,但它们的明白是有着严格规范的;

规范:
​ 每个人都有名字,而标识符是为了给代码中的类、接口、方法、变量取一个名字,但它们的明白是有着严格规范的;

  **规范:**

  	1.严格区分大小写;
  	2.开头可以是$ 或 _ 或 A-Z a-z的字母组成,也可以汉字(不会这么干);
  	3.可以由数字、字母或者是 $ 或 _ 组成,但数字不能用于开始;
  	4.不可以包含特殊字符;
  	5.不能以Java语言中的保留字作为命名; 
  	6.类名采取大驼峰命名法;
  	7.方法和变量采取小驼峰命名法;
  	8.常量采取大学加_进行命名;



基本数据类型

​ Java是强类型计算机语言,所有的变量必须先定义才能使用,对于强类型而言主要就是指的数据安全,强类型的语言有很多,比如C、C++、python...

计算机存储单位换算

  • bit(位) - 是计算内部数据存储的最小单元,通过8个二进制位进行表示;
  • byte(字节) - 是计算机中数据处理的基本单位,通常使用B来表示;
    • 8个bit(位) = 1B(字节)
    • 1024个B(字节) = 1KB
    • 1024个KB = 1MB
    • 1024个MB = 1GB
    • ....

数据类型

//整数类型
byte a = 1;
short b = 2;
int c = 3;
long d = 4L;
//小数类型
float e = 5.0f;
duble f = 6.0d;
//字符类型
char g = 'a';
//布尔类型
boolean h = true;
boolean i = false;



数据类型的转换

​ 各数值相关数据类型支持类型上的转换,既可以把排序级别较低的类型转换成排序级别较大的类型,也可以把排序级别较高的类型转换成级别较低的类型(但会造成数据的丢失);

数据的转换

  • 强制类型转换 - 在要转换的变量前使用:要转换的对应数据类型 如- (int)
  • 自动类型转换 - 在不同的数值数据类型运算中,它会以排序级别较高的数据类型作为基础自动转换

数据类型转换

int number1 = 128;
//正常byte的值是 -128 - 127,强制把int类型转换成byte会造成数据的不精确
byte number2 = (byte)number1;

int number3 = 519;
float number4 = 1.0f;
//在运算过程中因为float的排序级别比int高,那么它会自动转换成float类型在完成运算
float number5 = number3 + number4;



变量,静态变量,常量及作用域

​ 变量是指可以变化的值,通过数据类型和变量名可以在内存中申请一块存储的空间,通过内存的引用地址可以设置改变内存中存储的值或者修改值,所有的变量必须先赋值才可以使用;

成员变量

​ 成员变量是指在类中与方法同级的位置中定义的成员变量,在该位置定义的变量可以不用设置值就可以使用,因为它会对类进行初始化,并完成初始化赋值,就算不给他们赋值也会有默认的初始值,他们的默认初始值都是最小的单元;

作用域

成员位置的变量,可以在非静态方法的所有位置使用,如果要在静态方法中使用,需要先创建对象;

public class Variable{
    int a;			//默认为:0
    float b;		//默认为:0.0
    char c;			//默认为:''
    boolean d;		//默认为:false
}

局部变量

​ 局部变量是指在方法内部定义的变量,必须要先完成初始化后,才可以被使用;

作用域

局部位置的变量,外部无法使用,只能在方法内部使用,可以和外部的变量名称相同;

public class Variable{
    int number;
    public void method(){
        int number = 3;//可以和成员位置的变量名称相同
    }
}

静态变量

​ 静态变量是指被static关键字修饰的变量,被修饰的变量又称为类变量;

作用域

静态变量可以作用域与所有方法中,静态变量只能定义在类的成员位置;

public class Variable{
    static int number ;
    public static void main(String[] arags){
        System.out.println(number);
    }
    public void method(){
        System.out.println(numbe);
    }
}

常量

​ 常量是指不能被改变的值,它在创建到成员位置必须要先完成赋值,一旦被创建它的值是不允许被更改的;

作用域

它的作用域和成员变量相同

public class Variable{
    final int NUMBER = 3.1415926;
}

静态常量

​ 静态常量是指从属于类的常量,在完成初始化以后是不可以被修改的,并且被public所进行修饰;

作用域

它的作用域和静态变量相同

变量内存执行图




运算符

算术运算符

int a = 5;
int b = 2;
int number = a + b; //number = 7;
int number = b - a; //number = 3;
int number = a * b; //number = 10;
int number = a / b; //number = 2,只取整数;
double number = a / (double)b; //number = 2.5
int number = a % b; //number = 1;

自增自减运算符

int a = 1;
int b;
b = a++; //b = 1; 先把a的值赋值给b,后a进行 +1 操作;
b = a--; //b = 2; a前面进行了自增那么就是2,先把2赋值给b,然后进行 -1 操作;
b = ++a; //b = 2; 前面a进行了自减那么就是1,先对a进行自增加1,然后在赋值给b;
b = --a; //b = 1; 前面a是2,先对a进行自减1,在赋值给b;

赋值运算符

int a = 5;//把 5 赋值给 a;
int b = 2;//把 2 赋值给 b;
a += b;	// a = 7(a+b的结果在赋值给a);
a -= b; // a = 3;
a *= b; // a = 10;
a /= b; // a = 2;
a %= b; // a = 1;

关系运算符

int a = 5;
int b = 2;
a > b; //true
a < b; //false
a >= b; //false
a <= b; //true
a == b; //false
a != b; //true

逻辑运算符

boolean a = true;
boolean b = false;
a && b = false;//都true则true,第一个条件为false就不会在看第二个条件,直接返回false
a || b = true;//一个条件为true则true,第一个条件为tre就不看第二个条件,直接返回true
! a = false;//取反
a & b = false;//2个条件都要执行
a | b = true;

三元运算符

int a = 5;
int b = 5;
a == b ? "等于":"不等于"; //为true返回第一个,为false返回第二个



流程控制语句

If语句

if语句就是判断条件是否成立,成立就执行if中的代码,不成立就不进入;

boolean flag = true;
if(flag){
 System.out.println("...");
}

if...else语句

if...else语句就是根据判断的条件是否成立,成立走if语句,不成立走else语句;

boolean flag = true;
if(flag){
 System.out.println("成立");
}else{
 System.out.println("不成立");
}

if...else if语句

if...else if支持多条件的判断,只会进入一个匹配的条件;

boolean flag = true;
boolean fail = false;
if(flag){
 System.out.println("条件匹配");
}else if(fail){
 System.out.println("条件匹配");
}else{
 System.out.println("条件都不匹配");
}

switch条件控制语句

witch语句从JDK1.7开始可以支持匹配:String字符串;

注意事项:

  • 每个case 后面必须跟一个数值常量或字符串常量用于匹配;
  • 匹配的语句后面需要加上break关键字,防止case穿透;
String week =  "星期一";
switch(week){
    case "星期一":
        System.out.println("今天是星期一");
        break;
    case "星期二":
        System.out.println("今天是星期二");
        break;
    case "星期三":
        System.out.println("今天是星期二");
        break;
    default:
        System.out.println("今天星期几都不是");      
}



循环控制语句

for循环语句

for(初始值,条件表达式,更新)

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

增强for循环

for(接收类型的变量,表达式)

int [] arrays = {1,2,3,4,5,6,7,8,9,10};
for(int i : arrays){
    System.out.println(arrays);
}

while循环语句

while(条件表达式)

int number = 1;
while(number <= 100){
    System.out.println(number);
    number ++;
}

do...while循环语句

do{先把语句执行一遍}while(条件表达式);

boolean flag = true;
do{
    System.out.println("先执行一遍");
    flag = false;
}while(flag);




break和continue关键字

break关键字

结束循环的意思;

for(int i = 1; i <= 100; i++){
    if(i == 10){
        System.out.println("打印10后结束循环");
        break;
    }
}

continue关键字

跳过当前循环,进入下一次循环;

for(int i = 1 ; i <= 10; i ++){
    if(i % 2 == 1){
        continue;
    }
    System.out.println("打印:"+i);
}



方法

概述:

      方法就相当于使用多行代码进行组合去实现的一个功能片段,对代码进行封装利用,可实现多次调用;

方法的定义

修饰符 返回值 方法名称(形参 形参名称){方法体}

public class Function{
    
    public static void main(String[] arags){}
    
    public void method1(){}
    
    public void method2(String name,int age){}
    
    public static void method3(){}
    
    public int method03(){
        int a = 3;
        return a;
    }
    
    public int method04(int a,int b){
        if(a == b){
            System.out.println(a + "和" + b + "相等");
            return -1;
        }
        return a > b ? a : b;
    }
}

方法的重载

      方法的重载是指 方法名称相同,传递的参数类型不同,个数不同,顺序不同与返回值无关;这样的方法被称为方法的重载;

public class Function{
    public int max(int a,int b) { 
    	return a > b ? a : b;
    }
    
    public double max(double a,double b){
        return a > b ? a : b;
    }
}

形参和实参

      形参是指在()内部的参数,实参是指被真实传递的参数;

public class Function{
    public static vid main(String[] args){
        Function function = new Function();
        function.max(3,5);
    }
    
    public int max(int a,int b) { 
    	return a > b ? a : b;
    }
}

可变参数

      在方法的()中我们有时候不知道要传递多少参数,那么我们可以传递一个数据类型紧跟后面加上...来表示;但需要注意的是一个方法中指允许一个可变参,如果有其他类型的参数,那么可变参数需要写在最后面;可变参数本质上就是一个数组;

public class Function{
    public void method(String name,int... numbers){
        for(int num : numbers){
            System.out.println(num);
        }
    }
}



递归

      递归的本质就是自己调用自己,它可以解决一些业务,但效率和开销较大,对一些比较小的运算可以使用;

//递归求3的阶乘
public class Founction{
    public static void main(String[] args){
        
    }
    
    public int founction(int number){
        int result = 1;
        if(number == result){
            return result;
        }
        
        return number * founction(number - 1);
    }
}

递归求阶乘




数组

       数组就是一组数据的集合,Java中的数组必须存储和数据类型相符合的值,不允许与定义的数据类型不匹配;一旦数组被创建出来,它的长度就不允许被改变,数组有下标(索引)的概念,都是从0开始,如果操作的数据超过数组的长度那么就会报出下标索引越界异常[ IndexOutofBoundsException ];


数组的定义

int[] array = new int[3];
int array[] = new int[3];
int array[] = {1,2,3};

数组的内存模型图

数组内存图


数组的遍历方式

int[] arr = new int[10];
//方式一
for (int i = 0; i < arr.length ; i ++) {
    System.out.println(arr[i]);
}
//方式二
for (int num : arr) {
    System.out.println(num);
}

二维数组

int[][] arr = new int[3][2];
String[][] strArr = {{"hello","hello"},{"hi","hi","hi",{"java","java","java","java"}}

Arrays工具类

Arrays数组的工具类,是jdk已经帮我们提供好的一套数据工具类,方便我们对数据相关进行一些操作;

int[] arr = {3,51,1,33,82,22,55,53};
Arrays.toString(arr);//把数组变成一个字符串    
Arrays.sort(arr);//对数组内容进行升序排列
Arrays.fill(arr,0);//把数组的内容全部进行替换为0



常见算法


冒泡排序

public static int[] arr = new int[]{5, 2, 7, 4, 6, 9, 8, 13, 19, 11, 17, 15};

//冒泡排序算法
public static void popArithmetic(int[] arr) {
    //比较的轮数是数组长度-1
    for (int i = 0; i < arr.length - 1; i++) {
        //每次比较一轮,需要减少1次比较的次数
        for (int j = 0; j < arr.length - i - 1; j++) {
            //如果前面的数据比后面大,那么就交换位置
            if (arr[j] > arr[j + 1]) {
                int temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
    }
    System.out.println("最终结果是:" + Arrays.toString(arr));
}

选择排序

public static int[] arr = new int[]{5, 2, 7, 4, 6, 9, 8, 13, 19, 11, 17, 15};
//选择排序
public static void selectOrderArithmetic(int[] arr) {
    //比较的轮数是数组长度-1
    for (int i = 0; i < arr.length - 1; i++) {
        //每比较一次,需要减少1次比较的次数,会把小的先往前排
        for(int j = i+1;j<arr.length;j++){
            if(arr[i]>arr[j]){
                int temp = arr[i];
                arr[i] = arr[j];
                arr[j] = temp;
            }
        }
    }
    System.out.println("最终结果是:" + Arrays.toString(arr));
}

二分查找

public static int[] arr = new int[]{1, 2, 3 , 4, 6, 7, 8, 13, 19};
//2分查找法
public static void branchFind(int [] arr,int number){
    int startNode = 0;
    int endNode = arr.length-1;
    int middle = 0;
    while (startNode <= endNode){
        //中间的指针由开始节点和结束节点计算得来
        middle = (startNode+endNode)/2;
        if(number == arr[middle]){
            System.out.println("找到了");
            break;
        }else if(number < arr[middle]){
            endNode=middle-1;
            System.out.println(number+"小于中间值,结束节点变更为中间节点-1");
        }else if(number > arr[middle]){
            startNode = middle+1;
            System.out.println(number+"大于中间值,开始节点变更为中间节点+1");
        }else{
            System.out.println("没有找到该元素");
            break;
        }
    }
}



posted on 2021-04-08 21:19  JavaCat7  阅读(97)  评论(0)    收藏  举报