Java基础

229 阅读8分钟

B站刘意老师视频

[TOC]

计算机基础

计算机概述

  • 计算机
  • 计算机硬件
  • 计算机软件
    • 系统软件:windows,linux,mac
    • 应用软件:qq,yy
  • 软件开发
    • 软件:是由数据和指令组成
    • 开发:把软件做出来
    • 如何实现软件开发?
      • 使用开发工具和计算机语言做出东西
    • 语言
      • 自然语言
      • 计算机语言:人与计算机交流沟通的,c,c++,c#,java
    • 人机交互:
      • 图形界面:操作方便
      • Dos命令:需要记忆一些常见的命令

常见的Dos命令

  • 盘符的切换
    • d: 回车
  • 目录的进入
    • cd xxx
    • cd xx\yyy
  • 目录的回退
    • cd .. 退回到上一级
    • cd\ 退回到根目录
  • 清屏
    • cls
  • 退出
    • exit
  • 创建目录
    • md xx
  • 删除目录
    • rd xx (只能删空的)
  • 创建文件
  • 删除文件
    • del xxx
    • *.txt
  • 显示目录下的内容
    • dir xx
  • 删除带内容的目录
    • rd (/q) /s xxx

Java语言平台

  • JavaSE
  • JavaME---Android
  • JavaEE

JDK\JRE\JVM的作用及关系

  • 作用:
    • JVM(Java Virtual Machine):保证Java语言跨平台
    • JRE(Java Runtime Environment):Java语言的运行环境
    • JDK(Java Development Kit):Java语言的开发环境
  • 关系:
    • JDK:JRE + Java开发工具(javac.exe 编译;jar.exe 打包)
    • JRE:JVM + 类库
    • 总结:使用JDK开发工具,交给JRE运行,由JVM保证跨平台

Java关键字

注意事项:全部小写

Java标识符

概述

给类、接口、方法、变量等起名字时的字符序列。 组成规则:

  • 英文大小写
  • 数字字符
  • $或者_

注意事项:

  • 不能以数字开头
  • 不能是Java中的关键字
  • 区分大小写

类比于文件夹,用于把相同的类名进行区分,全部小写。 单级包:xxx 多级包:yy.xx(反写

类或接口

一个单词:首字母大写 多个单词:每个单词首字母大写

方法或变量

一个单词:首字母小写 多个单词:从第二个开始,每个单词首字母大写

常量

一个单词:全部大写 多个单词:全部大写,单词间用_隔开

注释

作用:

  • 提高代码阅读性
  • 帮助调试

三种类型:

  • 单行注释://注释文字
  • 多行注释:/* 注释文字 * /
  • 文档注释:/** 注释文字 * /

代码开头一般需要注释说明:需求+分析+实现

常量

分类:

  1. 字面值常量
    • 字符串常量,双引号,例如“Hello”
    • 整数常量,所有整数,例如 999
    • 小数常量,所有小数,例如 3.1415
    • 字符常量,单引号,例如 ‘a’,'0',错误示例:‘ab’
    • 布尔常量,两个,true,false
    • 空常量,一个,null
  2. 自定义常量
    • final关键字定义

进制

System.out.println(100); //默认十进制
System.out.println(0b100); //0b开头,二进制
System.out.println(0100); //0开头,八进制
System.out.println(0x100); //0x开头,十六进制

进制之间的转换:

  1. 其他进制转换成十进制
  2. 十进制转换成其他进制:取余
  3. 快速转换
    • 十进制二进制:8421
    • 二进制与八进制/十六进制:拆解
  4. 任意进制之间的转换:以十进制为桥梁

原码反码补码

数据在计算机中以二进制补码形式存储 分为符号位和数值位 正数三者相同 负数:

  • 反码 = 符号位不变,数值位取反
  • 补码 = 反码 + 1

变量

格式:数据类型 变量名 = 初始化值;(未初始化值的变量不能使用,在使用前赋值即可,建议在定义时赋值 数据类型的分类:

  1. 基本数据类型(四类八种)
数据类型占用字节数数值范围
整数byte1-128~+127
short2-2^15~+2^15-1
int4-2^31~+2^31-1
long8-2^63~+2^63-1
浮点数float4-3.403E38~3.403E38
double8-1.798E308~+1.798E308
字符char2
布尔boolean10 1
整数默认int类型,小数默认double类型
Q:float数据类型:数据在内存中是如何存储的???????????????????
long j = 10000000000L; //长整型后缀用L或者l标记,建议使用l(未超出int范围可不加,最好加
float f = 3.14F; //单精度后缀加F或f, 建议F

强制类型转换

目标数据类型 变量名 = (目标数据类型)(被转换的数据);

int a =3;
byte b = 9;
byte c = (byte) (a+b)
float f1 = (float) 12.345;
float f2 = 12.345F;  //更好一些,本身就是float类型
/*
一道面试题
byte b1 = 3, b2 = 4, b;
b = b1 + b2;
b = 3 + 4;
Q: 哪一句会编译失败???
A: b = b1 + b2; 
因为变量相加,首先会看类型,最终把结果赋值也考虑类型。
常量相加,先做加法,看结果是否在赋值变量的数据类型的范围内,如果不是,才报错。
*/
Q: byte b = (byte) 130; //会输出什么??
A: 分析:1.先得到130的补码。2.截取byte3. 已知补码求原码
    -126

默认转换:

  • byte/short/char --- int --- long --- -float ----double
  • byte/short/char之间不互相转化,参与运算前先转换为int
System.out.println("hello" + 'a' + 1);   //helloa1
System.out.println( 'a' + 1 + "hello" ); //98hello
System.out.println( "5+5=" +5 + 5 ); //5+5=55
System.out.println( 5 + 5  + "=5+5"  ); //10=5+5

运算符的使用

++ / --

  • 放在操作数前面,先自增/自减,再参与运算
  • 放在操作数后面,先参与运算,再自增/自减
int x = 4;
int y = (x++) + (++x) + (x*10)
//参与运算的值:4,6,60 
//x的值:             5,6,6

赋值运算符 =

// 有问题
short s = 1;
s = s + 1;
// 无
short s = 1;
s += 1;  //扩展的赋值运算符隐含了一个强制类型转换,等价于 s = (s的数据类型)(s+1);

逻辑运算符

逻辑运算符连接布尔类型表达式:3<x<6(错误) x>3&x<6 异或:情侣关系,两次异或等于原值。 &&具有短路效果 逻辑运算符和位运算符:& | ^ 当两边是布尔值,逻辑运算;数值,位运算。

/*
需求:两个数值交换
*/

// 实现1:两次异或
a = a ^ b;
b = a ^ b;
a = a ^ b ;

// 实现2: 变量相加
a  = a + b;
b = a  - b;
a  = a - b;

// 一句话搞定
 b = (a + b) - (a = b );

三目运算符

格式:比较表达式?表达式1:表达式2;

/*
需求:获取三个数中的较大值
*/

// 实现1:分两步
int temp = (a > b)? a : b;
int max = (temp > c)? temp : c;

//实现2:一步到位
int max = (a > b)?  ((a > c)? a : c) : ((b > c)? b : c);

三目运算符和if语句的关系:三目运算符是个运算符,必须要有一个结果返回,不能是一个输出语句。 测试数据:正确数据,错误数据,边界数据。

switch语句

switch(表达式):表达式的取值是有限定的,byte/short/int/char JDK5之后可以是枚举,JDK7以后可以是字符串。 格式:

switch(表达式){                             
    case1:                                       
        语句体1;                                        
        break;                                 
    case2:                                       
        语句体2;                                        
        break;                                  
        ...                                
    default:                                            
        语句体n+1;                                            
        break;          
}
/*
跳出循环的条件:
- 遇到break
- 执行到末尾;
*/

int x = 2;
int y = 3;
// 代码段1
switch(x) {
    default:
        y++;
        break;
    case 3:
        y++;
    case 4:
        y++;
}
System.out.println("y = " + y);   //在default中++ 然后跳出循环,输出4
//代码段2
switch(x) {
    default:
        y++;.
        
    case 3:
        y++;
    case 4:
        y++;
}
System.out.println("y = " + y); //都走一遍,输出6

if语句和switch语句的区别:

  • if语句 -- 针对结果是boolean类型的判断 -- 针对一个范围的判断 -- 针对几个常量值的判断
  • switch语句 -- 针对几个常量值的判断

break跳出单层和多层循环 return  结束方法

方法(函数)

格式: 修饰符 返回值类型 方法名(参数类型 参数名,参数类型 参数名,……){ 方法体; return 返回值; } 注意事项:

  • 方法不调用不执行
  • 方法之间是平级关系,不能嵌套定义
  • 参数之间用逗号隔开,参数传递时,不传递类型
  • 如果有明确的返回值,一定要传值回去

方法重载

在同一个类中,方法名相同,参数列表(参数个数或参数类型)不同,(与返回值类型无关

/*
方法重载实例
*/

public static void main(String[] args){
        short s1 = 2;
        short s2 = 3;
        byte b1 = 5;
        byte b2 = 6;
        System.out.println(compare(1,2));
        System.out.println(compare(s1,s2));
        System.out.println(compare(b1,b2));
        System.out.println(compare(1999L,1999L));
    }
    //int类型数据
    public static boolean compare(int a,int b){
        System.out.println("int");
        return a==b;
    }
    //short类型数据
    public static boolean compare(short a,short b){
        System.out.println("short");
        return a==b;
    }
    //long类型数据
    public static boolean compare(long a,long b){
        System.out.println("long");
        return a==b;
    }
    //byte类型数据
    public static boolean compare(byte a,byte b){
        System.out.println("byte");
        return a==b;
    }

数组

存储同一种数据类型的多个元素的集合(容器)。 定义格式:

  • 数据类型[] 数组名;
  • 数据类型 数组名[];

初始化:

  1. 必须先初始化才能使用。
  2. 初始化:分配空间并赋值
    • 动态初始化:只指定长度,系统自动赋值。 -- 数据类型[] 数组名 = new 数据类型[数组长度]; int[] arra = new int[100];
    • 静态初始化:赋值,系统自动计算长度 -- 数据类型[] 变量名 = new 数据类型[]{元素1,元素2,……};int[] arr1 = new int[]{1,2,3,4,5}; -- 简化格式:数据类型[] 变量名 = {1,2,3,4.5};

内存分配:5大部分

名称作用
存放局部变量
存放所有new出来的东西
方法区(面向对象部分)
本地方法区和系统相关
寄存器CPU使用

栈内存的数据用完就释放掉 堆内存的特点:

  • 每个new出来的东西都有地址值
  • 每个变量都有默认值 -- byte/short/int/long 0 -- float/double 0.0 -- char '\u0000' -- boolean false -- 引用类型 null
  • 使用完毕就变成了垃圾,但不会立即回收,在垃圾回收器空闲时回收
/*
两个栈变量指向同一个内存
*/
int[] arr = {1,2,3};
int [] arr2 = arr;
arr2[0] = 66;
arr2[1] = 88;

二维数组

格式:

/*
格式
*/
/*
- 数据类型[][] 数组名 = new 数据类型[m][n];
  数据类型 数组名[][] = new 数据类型[m][n];
  数据类型[] 数组名[] = new 数据类型[m][n];
  
-  数据类型[][] 数组名 = new 数据类型[m][];  arr[0] = new int[4]; arr[0][0] = 12;
    //允许二维数组中的一维数组元素个数不同:

- 数据类型[][] 数组名 = new 数据类型[][]{{1,2,3},{3,2,1},……} ; 
  简化版: 数据类型[][] 数组名 = {{1,2,3},{3,2,1},……}
  */
  
  int[] x,y[]; //int 类型的一维数组x和二维数组y

/*
配合下图一起食用
*/

public static void main(String[] args){
        int[][] arr = new int[3][];
        System.out.println(arr);
        System.out.println(arr[0]);
        System.out.println(arr[1]);
        System.out.println(arr[2]);
        
        arr[0] = new int[2];
        arr[1] = new int[3];
        arr[2] = new int[1];
        System.out.println(arr[0]);
        System.out.println(arr[1]);
        System.out.println(arr[2]);
        
        arr[1][0] = 100;
        arr[1][2] = 200;
        System.out.println(arr[2][0]);
        System.out.println(arr[2][1]);
    }

p152

基本类型传递数值,引用类型传递地址值。