Java基础知识学习笔记

JAVA入门

java特性和优势

  1. 简单性
  2. 面向对象
  3. 可移植性
  4. 高性能
  5. 分布式
  6. 动态性
  7. 多线程
  8. 安全性
  9. 健壮性

java三大版本

  1. JavaSE:标准版(桌面程序,控制台开发等)
  2. JavaME:嵌入式开发(手机、小家电等)
  3. JavaEE:企业级开发(web端,服务器开发等)

JDK、JRE、JVM

  • JDK: Java Development Kit (java开发者工具)
  • JRE: Java Runtime Environment (java运行时环境)
  • JVM: Java Virtual Machine (java虚拟机)

安装开发环境

卸载JDK

  1. 删除jdk的安装目录
  2. 删除环境变量立的JAVA_HOME
  3. 删除path下关于java 的目录
  4. cmd中测试是否删除成功:java -version

安装JDK

  1. 网上搜索下载JDK8

  2. 安装JDK

  3. 记住安装路径

  4. 配置环境变量

    • JAVA_HOME设为jdk的安装路径
    • 新增path的变量:%JAVA_HOME%\bin和%JAVA_HOME%\jre\bin
  5. 测试JDK是否安装成功:cmd中java -version

Hello World

  1. 新建Hello.java文件

    public class Hello{
    	public static void main (String [] args) {
    		System.out.print("Hello World!");
    	}
    }
    
  2. 在cmd中切换到上面文件的目录下,执行编译:javac Hello.java

  3. 该文件目录下会自动生成可执行的文件Hello.class

  4. 执行该文件:java Hello

注意

  • Java是大小写敏感的
  • 文件名和类名必须保持一致,并且首字母大写

原理

  1. javac是调用的java的编译器,将代码编译成.class文件
  2. java执行.class文件相当于一个解释器去执行,使用的JVM
  3. 这也是java能够跨平台执行的关键
  4. java既有编译型的特点又有解释型的特点

JAVA基础

注释

java的注释有三种:

  1. 单行注释

    //这是一行注释
    
  2. 多行注释

    /*
    这是一个多行注释
    */
    
  3. 文档注释

    /**
    *@Author bGpi
    */
    

    参数信息

    • @author 作者名
    • @version 版本号
    • @since 指明需要最早使用的jdk版本
    • @param 参数名
    • @return 返回值情况
    • @throws 异常抛出情况

标识符

  • 关键字

    关键字 含义
    abstract 表明类或者成员方法具有抽象属性
    assert 断言,用来进行程序调试
    boolean 基本数据类型之一,声明布尔类型的关键字
    break 提前跳出一个块
    byte 基本数据类型之一,字节类型
    case 用在switch语句之中,表示其中的一个分支
    catch 用在异常处理中,用来捕捉异常
    char 基本数据类型之一,字符类型
    class 声明一个类
    const 保留关键字,没有具体含义
    continue 回到一个块的开始处
    default 默认,例如,用在switch语句中,表明一个默认的分支。Java8 中也作用于声明接口函数的默认实现
    do 用在do-while循环结构中
    double 基本数据类型之一,双精度浮点数类型
    else 用在条件语句中,表明当条件不成立时的分支
    enum 枚举
    extends 表明一个类型是另一个类型的子类型。对于类,可以是另一个类或者抽象类;对于接口,可以是另一个接口
    final 用来说明最终属性,表明一个类不能派生出子类,或者成员方法不能被覆盖,或者成员域的值不能被改变,用来定义常量
    finally 用于处理异常情况,用来声明一个基本肯定会被执行到的语句块
    float 基本数据类型之一,单精度浮点数类型
    for 一种循环结构的引导词
    goto 保留关键字,没有具体含义
    if 条件语句的引导词
    implements 表明一个类实现了给定的接口
    import 表明要访问指定的类或包
    instanceof 用来测试一个对象是否是指定类型的实例对象
    int 基本数据类型之一,整数类型
    interface 接口
    long 基本数据类型之一,长整数类型
    native 用来声明一个方法是由与计算机相关的语言(如C/C++/FORTRAN语言)实现的
    new 用来创建新实例对象
    package
    private 一种访问控制方式:私用模式
    protected 一种访问控制方式:保护模式
    public 一种访问控制方式:共用模式
    return 从成员方法中返回数据
    short 基本数据类型之一,短整数类型
    static 表明具有静态属性
    strictfp 用来声明FP_strict(单精度或双精度浮点数)表达式遵循[IEEE 754](https://baike.baidu.com/item/IEEE 754)算术规范
    super 表明当前对象的父类型的引用或者父类型的构造方法
    switch 分支语句结构的引导词
    synchronized 表明一段代码需要同步执行
    this 指向当前实例对象的引用
    throw 抛出一个异常
    throws 声明在当前定义的成员方法中所有需要抛出的异常
    transient 声明不用序列化的成员域
    try 尝试一个可能抛出异常的程序块
    void 声明当前成员方法没有返回值
    volatile 表明两个或者多个变量必须同步地发生变化
    while 用在循环结构中
  • java所有的组成部分都需要名字。类名、变量名以及方法名都被称为标识符

表示符注意点

  1. 所有的标识符都应该以字母(A-Z或者a-z)、美元符($)或者下划线(_)开始
  2. 首字母之后可以是字母、美元符、下划线或数字的任何字符组合
  3. 不能使用关键字作为变量名或方法名
  4. 标识符是大小写敏感

数据类型

  • Java是一种强类型语言

    要求变量的使用要严格符合规定,所有变量都必须先定义后才能使用

  • Java的数据类型分为两类

    1. 基本类型

      • 数值类型

        • 整数类型

          1. byte占1个字节范围:-128~127
          2. short占2个字节范围:-32768~32767
          3. int占4个字节范围:-21474832147483647
          4. long占8个字节范围
        • 浮点类型

          1. float占4个字节
          2. double占8个字节
        • 字符类型

          char占2个字节

      • boolean类型

        占1位,其值只有true和false

    2. 引用类型

      1. 接口
      2. 数组

什么是字节

  • 位(bit):是计算机内部数据存储的最小单位,11001100是一个8位二进制数
  • 字节(byte):是计算机数据处理的基本单位,习惯上用大写B来表示
  • 1B=8bit
  • 字符:是指计算机中使用的字母、数字、字和符号
  • 进制

    • 二进制(0b开头)
    • 十进制
    • 八进制(0开头)
    • 十六进制(0x开头)
  • 常见转义字符

    转义字符 意义 ASCII码值(十进制)
    \b 退格(BS) ,将当前位置移到前一列 008
    \f 换页(FF),将当前位置移到下页开头 012
    \n 换行(LF) ,将当前位置移到下一行开头 010
    \r 回车(CR) ,将当前位置移到本行开头 013
    \t 水平制表(HT) (跳到下一个TAB位置) 009
    \v 垂直制表(VT) 011
    \ 代表一个反斜线字符''' 092
    ' 代表一个单引号(撇号)字符 039
    " 代表一个双引号字符 034
    \0 空字符(NULL) 000
    \ddd 1到3位八进制数所代表的任意字符 三位八进制
    \uhhhh 1到2位十六进制所代表的任意字符 二位十六进制

类型转换

容量从低到高的类型顺序为

byte,short,char => int =>long => float => double

注意点

  • 不能对布尔值进行转换
  • 在把高容量转换到低容量的时候,需要强制转换
  • 不能把对象类型转换为不相关的类型
  • 转换的时候可能内存溢出,或者精度误差
  • 操作比较大的数的时候,注意溢出问题
  • JDK7新特性,数字之间可以用下划线分割,如1000000 = 100_0000

变量

  • 变量就是可以变的量

  • 每个变量都必须声明其类型

  • java变量是程序中最基本的存储单元,其要素包括**变量名、变量类型和作用域*

  • 变量作用域

    • 类变量

    • 实例变量

    • 局部变量

      public class Variable {
          static int allClicks = 0;    //类变量
          String str = "hello world";  //实例变量
          
          public void method () {
              int i = 0;  //局部变量
          }
      }
      
  • 变量的命名规范

    • 所有的变量、方法、类名,需见名知意
    • 类成员变量:首字母小写和驼峰原则
    • 局部变量:首字母小写和驼峰原则
    • 常量:大写字母和下划线
    • 类名:首字母大写和驼峰原则
    • 方法名:首字母小写和驼峰原则

运算符

算术运算符

操作符 描述
+ 加法 - 相加运算符两侧的值
- 减法 - 左操作数减去右操作数
* 乘法 - 相乘操作符两侧的值
/ 除法 - 左操作数除以右操作数
取余 - 左操作数除以右操作数的余数
++ 自增: 操作数的值增加1
-- 自减: 操作数的值减少1

注意

  • 前缀自增自减法(++a,--a): 先进行自增或者自减运算,再进行表达式运算
  • 后缀自增自减法(a++,a--): 先进行表达式运算,再进行自增或者自减运算

关系运算符

运算符 描述
== 检查如果两个操作数的值是否相等,如果相等则条件为真。
!= 检查如果两个操作数的值是否相等,如果值不相等则条件为真。
> 检查左操作数的值是否大于右操作数的值,如果是那么条件为真。
< 检查左操作数的值是否小于右操作数的值,如果是那么条件为真。
>= 检查左操作数的值是否大于或等于右操作数的值,如果是那么条件为真。
<= 检查左操作数的值是否小于或等于右操作数的值,如果是那么条件为真。

位运算符

操作符 描述 例子
如果相对应位都是1,则结果为1,否则为0 (A&B),得到12,即0000 1100
| 如果相对应位都是 0,则结果为 0,否则为 1 (A | B)得到61,即 0011 1101
^ 如果相对应位值相同,则结果为0,否则为1 (A ^ B)得到49,即 0011 0001
按位取反运算符翻转操作数的每一位,即0变成1,1变成0。 (〜A)得到-61,即1100 0011
<< 按位左移运算符。左操作数按位左移右操作数指定的位数。 A << 2得到240,即 1111 0000
>> 按位右移运算符。左操作数按位右移右操作数指定的位数。 A >> 2得到15即 1111
>>> 按位右移补零操作符。左操作数的值按右操作数指定的位数右移,移动得到的空位以零填充。 A>>>2得到15即0000 1111

逻辑运算符

操作符 描述 例子
&& 称为逻辑与运算符。当且仅当两个操作数都为真,条件才为真。 (A && B)为假。
| | 称为逻辑或操作符。如果任何两个操作数任何一个为真,条件为真。 (A || B)为真。
称为逻辑非运算符。用来反转操作数的逻辑状态。如果条件为true,则逻辑非运算符将得到false。 !(A && B)为真。

赋值运算符

操作符 描述 例子
= 简单的赋值运算符,将右操作数的值赋给左侧操作数 C = A + B将把A + B得到的值赋给C
+ = 加和赋值操作符,它把左操作数和右操作数相加赋值给左操作数 C + = A等价于C = C + A
- = 减和赋值操作符,它把左操作数和右操作数相减赋值给左操作数 C - = A等价于C = C - A
* = 乘和赋值操作符,它把左操作数和右操作数相乘赋值给左操作数 C * = A等价于C = C * A
/ = 除和赋值操作符,它把左操作数和右操作数相除赋值给左操作数 C / = A,C 与 A 同类型时等价于 C = C / A
(%)= 取模和赋值操作符,它把左操作数和右操作数取模后赋值给左操作数 C%= A等价于C = C%A
<< = 左移位赋值运算符 C << = 2等价于C = C << 2
>> = 右移位赋值运算符 C >> = 2等价于C = C >> 2
&= 按位与赋值运算符 C&= 2等价于C = C&2
^ = 按位异或赋值操作符 C ^ = 2等价于C = C ^ 2
| = 按位或赋值操作符 C | = 2等价于C = C | 2

条件运算符(?:)

variable x = (expression) ? value if true : value if false

instanceof 运算符

该运算符用于操作对象实例,检查该对象是否是一个特定类型(类类型或接口类型)。

instanceof运算符使用格式如下:

( Object reference variable ) instanceof  (class/interface type)

Java运算符优先级

类别 操作符 关联性
后缀 () [] . (点操作符) 左到右
一元 expr++ expr-- 从左到右
一元 ++expr --expr + - ~ ! 从右到左
乘性 * /% 左到右
加性 + - 左到右
移位 >> >>> << 左到右
关系 > >= < <= 左到右
相等 == != 左到右
按位与 左到右
按位异或 ^ 左到右
按位或 | 左到右
逻辑与 && 左到右
逻辑或 | | 左到右
条件 ?: 从右到左
赋值 = + = - = * = / =%= >> = << =&= ^ = | = 从右到左
逗号 左到右

包机制

  • 为了更好地组织类,Java提供了包机制,用于区别类名的命名空间

  • 包语句的语法格式为:

    package pkg1[.pkg2[,pkg3...]]
    
  • 一般利用公司域名倒置作为包名

Java流程控制

Scanner对象

  • 我们可以通过Scanner类来获取用户的输入

  • 基本语法

    Scanner s = new Scanner(System.in);
    
  • 通过Scanner类的next()与nextLine()方法获取输入的字符串,在读取前一般需要使用hasNext()与hasNextLine()判断是否还有数据

while循环和do-while循环

区别

  • while是先判断后执行,do-while是先执行后判断
  • do-while总是保证循环体会被至少执行一次

增强for循环

  • 主要用于数组或集合的增强型for循环

  • 表达式如下

    for (声明语句 : 表达式) {
    	//code
    }
    
    //例子
    int [] numbers = {1, 2, 3, 4};
    for (int x:numbers) {
        System.out.print(x);
    }
    

Java的方法

方法的重载

  • 重载就是在一个类中,有相同的函数名称,但是形参不同的函数
  • 方法的重载规则:
    • 方法名必须相同
    • 参数列表必须不同(个数不同或类型不同或参数排列顺序不同)
    • 方法的返回类型可以相同也可以不同
    • 仅仅返回类型不同不足以成为方法的重载

可变参数

  • JDK 1.5开始,Java支持传递同类型的可变参数给一个方法

  • 在方法声明中,在指定参数类型后加一个省略号(...)

  • 一个方法只能指定一个可变参数,它必须是方法的最后一个参数。任何普通的参数必须在它之前声明

    public static void fun(int...numbers){}
    

Java的数组

数组的声明和创建

  • 首先必须声明数据变量,才能在程序中使用数组。下面是声明数组变量的语法:

    dataType[] arrayName;     //首选的方法
    //or
    dataType arrayName[];     //效果相同,推荐上面
    
  • Java使用new操作符来创建数组,语法如下

    dataType[] arrayName = new dataType[arraySize]
    
  • 获取数组长度: arrayName.length

内存分析

  • 存放new的对象和数组
  • 可以被所有的线程共享,不会存放别的对象引用

  • 存放基本变量类型(包含这个基本类型的具体数值)
  • 引用对象的变量(存放这个引用在堆里面的具体地址)

静态区

  • 可以被所有的线程共享
  • 包含了所有的class和static变量

三种初始化

  • 静态初始化

    int[] a = {1, 2, 3};
    
  • 动态初始化

    int [] a = new int[2];
    a[0] = 1;
    a[1] = 2;
    
  • 数组的默认初始化

    数组是引用类型,它的元素相当于类的实例变量,因此数组一经分配空间,其中的每个元素也被按照实例变量同样的方式被隐式初始化。

面向对象

认识面向对象

  • 面向对象的本质就是:以类的方式组织代码,以对象的方式组织(封装)数据

  • 抽象

  • 三大特性

    • 封装
    • 继承
    • 多态
  • 认识论角度考虑是:先有对象后有类。对象,是具体的事物。类,是抽象的,是对对象的抽象

  • 代码运行角度考虑是:先有类后有对象。类是对象的模板

方法的调用

  • 静态方法和非静态方法

    静态方法是和类一起加载的,非静态方法是需要对象new出来之后才加载。因此不能直接调用一个类中的非静态方法,但可直接调用静态方法

    静态方法前面使用static修饰

  • 值传递&引用传递

构造器

  • 和类名相同

  • 没有返回值

  • 作用

    • new 的本质是在调用构造方法
    • 初始化对象的值
  • 注意点

    定义有参构造之后,如果想要使用无参构造,需要显示的定义一个无参的构造。

    Alt+Insert可快速创建构造函数

    this 表示当前类

封装

继承

extends

  • 子类继承了父类,就会拥有父类的全部方法(私有的无法被继承)。

Super

  • super调用父类的构造方法,显示调用时必须在构造方法的第一行
  • super必须只能出现在子类的方法或者构造方法中
  • super和this不能同时调用构造方法
  • 和this的区别
    • 代表的对象不同
      • this:本身调用者这个对象
      • super:代表父类对象的引用
    • 使用前提不同
      • this:没有继承也可以使用
      • super:只能在继承条件下才能使用
    • 构造方法不同
      • this():本类的构造
      • super():父类的构造

重写 Override

需要有继承关系,子类重新父类的方法

注意:

  1. 方法名必须相同
  2. 参数列表必须相同
  3. 修饰符:访问可以扩大但不能缩小。public>protected>default>private
  4. 抛出的异常:范围可以被缩小,但不能扩大。
  5. 不能重写的方法:static、final、private

多态

  • 同一个方法可以根据发送对象的不同而采用多种不同的行为方式

  • 一个对象的实际类型时确定的,但可以指向对象的引用的类型有很多(父类、有关系的类)

  • 多态存在的条件

    1. 有继承关系
    2. 子类重写父类方法
    3. 父类引用指向子类对象
  • 注意:多态时方法的多态,属性没有多态

  • 子类重写了父类的方法,则执行子类的方法

Static

  • 对象中静态代码块是在对象第一次构造时执行,且是第一个执行

    public class className {
        {
            System.out.println("匿名代码块");  //第2个执行   一般可赋初始值
        }
        static {
            System.out.println("静态代码块");  //第1个执行,且只执行一次,再new时不执行
        }
        public className () {
            System.out.println("构造方法");    //第3个执行
        }
    }
    

抽象类 abstract

  • 不能new抽象类,只能靠子类去实现它
  • 抽象类中可以写普通方法
  • 抽象方法必须写在抽象类中

接口 interface

  • 区别

    • 普通类:只能具体实现
    • 抽象类:具体实现和规范(抽象方法)都有
    • 接口:只有规范!自己无法写方法。专业的约束。约束和实现分离:面向接口编程。
  • 接口时OO的精髓,是对对象的抽象,最能体现这一点的就是接口

  • 作用

    1. 是一种约束
    2. 可以定义一些方法,让不同的人实现
    3. 所有的方法都是public abstract
    4. 所有的变量都是public static final
    5. 接口不能被实例化,接口中没有构造方法
    6. implements可以实现多个接口
    7. 必须要重写接口中的方法

异常

  • try、catch、finally可以进行异常的捕获和处理

  • throw可在程序类抛出异常,throws则是在方法上抛出异常,让外层去捕获处理

  • 异常类的结构

    异常类结构图

    异常类型 说明
    Exception 异常层次结构的根类
    RuntimeException 运行时异常,多数 java.lang 异常的根类
    ArithmeticException 算术谱误异常,如以零做除数
    ArraylndexOutOfBoundException 数组大小小于或大于实际的数组大小
    NullPointerException 尝试访问 null 对象成员,空指针异常
    ClassNotFoundException 不能加载所需的类
    NumberF ormatException 数字转化格式异常,比如字符串到 float 型数字的转换无效
    IOException I/O 异常的根类
    F ileN otF oundException 找不到文件
    EOFException 文件结束
    InterruptedException 线程中断
    IllegalArgumentException 方法接收到非法参数
    ClassCastException 类型转换异常
    SQLException 操作数据库异常
  • 经验总结

    1. 处理运行时异常时,采用逻辑去合理规避,同时辅助try-catch处理
    2. 在多重catch块后面,可以加一个catch(Exception)来处理可能会被遗漏的异常
    3. 对于不确定的代码,也可以加上try-catch,处理潜在的异常
    4. 尽量去处理异常,切忌只是简单地调用printStackTrace()去打印输出
    5. 具体如何处理异常,要根据不同的业务需求和异常类型去决定
    6. 尽量添加finally语句块去释放占用的资源。
posted @ 2021-02-15 20:10  bGpi  阅读(72)  评论(0编辑  收藏  举报