Java从0到1---基础篇

0 阅读11分钟

Java 基础

java相关基础概念

  • JDK : java Development Kit ---Java 开发工具包
  • JRE : java Runtime Environment---Java 运行环境
  • 只运行java项目,则只需要安装JRE,若要开发java项目,则需要安装JDK(其中包含 JRE)
  • Java 的运行原理: Java 不是一门解释型语言,java需要先编译成字节码文件,再通过JVM(java虚拟机)对字节码文件进行进一步解析,生成机器码,底层的操作系统才能识别机器码进行程序的运行。
  • 其中,字节码文件可以放在不同的操作系统当中,通过JVM来编译成对应的操作系统的机器码来执行。(一次编译,到处运行----java 跨平台特性的来源) 在这里插入图片描述

java源代码文件编译成字节码文件的命令: javac xxx.java

java 字节码文件(xxx就是字节码文件名,无后缀)运行的命令: java xxx

变量

变量 解决了 数据存储在存储空间中,其对应的存储地址不好记 的问题,相当于给存储地址取了个别名,通过变量就可以直接取数。

基本数据类型

基本数据类型分为:

  • 数值类型: byte,short,int,long,float,double
  • 非数值类型: char,boolean

基本类型所占空间:

  • byte --- 1 字节
  • short --- 2字节
  • int --- 4字节
  • long ---8字节(32位)
  • float --- 4字节
  • double --- 8字节(8位)
  • char --- 2字节
  • boolean --- 1bit(1位)

类型转换:

  • 自动转换: 根据基本数据类型所占空间大小,由小到大可以自动进行转换(long转换成float为特例) 在这里插入图片描述
  • 强制转换: 在这里插入图片描述 在这里插入图片描述

除了基本类型的转换外,还有引用类型即面向对象)的转换: 引用类型 的转换都是基于 类的继承 ,子类可以自动转换成父类,而父类可以强制转换成子类在这里插入图片描述

Java中的所有实例化对象都是引用类型,即其值存储在堆当中,而变量在栈当中,其上面存放的是指向对象值的地址。 基本类型的变量在栈当中,其上面存放的是具体的值。

运算符

  • 逻辑运算符:只能用于boolean类型的数据运算,判断boolean数据之间的逻辑关系,包括与(&&,&),或(||,|),非(!),(&& 短路与 和 ||短路或,先算一边表达式,满足条件就不用算另一边了,效率比普通版的高)
  • 位运算符: 对表达式以二进制为单位进行运算,将数据全部转换成二进制再运算,包括 &(按位与),|(按位或),^(按位异或),<<(左移),>>(右移)
  • 算术运算符: +(加),-(减),*(乘),/(除),%(取余)
  • 优先级: 位运算符> 逻辑运算符 > 算术运算符

流程控制

  • switch

在这里插入图片描述

  • if-else if-else:

在这里插入图片描述

  • for循环: 在这里插入图片描述
  • while循环: 在这里插入图片描述
  • do-while循环: 在这里插入图片描述
  • foreach(针对集合的循环): 在这里插入图片描述
  • 循环终止: break 与 continue区别 在这里插入图片描述

数组

一维数组

在这里插入图片描述 如上图所示,定义了一个整形数组,直接打印数组名字array,得到了[I@1b6d3586 的结果, 其中[ 表示这是一个数组, I表示类型为int,@表示分割符,无实际意义,分割符后面一串,表示该数组的地址

数组本质上也是一个对象,凡是打印对象,都会默认调用 对象名.toString()方法,其默认输出格式为: 对象类型@对象地址 Java中所有的类都有一个共同的父类---Object类,其中.toString()方法就来自于此,而Object类型的数组,其中的元素类型可以是任何类型,因为它们均继承Object类,这也是多态的特性体现: 在这里插入图片描述

关于数组的操作,我们可以直接调用java自带的工具类---Arrays类,该类的常用方法如下:

  • Arrays.sort(): 对数组进行排序,支持基本类型和对象数组。对于对象数组,可传入自定义比较器。

示例:

int[] numbers = {5, 2, 9};
Arrays.sort(numbers); // 排序后:[2, 5, 9]
  • Arrays.binarySearch() 在已排序(升序) 的数组中查找元素,返回索引。若未找到,返回负数。

示例:

int[] sorted = {2, 5, 9};
int index = Arrays.binarySearch(sorted, 5); // 返回1
  • Arrays.copyOf() 复制数组,可指定新长度。若长度大于原数组,多余部分填充默认值(一般为0)。

示例:

int[] original = {1, 2, 3};
int[] copied = Arrays.copyOf(original, 5); // 结果为[1, 2, 3, 0, 0]
  • Arrays.fill()

将数组的所有元素填充为指定值。

示例:

int[] arr = new int[3];
Arrays.fill(arr, 7); // 结果为[7, 7, 7]
  • Arrays.equals() 比较两个数组是否相等(长度和元素均相同)。

示例:

int[] a = {1, 2};
int[] b = {1, 2};
boolean isEqual = Arrays.equals(a, b); // 返回true
  • Arrays.toString()

将数组转换为字符串形式,便于打印调试。

示例:

String[] names = {"Alice", "Bob"};
System.out.println(Arrays.toString(names)); // 输出[Alice, Bob]

二维数组

二维数组就是一个特殊的一维数组,该数组中的每一个元素都是一个一维数组在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

Java面向对象

面向对象是一种编程思想,其将万事万物进行分类,找到事物的共性,进而来解释事物。

类和对象

是所有对象的抽象模板,对象的一个具体实例。

java中编写的代码都是类,类是静态资源,其一直存在,当程序开始运行时,JVMjava虚拟机)会加载类,从而产生对象,对象只在程序运行期间存在,当程序结束后,对象也就不存在了。

类中包含两个部分,来描述对象的特征:

  • 静态特征(属性): 颜色,名字,重量……
  • 动态特征(方法):吃饭,跑步,大笑……

在这里插入图片描述 是用来创建对象的,对象是通过构造函数来创建的,因此类中必须至少有一个构造函数,每个类都默认有一个无参构造函数构造函数本身不需要返回值的定义,其函数名必须与类名一致,可以有参数列表,如下图所示:

在这里插入图片描述

注意: 一旦类中声明一个有参构造函数,则默认的无参构造函数会被覆盖而导致无法调用创建对象。

this 关键字

this 用来指代当前类的实例化对象,通过this 可以调用类的属性和方法,在有参构造函数中,通过this将外部传来的值赋给当前类的实例化对象。 在这里插入图片描述 在这里插入图片描述

方法重载

方法重载是Java中代码复用的一种重要方式,指两个方法之间的一种关系,构成重载的条件如下:

  • 在同一个类中
  • 方法名相同,但参数列表不同(参个数,数据类型不同)
  • 与返回值和访问权限无关 在这里插入图片描述

成员变量和局部变量

在这里插入图片描述

封装

为了保证数据的安全,因此有了封装,将类的信息全部封装到内部,外部无法直接访问,确保数据安全。

  • 将属性私有化(private)
  • 通过间接的方式来访问内部的私有属性 在这里插入图片描述

static 关键字

static 表示静态或全局,可以用来修饰成员变量成员方法 以及 代码块。 一般的成员变量成员方法,必须通过对象来访问,必须依赖于对象,但是static 修饰的 成员变量成员方法 独立于该类的任何一个实例化对象,访问时不依赖于任何一个对象,可以直接通过类来进行访问。 在这里插入图片描述 在这里插入图片描述

注意: 使用static 修饰的静态方法,不能使用this关键字,不能直接访问类的实例变量和实例方法,可以访问类的静态变量和静态方法,如果要访问类的实例变量和实例方法,必须先实例化该类的对象。

在这里插入图片描述 代码块执行多少次,取决于创建了多少对象,程序创建对象的时候执行,创建一个就执行一次,先加载类,再创建对象,调用构造函数前,先执行代码块在这里插入图片描述

继承

继承是Java代码复用的重要特征,子类可以直接继承父类全部非私有信息(属性,方法),创建子类对象时,Java程序会默认优先创建父类对象。

子类访问父类

创建子类对象时,无论使用有参还是无参,都会默认使用无参创建父类对象,子类通过extends关键字来继承父类,其中super关键字指代父类,super()指调用父类构造方法。 在这里插入图片描述

类访问权限

类的访问权限修饰 共有4种: 在这里插入图片描述

方法重写

子类在继承父类方法的基础上,对父类方法进行重新定义并覆盖的操作,就叫方法重写

方法重写规则:

  • 父子类方法名相同
  • 父子类参数列表相同
  • 子类方法的返回值与父类方法的返回值相同,或者是父类返回值的子类
  • 子类的访问权限不能小于父类 在这里插入图片描述

多态

多态是指同一个事物有多种表现形态,Java中的多态是指定义一个类,该类的实例化对象在不同的业务场景中,根据不同的需求呈现出不同的业务逻辑。

多态的使用

多态的使用:

  1. 定义方法时,形参为父类,调用方法时,传入的参数为子类对象

  2. 定义方法时,返回值的数据类型为父类,调用方法时返回子类对象

抽象

在实际开发过程中存在以下一种场景: 父类方法由子类继承并重写,而业务逻辑中始终调用子类方法,不调用父类方法,此时父类方法的内部实现就成了多余。

针对以上这种场景,抽象方法应运而生,通过abstract关键字,其只定义方法,不做具体实现,而抽象方法所在的类就叫抽象类在这里插入图片描述

注意: 抽象类不能被实例化,只能被继承,一旦某个类继承了抽象类,要么该类也需要被定义为抽象类,要么去重写从抽象父类那里继承来的抽象方法,让它有具体的实现。

一旦某个类中出现抽象方法,则该类必须被声明为抽象类,抽象类中可以包含非抽象方法。

接口

接口抽象类的升级版,是实际开发中使用非常频繁的一种编程方式,面向接口编程,能够提高程序的拓展性,降低程序的耦合度,进行解耦合。

通过interface关键字来定义接口: 在这里插入图片描述 通过implements关键字来进行接口的具体实现,其对应的类就叫作实现类在这里插入图片描述

Object 类

Object类Java中所有类的父类,其中定义了一些所有类都需要使用的方法,所有类直接继承使用,以下是继承于Object 类中,在实际的开发过程里,常常需要重写的方法: 在这里插入图片描述

toString方法重写

在这里插入图片描述

equals方法重写

A==B,在Java== 相当于python 中 的is关键字,其作用是对 A和B两个变量所引用的对象地址进行判断,判断是否相等

在这里插入图片描述

hashCode方法重写

native关键字 表示当前修饰的方法为本地方法,所谓本地方法,就是指Java无法实现,由其他语言(如C++)来实现,Java只负责调用的方法。

hashcode()方法能够将对象地址,对象属性,类的信息混合在一起,最终映射出一个整型数据。当两个对象的hashCode不相等时,这两个对象肯定不相等,但是,当两个hashCode相等时,两个对象不一定相等,此时需要调用equals()方法来作进一步验证。

在这里插入图片描述

包装类

Java中共由8种基本数据类型和 引用数据类型(即对象),如何将基本数据类型转换成对象呢?包装类应运而生了,包装类Java提供的一组类,专门用来创建8种基本数据类型对应的对象,包装类对象是可以接受对应的基本数据类型的数据的赋值

在这里插入图片描述 包装类之间的关系如下图所示: 在这里插入图片描述

拆箱与装箱

在实际的开发当中,对包装类的使用就是将基本数据类型转换成包装类,将包装类转换成基本数据类型,这就叫装箱拆箱

装箱: 在这里插入图片描述 拆箱: 在这里插入图片描述

Java异常

Java中的错误可以分为两类:

  • 编译时错误,一般是语法错误
  • 运行时错误, 语法没问题,可以正常通过编译,但运行时报错 在这里插入图片描述

异常的查看

当我们在开发过程中,出现了异常,在报错信息中,我们应该重点关注 错误信息错误位置,如下图所示: 在这里插入图片描述

异常的使用

在这里插入图片描述 在这里插入图片描述

throw 和 throws 关键字

在这里插入图片描述 在这里插入图片描述

自定义异常

在这里插入图片描述 在这里插入图片描述