You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1086 lines
30 KiB
1086 lines
30 KiB
3 years ago
|
---
|
||
|
title: java基础
|
||
|
author: TianZD
|
||
|
top: true
|
||
|
cover: true
|
||
|
toc: true
|
||
|
mathjax: false
|
||
|
summary: java基础知识学习笔记,粗略学了一下,没有参考价值
|
||
|
tags:
|
||
|
- java基础
|
||
|
- 学习笔记
|
||
|
categories:
|
||
|
- java
|
||
|
reprintPolicy: cc_by
|
||
|
abbrlink: b8b0eacd
|
||
|
date: 2022-04-29 11:03:59
|
||
|
coverImg:
|
||
|
img:
|
||
|
password:
|
||
|
---
|
||
|
|
||
|
|
||
|
[TOC]
|
||
|
|
||
|
# 概述
|
||
|
|
||
|
**java的核心优势**:跨平台/可移植性
|
||
|
|
||
|
**特点**:安全性、面向对象、简单性(C++-,C++的简化版,去掉一些内容)、高性能、分布式、多线程、健壮性
|
||
|
|
||
|
**java的版本:**
|
||
|
|
||
|
1. **JAVASE**:JAVA的标准版本,定位在个人计算机的应用
|
||
|
2. **JAVAEE**:java的企业版,定位在服务器端的应用,是javaSE的扩展,增加了用于服务器开发的类库。
|
||
|
3. **javaME**:微型版,定位在消费性电子产品上的开发。不用学习。
|
||
|
|
||
|
**计算机高级语言的类型**:编译型(C、C++)、解释型(python),java属于两种类型的综合。
|
||
|
|
||
|
**JVM**:JAVA虚拟机,一个虚拟的用于执行bytecode字节码的“虚拟计算机”。JVM负责将jaba字节码解释运行,边解释边运行,速度会收到一定的影响。
|
||
|
|
||
|
**jvm屏蔽了底层运行平台的差别,是实现跨平台的核心机制。**
|
||
|
|
||
|
.java源文件编译成.class字节码文件,经过JVM for Unix/Windows/other解释执行
|
||
|
|
||
|
**JRE**:java运行环境,包括JVM,库函数、运行java应用程序必须的文件。
|
||
|
|
||
|
**JDK**:java开发工具,包含JRE,以及增加编译器和调试器等用于程序开发的文件。
|
||
|
|
||
|
*如果只是要运行java程序,只需要安装JRE,如果需要开发java程序,则需要安装JDK。*
|
||
|
|
||
|
# 基本语法
|
||
|
|
||
|
## 注释
|
||
|
|
||
|
给程序员看的, 不是给机器看的,//代表单行注释,/*,,,,*/多行注释,多行注释不能嵌套,/**,,,*/文档注释,中间的每一行都要以*开头
|
||
|
|
||
|
## 标识符
|
||
|
|
||
|
给变量、类、方法以及包进行命名的,
|
||
|
|
||
|
1. 标识符必须以**字母、下划线、$**开头;
|
||
|
2. Java标识符对大小写敏感,长度无限制;
|
||
|
3. 标识符不可以是java关键字;
|
||
|
4. 表示类名的标识符,首字母大写;
|
||
|
5. 表示方法和变量的标识符,第一个单词小写,后面的单词开始,首字母大写,如eatFood(),驼峰原则;
|
||
|
|
||
|
java采用的是**unicode字符集**,**汉字和英文字母一样,都是普通字符,可以作为标识符。**
|
||
|
|
||
|
## 变量:
|
||
|
|
||
|
本质上代表一个“可操作的存储空间”,空间位置是确定的,但是里面的东西不确定。
|
||
|
|
||
|
java是一种强类型语言,**变量必须声明类型**。
|
||
|
|
||
|
```java
|
||
|
double salary,b;//尽量不要这样,尽量逐一声明每一个变量,提高程序可读性。
|
||
|
double salary = 1000;
|
||
|
```
|
||
|
|
||
|
一个字节byte有8个比特(位)bite,double8个字节,64位。
|
||
|
|
||
|
变量包括:**局部变量、成员变量、静态变量**
|
||
|
|
||
|
| 类型 | 声明位置 | 从属于 | 作用域 |
|
||
|
| -------- | ------------------ | ----------- | ------------------- |
|
||
|
| 局部变量 | 方法或语句块内部 | 方法/语句块 | 方法/语句块执行期间 |
|
||
|
| 成员变量 | 类内部,方法外部 | 对象 | 跟随对象 |
|
||
|
| 静态变量 | 类外部,static修饰 | 类 | 类的加载和卸载 |
|
||
|
|
||
|
## 常量
|
||
|
|
||
|
变量声明前加**final**
|
||
|
|
||
|
`final double PI = 3.14;`
|
||
|
|
||
|
## 基本数据类型
|
||
|
|
||
|
Java数据类型可以分为两类:**基本数据类型、引用数据类型**
|
||
|
|
||
|
基本数据类型有**8**种,包括:
|
||
|
|
||
|
1. 数值型:整数类型(字节byte、短整型short、整型int、长整型long,分别具有1个字节、2个字节、4个字节、8个字节)、浮点类型(float、double,分别具有4个字节、8个字节);
|
||
|
2. 字符型char;
|
||
|
3. 布尔型boolen。
|
||
|
|
||
|
引用数据类型有3种:
|
||
|
|
||
|
1. 类class;
|
||
|
2. 接口interface;
|
||
|
3. 数组。
|
||
|
|
||
|
>**引用数据类型的大小统一为4个字节byte,记录的是引用对象的地址;**
|
||
|
|
||
|
>java语言整型常量四种表示形式:
|
||
|
|
||
|
* 十进制整数,如:88;
|
||
|
* 八进制整数,以0开头,如:015;
|
||
|
* 十六进制,以0x或者0X开头,如:0x15;
|
||
|
* 二进制,以0b或者0B开头,如0b001.
|
||
|
|
||
|
java语言整型常数默认为int类型,声明long型常量可以再后面加”l“、”L“;
|
||
|
|
||
|
```
|
||
|
long a = 5555; //编译成功,5555再int表示范围内;
|
||
|
long a = 5555555555;//编译错误,默认为int,超过范围。
|
||
|
long b = 5555555555L; //编译正确
|
||
|
```
|
||
|
|
||
|
**浮点型**中float是4个字节,可以精确到7位有效数字,double为8个字节;**绝大多数使用double类型**
|
||
|
浮点型是有误差的,高精度中不能使用
|
||
|
float一般有F或者f作为后缀,没有的默认使用double类型。
|
||
|
|
||
|
**字符型**内存中占用两个字节,使用单引号表示字符常量,双引号表示字符串。
|
||
|
java中可以中十六进制表示字符型,前面加\u,如`char c= '\u0061'`表示c=‘a’;
|
||
|
|
||
|
**转义字符**
|
||
|
|
||
|
| 转义符 | 含义 | unicode值 |
|
||
|
| ---------- | ------ | --------- |
|
||
|
| \b | 退格 | \u0008 |
|
||
|
| \n | 换行 | \u000a |
|
||
|
| \r | 回车 | \u000d |
|
||
|
| \t | tab | \u0009 |
|
||
|
| \ " | 双引号 | \u0022 |
|
||
|
| \ ' | 单引号 | \u0027 |
|
||
|
| \ \|反斜杠 | \u005c | |
|
||
|
|
||
|
**boolen型有true和false两个,占用一个或者4个字节,不可以用0或者非0表示!!**
|
||
|
|
||
|
## **运算符**
|
||
|
|
||
|
### 自动类型转换
|
||
|
|
||
|
容量小的数据类型可以自动转换为容量大的,但是整数型可以转换为浮点型,即使long的容量大于float
|
||
|
|
||
|
### 强制类型转换
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
# 控制语句
|
||
|
|
||
|
**顺序结构**代表**先执行a再执行b**;
|
||
|
**条件判断结构**代表**如果。。则。。**;
|
||
|
**循环结构**代表**如果。。则重复执行。。**;
|
||
|
|
||
|
## if语句
|
||
|
|
||
|
```
|
||
|
if(判断语句){
|
||
|
。。。
|
||
|
}else if{
|
||
|
...
|
||
|
}else{
|
||
|
...
|
||
|
}
|
||
|
```
|
||
|
|
||
|
## switch语句
|
||
|
|
||
|
适用于多值判断,可以用if语句代替
|
||
|
|
||
|
```
|
||
|
switch(表达式){
|
||
|
case 值1:
|
||
|
语句1;
|
||
|
break;//可有可无
|
||
|
case 值2://没有语句的话执行下一个语句。
|
||
|
case 值3:
|
||
|
语句2:
|
||
|
default:
|
||
|
语句n;
|
||
|
}
|
||
|
```
|
||
|
|
||
|
## while循环
|
||
|
|
||
|
```
|
||
|
while(布尔表达式){
|
||
|
循环体;
|
||
|
}
|
||
|
|
||
|
do{
|
||
|
循环体;
|
||
|
}while(布尔表达式);
|
||
|
```
|
||
|
|
||
|
## for循环
|
||
|
|
||
|
```
|
||
|
for(初始表达式;布尔表达式;迭代){
|
||
|
循环体;
|
||
|
}
|
||
|
for(;;){ //死循环,while(true)
|
||
|
...
|
||
|
}
|
||
|
```
|
||
|
|
||
|
## 嵌套循环
|
||
|
|
||
|
## 方法
|
||
|
|
||
|
**方法**类似于其他语言的**函数**
|
||
|
|
||
|
方法的声明格式:
|
||
|
`[修饰符1 修饰符2] 返回值类型 方法名(形参1 形参2)`
|
||
|
|
||
|
方法的调用
|
||
|
`类名.方法名()`
|
||
|
|
||
|
|
||
|
==========================
|
||
|
|
||
|
|
||
|
|
||
|
# 面向对象
|
||
|
|
||
|
>**类和对象、内存底层、面向对象三个特征、特殊类**
|
||
|
|
||
|
> 互联网上的所有数据,本质上都是“表格”
|
||
|
|
||
|
**面向过程时一种“设计者”思维; 面向对象是一种“设计者”思维。**
|
||
|
|
||
|
## 对象和类
|
||
|
|
||
|
### 类的声明
|
||
|
|
||
|
```
|
||
|
public class SxtSut{
|
||
|
//属性(成员变量)
|
||
|
int id;
|
||
|
String sname;
|
||
|
int age;
|
||
|
//方法
|
||
|
void study(){
|
||
|
...
|
||
|
}
|
||
|
//构造方法,可有可无
|
||
|
SxtStu(){
|
||
|
}
|
||
|
}
|
||
|
```
|
||
|
|
||
|
### 成员变量的默认值:
|
||
|
|
||
|
| 数据类型 | 默认值 |
|
||
|
| ------------ | -------- |
|
||
|
| 整型 | 0 |
|
||
|
| 浮点型 | 0.0 |
|
||
|
| 字符型 | '\u0000" |
|
||
|
| 布尔型 | false |
|
||
|
| 所有引用类型 | null |
|
||
|
|
||
|
### 构造方法
|
||
|
|
||
|
构造器也叫构造方法,用于对象的初始化,再对象创建的时候会自动调用;
|
||
|
|
||
|
* 构造器的调用是通过new调用的
|
||
|
* 构造器虽然有返回值,但是不能定义返回值类型(返回值的类型是本类),不能使用return
|
||
|
* 如果没有定义构造器,编译器会自动定义一个无参的构造函数,如果自己定义了,那么系统不会自定义
|
||
|
* 构造器的方法名称必须和类完全相同
|
||
|
|
||
|
## java虚拟机内存模型
|
||
|
|
||
|
### 从属于线程的内存分析
|
||
|
|
||
|
1. 程序计数器,每个线程都有自己的程序计数器,是一块比较小的内存空间,存储当前线程正在执行的java方法的JVM指令地址,即字节码的行号
|
||
|
2. java虚拟机栈,线程的私有区域,每个线程再创建的时候都会创建一个虚拟机栈,线程退出时,会被回收。方法调用时进行压栈操作,方法调用结束后进行出栈操作。该区域存储着局部变量表
|
||
|
3. 本地方法栈:与虚拟机栈类似,调用本地方法时使用的栈,每个线程都有一个本地方法栈。
|
||
|
|
||
|
#### 栈
|
||
|
|
||
|
1. 描述的是方法执行的内存模型,每个方法被调用时都被创建一个栈帧,存储局部变量、操作数、方法出口等;
|
||
|
2. jvm会为每个线程创建一个栈
|
||
|
3. 属于线程私有,不能共享
|
||
|
4. 存储特性:先进后出,后进先出
|
||
|
|
||
|
### 堆heap
|
||
|
|
||
|
几乎所有创建的java对象都会被直接分配到堆上。堆被所有的线程共享,再堆上的区域,会被垃圾回收器进一步划分为新生代、老年代。java虚拟机启动时,可以使用Xmx之类的参数指定堆区域的大小。
|
||
|
|
||
|
1. 存储数组(数组也是对象)和对象
|
||
|
2. jvm只有一个堆,被所有线程共享
|
||
|
3. 堆是一个不连续的空间,分配灵活,速度慢!
|
||
|
|
||
|
### 方法区
|
||
|
|
||
|
被所有线程共享,时一种java虚拟机的规范,存储被虚拟机加载的元数据,包括类信息、常量、静态变量、即时编译器编译后的代码等数据
|
||
|
|
||
|
由于方法去存储的数据和队中存储的数据一致,实质上也是堆。java不同版本实现方式不同
|
||
|
|
||
|
1. jvm只有一个方法区,被所有线程共享
|
||
|
2. 实际也是堆,不连续,只是用来存储类、常量等信息
|
||
|
3. 用来存放线程中永远是不变或者唯一的内容(类信息、静态常量、字符串常量)。
|
||
|
|
||
|
### 运行时常量池(方法区中)
|
||
|
|
||
|
存储final常量等
|
||
|
|
||
|
### 直接内存
|
||
|
|
||
|
直接内存并不属于java规范规定的属于java虚拟机运行时数据区的一部分。
|
||
|
|
||
|
## 垃圾回收机制Garbage Collection
|
||
|
|
||
|
**java的内存管理很大程度上指的就是:堆中对象的管理,其中包括对象空间的分配和释放。**
|
||
|
|
||
|
|
||
|
**对象空间的分配:new;对象空间的释放:赋值null即可,垃圾回收器将负责回收所有“不可达”对象(没有引用)的内存空间**
|
||
|
|
||
|
**垃圾回收相关算法**
|
||
|
|
||
|
1. 引用计数法:堆中每个对象都引用一个计数器。有点:算法简单;缺点:循环引用的无用对象无法识别
|
||
|
2. 引用可达法(根搜索算法):程序把所有的引用关系看作一张图
|
||
|
|
||
|
## 通用的分代垃圾回收机制
|
||
|
|
||
|
不同的对象的生命周期是不一样的,采用不同的回收算法,提高回收效率。
|
||
|
|
||
|
分为年轻代、年老代、持久代,将不同状态的对象放到堆中不同的区域,JVM将堆内存划分为Eden、Survivor、Tenured/Old空间。
|
||
|
|
||
|
1. Eden区:存储了从未经过垃圾回收的新对象
|
||
|
2. Survivor区,存放经过垃圾回收后,仍然有用的对象,survivor1和2循环存放,小于15次垃圾回收次数
|
||
|
3. Tenured区,年老代区域存放超过15次垃圾回收的对象
|
||
|
|
||
|
4. Minor GC:用于清理年轻代区域,Eden区满了就会触发一次,清理无用对象,将有用对象复制到survivor1和2区
|
||
|
5. Major GC:用于清理年老代区域
|
||
|
6. Full GC:用于清理年轻代、年老代区域,成本较高,会对系统性能产生影响
|
||
|
|
||
|
**程序员无权调用垃圾回收器**
|
||
|
|
||
|
## 容易造成内存泄漏的情况
|
||
|
|
||
|
1. 创建大量无用对象,比如再需要大量拼接字符串时,使用了String而不是StringBuilder
|
||
|
2. 静态集合类的使用,如:HashMap、Vector、List等使用最容易造成内存泄漏,这些静态变量的生命周期和应用程序一致,所有的对象Object也不能被释放
|
||
|
3. 各种连接对象(IO流对象、数据库连接对象、网络连接对象)未关闭,这些对象属于物理连接,和硬盘或者网络连接,不适用的时候要关闭
|
||
|
4. 监听器的使用,释放对象时,未删除相应的监听器
|
||
|
|
||
|
System.gc()的作用:程序员建议启用垃圾回收进程
|
||
|
|
||
|
## 包机制(package、import)
|
||
|
|
||
|
### package
|
||
|
|
||
|
通过package实现对类的管理,包对于类,相当于文件夹对于文件的作用:
|
||
|
|
||
|
1. 通常是类的第一句非注释性语句;
|
||
|
2. 包名:域名倒着写即可,再加上模块名,便于内部管理类
|
||
|
|
||
|
```
|
||
|
com.sun.test;
|
||
|
com.oracle.test;
|
||
|
cn.sxt.gao.test;
|
||
|
```
|
||
|
|
||
|
导入:
|
||
|
|
||
|
```
|
||
|
import com.sun.test.* //导入该包下的所有类;
|
||
|
```
|
||
|
|
||
|
|
||
|
导入一个包内所有的类,会降低编译速度,但不会降低运行速度
|
||
|
|
||
|
## 继承extends
|
||
|
|
||
|
java中只有单继承,没有C++中的多继承,一个子类只有一个父类;
|
||
|
|
||
|
如果定义了一个类,没有调用extends,那么他的父类是java.lang.object
|
||
|
|
||
|
### instanceof运算符
|
||
|
|
||
|
二元运算符,左边是对象,右边是类,如果左边是右边类火子类的对象,则返回true,否则false
|
||
|
|
||
|
### 重写overwrite
|
||
|
|
||
|
1. 方法名、形参列表必须相同;
|
||
|
2. 返回值类型和声明异常类型,子类小于等于父类
|
||
|
3. 访问权限,子类大于等于父类。
|
||
|
|
||
|
## final关键字
|
||
|
|
||
|
1. 修饰变量,该变量不可改变;
|
||
|
2. 修饰方法,该方法不可以被子类重写,但是可以被重载!(重写:参数列表相同,重载:参数列表不同);
|
||
|
3. 修饰类:修饰的类不能被重载;
|
||
|
|
||
|
## 继承和组合
|
||
|
|
||
|
组合:将父类对象作为子类的属性
|
||
|
|
||
|
|
||
|
## Object类
|
||
|
|
||
|
所有java类的父类;
|
||
|
|
||
|
### toString方法
|
||
|
|
||
|
```
|
||
|
public String toString(){
|
||
|
return getClass().getName()+"@"+Integer.toHexString(hashCode());
|
||
|
}
|
||
|
// 默认返回“类名+@+16进制的hashcode”,再打印输出或者用字符串连接对象时,会自动调用该方法
|
||
|
```
|
||
|
|
||
|
### "=="和equals方法
|
||
|
|
||
|
```
|
||
|
public boolean equals(Object obj){
|
||
|
return(this == obj)
|
||
|
}
|
||
|
```
|
||
|
|
||
|
==的作用:
|
||
|
|
||
|
1. 基本类型:值是否相等;
|
||
|
2. 引用类型:内存地址是否相等;
|
||
|
|
||
|
|
||
|
equals:默认情况下比较内存地址是否相等,一般进行重写。
|
||
|
|
||
|
### super方法
|
||
|
|
||
|
子类中使用super方法,调用父类中的方法或属性。
|
||
|
|
||
|
子类中所有构造方法的第一句总会构造父类的构造器,你不加,编译器会自动加super()进行调用父类的无参构造器。
|
||
|
|
||
|
## 封装
|
||
|
|
||
|
程序设计追求高内聚、低耦合,高内聚就是类的内部数据操作细节自己完成,不允许内部干涉;低耦合就是仅暴漏少量方法给外部使用,尽量方便外部调用;
|
||
|
|
||
|
封装的有点:
|
||
|
|
||
|
1. 提高代码的安全性
|
||
|
2. 提高代码的复用性
|
||
|
3. 高内聚:封装细节,便于修改内部代码,提高可维护性;
|
||
|
4. 低耦合:简化外部调用,便于调用者使用,方便扩展和写作。
|
||
|
|
||
|
### 封装的实现——访问控制符
|
||
|
|
||
|
|
||
|
| 修饰符 | 同一个类 | 同一个包 | 子类 | 所有类 |
|
||
|
| --------- | -------- | -------- | ---- | ------ |
|
||
|
| private | yes | - | - | - |
|
||
|
| default | yes | yes | - | - |
|
||
|
| protected | yes | yes | yes | - |
|
||
|
| public | yes | yes | yes | yes |
|
||
|
|
||
|
### 封装的简单规则:
|
||
|
|
||
|
1. 一般使用private访问权限;
|
||
|
2. 提供相应的get/set方法来访问相关属性,这些方法通常是public修饰的(注意:boolean变量的get方法是is开头)
|
||
|
3. 一些只用于本类的辅助性方法可以用private修饰,希望其他类调用的方法用public调用
|
||
|
|
||
|
|
||
|
## 多态
|
||
|
|
||
|
多态:同一个方法调用,由于对象不同可能会有不同的行为。
|
||
|
|
||
|
1. 多态是方法的多态,不是属性的多态,多态和属性无关;
|
||
|
2. 多态存在的必要条件:继承,方法重写,父类引用指向子类对象。
|
||
|
3. 父类引用指向子类对象后(如:`Animal a1 = new Cat();`),用该父类引用调用子类重写的方法,此时多态就出现了。
|
||
|
|
||
|
多态的作用,定义方法时,只需要定义一个
|
||
|
|
||
|
```
|
||
|
void animalShout(Animal a){
|
||
|
a.shout();
|
||
|
} //shout()方法为类中重写的方法
|
||
|
```
|
||
|
|
||
|
|
||
|
## 对象的转型
|
||
|
|
||
|
向上转型:父类引用指向子类对象,称之为向上转型,属于自动类型转换;`Animal a1 = new Cat();`
|
||
|
|
||
|
向下转型:把animal转换成cat。
|
||
|
|
||
|
```java
|
||
|
Animal a = new Dog();
|
||
|
Dog d2 = (Dog) a;
|
||
|
```
|
||
|
|
||
|
# 抽象方法和抽象类
|
||
|
|
||
|
## 抽象方法:
|
||
|
|
||
|
使用abstract修饰的方法,没有方法体,只有声明,定义的是一种规范,告诉子类,必须要给抽象方法提供具体的实现;
|
||
|
|
||
|
## 抽象类
|
||
|
|
||
|
包含抽象方法的类就是抽象类,通过abstract方法定义规范,要求子类必须定义具体实现,通过抽象类,可以做到严格限制子类的设计,使子类之间更加通用。
|
||
|
|
||
|
```java
|
||
|
//抽象类
|
||
|
abstract class Animal{
|
||
|
public abstract void shout();//抽象方法
|
||
|
}
|
||
|
|
||
|
class Dog extends Animal{
|
||
|
public void shout(){
|
||
|
......
|
||
|
}
|
||
|
}
|
||
|
```
|
||
|
|
||
|
注意:
|
||
|
|
||
|
1. 有抽象方法的类只能定义成抽象类;
|
||
|
2. 抽象类不能实例化,不能用new新建
|
||
|
3. 抽象类可以半酣属性、方法、构造方法。但是构造方法不能用来new实例,只能用来被子类调用;
|
||
|
4. 抽象类只能用来被继承;
|
||
|
5. 抽象方法必须被子类实现。
|
||
|
|
||
|
# 接口
|
||
|
|
||
|
接口就是比“抽象类”还“抽象”的“抽象类”,可以更加规范的对子类进行约束。全面地专业地实现了:规范和具体实现的分离。
|
||
|
|
||
|
抽象类还提供某些具体实现,接口不提供任何实现,接口中所有方法都是抽象方法。接口是完全面向规范的,规定了一批类具有的公共方法规范。
|
||
|
|
||
|
从接口的实现者角度看,接口定义了可以向外部提供的服务。
|
||
|
从接口的调用者角度看,接口定义了实现者能提供那些服务。
|
||
|
接口是两个模块之间通信的标准,通信的规范。如果能把你要设计的系统之间模块之间的接口定义好,就相当于完成了系统的设计大纲,剩下的就是添砖加瓦的具体实现了。大家在工作以后,做系统时往往就是使用“面向接口”的思想来设计系统。
|
||
|
|
||
|
```java
|
||
|
//定义接口
|
||
|
interface Volant{
|
||
|
int a = 100; //总是:public static final类型的;
|
||
|
void fly(); //总是public abstract void fly;
|
||
|
}
|
||
|
|
||
|
//实现接口
|
||
|
class Angel implements Volant{
|
||
|
public void fly(){
|
||
|
...
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//接口的继承
|
||
|
interface a extends Volant{
|
||
|
....
|
||
|
}
|
||
|
```
|
||
|
|
||
|
## 接口中定义静态方法和默认方法(JDK8以后)
|
||
|
|
||
|
java8以前,接口里的方法要求全是抽象方法;
|
||
|
|
||
|
java8及以后,i允许再接口里定义默认方法和类方法。
|
||
|
|
||
|
### 默认方法
|
||
|
|
||
|
(扩展方法):非抽象的方法实现,使用default关键字。,子类不需要实现,都带有。
|
||
|
|
||
|
### 静态方法
|
||
|
|
||
|
允许加静态方法
|
||
|
|
||
|
默认方法需要类实现后才能调用,静态方法不用实现对象,可以直接调用。
|
||
|
|
||
|
|
||
|
## 接口的多继承
|
||
|
|
||
|
类只能单继承,但是接口可以多继承
|
||
|
|
||
|
```java
|
||
|
interface C extends A ,B{
|
||
|
|
||
|
}
|
||
|
```
|
||
|
|
||
|
# String类
|
||
|
|
||
|
用的最多的类;
|
||
|
|
||
|
## String基础
|
||
|
|
||
|
1. String类又称作不可变字符序列
|
||
|
2. 位于java.lang包
|
||
|
3. java字符串就是Unicode字符序列,java就是j、a、v、a组成
|
||
|
|
||
|
## String 方法
|
||
|
|
||
|
### 创建字符串
|
||
|
|
||
|
创建一个String对象,并初始化一个值。
|
||
|
String类是不可改变的,一旦创建了一个String对象,它的值就不能改变了。
|
||
|
如果想对字符串做修改,需要使用StringBuffer&StringBuilder类。
|
||
|
|
||
|
```java
|
||
|
//直接创建方式
|
||
|
String str1 = "abc";
|
||
|
//提供一个 字符数组 参数来初始化字符串
|
||
|
char[] strarray = {'a','b','c'};
|
||
|
String str2 = new String(strarray);
|
||
|
|
||
|
```
|
||
|
|
||
|
### 字符串长度获取
|
||
|
|
||
|
int length()方法:返回字符串对象包含的字符数。
|
||
|
|
||
|
```java
|
||
|
int len = str.length();
|
||
|
```
|
||
|
|
||
|
## 连接字符串
|
||
|
|
||
|
String concat(String str):连接两个字符串的方法
|
||
|
或者直接用‘+’操作符来连接
|
||
|
|
||
|
```java
|
||
|
//String对象的连接
|
||
|
str1.concat(str2);
|
||
|
|
||
|
"两个字符串连接结果:"+str1+str2;
|
||
|
```
|
||
|
|
||
|
## 字符串查找
|
||
|
|
||
|
int indexOf(String s):字符串s在指定字符串中首次出现的索引位置,如果没有检索到字符串s,该方法返回-1
|
||
|
|
||
|
int lastIndexOf(String s):字符串s在指定字符串中最后一次出现的索引位置,如果没有检索到字符串s,该方法返回-1;
|
||
|
|
||
|
如果s是空字符串,则返回的结果与length方法的返回结果相同,即返回整个字符串的长度。
|
||
|
|
||
|
```java
|
||
|
int idx = str.indexOf("a");//字符a在str中首次出现的位置
|
||
|
int idx = str.lastIndexOf("a");
|
||
|
|
||
|
```
|
||
|
|
||
|
## 获取指定位置的字符串
|
||
|
|
||
|
char charAt(int index)方法:返回指定索引出的字符
|
||
|
|
||
|
```java
|
||
|
String str = "abcde";
|
||
|
char thischar = str.charAt(3);//索引为3的thischar是"d"
|
||
|
|
||
|
```
|
||
|
|
||
|
## 获取子字符串
|
||
|
|
||
|
String substring()方法:实现截取字符串,利用字符串的下标索引来截取(字符串的下标是从0开始的,在字符串中空格占用一个索引位置)
|
||
|
|
||
|
substring(int beginIndex):截取从指定索引位置开始到字符串结尾的子串
|
||
|
substring(int beginIndex, int endIndex):从beginIndex开始,到endIndex结束(不包括endIndex)
|
||
|
|
||
|
```java
|
||
|
String str = "abcde";
|
||
|
String substr1 = str.substring(2);//substr1为"cde"
|
||
|
String substr2 = str.substring(2,4);//substr2为"cd"
|
||
|
|
||
|
```
|
||
|
|
||
|
## 去除字符串首尾的空格()
|
||
|
|
||
|
String trim()方法
|
||
|
|
||
|
```java
|
||
|
String str = " ab cde ";
|
||
|
String str1 = str.trim();//str1为"ab cde"
|
||
|
```
|
||
|
|
||
|
## 字符串替换
|
||
|
|
||
|
1. String replace(char oldChar, char newChar):将指定的字符/字符串oldchar全部替换成新的字符/字符串newChar
|
||
|
2. String replaceAll(String regex, String replacement):使用给定的参数 replacement替换字符串所有匹配给定的正则表达式的子字符串
|
||
|
3. String replaceFirst(String regex, String replacement):使用给定replacement 替换此字符串匹配给定的正则表达式的第一个子字符串
|
||
|
regex是正则表达式,替换成功返回替换的字符串,替换失败返回原字符串
|
||
|
|
||
|
```java
|
||
|
String str = "abcde";
|
||
|
String newstr = str.replace("a","A");//newstr为"Abcde"
|
||
|
```
|
||
|
|
||
|
## 判断字符串的开始与结尾
|
||
|
|
||
|
boolean startsWith()
|
||
|
|
||
|
1. boolean startsWith(String prefix):判断此字符串是否以指定的后缀prefix开始
|
||
|
2. boolean startsWith(String prefix, int beginidx):判断此字符串中从beginidx开始的子串是否以指定的后缀prefix开始
|
||
|
boolean endsWith(String suffix):判断此字符串是否以指定的后缀suffix结束
|
||
|
|
||
|
```java
|
||
|
String str = "abcde";
|
||
|
boolean res = str.startsWith("ab");//res为true
|
||
|
boolean res = str.StartsWith("bc",1);//res为true
|
||
|
boolean res = str.endsWith("de");//res为true
|
||
|
```
|
||
|
|
||
|
## 判断字符串是否相等
|
||
|
|
||
|
boolean equals(Object anObject):将此字符串与指定的对象比较,区分大小写
|
||
|
boolean equalsIgnoreCase(String anotherString):将此 String 与另一个 String 比较,不考虑大小写
|
||
|
|
||
|
```java
|
||
|
String str1 = "abcde";
|
||
|
String str2 = str1;//字符串str1和str2都是一个字符串对象
|
||
|
String str3 = "ABCDE";
|
||
|
boolean isEqualed = str1.equals(str2);//返回true
|
||
|
boolean isEqualed = str1.equals(str3);//返回false
|
||
|
boolean isEqualed = str1.equlasIgnoreCase(str3);//返回true
|
||
|
|
||
|
```
|
||
|
|
||
|
## 比较两个字符串
|
||
|
|
||
|
int compareTo(Object o):把这个字符串和另一个对象比较。
|
||
|
int compareTo(String anotherString):按字典顺序比较两个字符串。
|
||
|
比较对应字符的大小(ASCII码顺序),如果参数字符串等于此字符串,则返回值 0;如果此字符串小于字符串参数,则返回一个小于 0 的值;如果此字符串大于字符串参数,则返回一个大于 0 的值。
|
||
|
|
||
|
```java
|
||
|
String str1 = "abcde";
|
||
|
String str2 = "abcde123";
|
||
|
String str3 = str1;
|
||
|
int res = str1.compareTo(str2);//res = -3
|
||
|
int res = str1.compareTo(str3);//res = 0
|
||
|
int res = str2.compareTo(str1);//res = 3
|
||
|
|
||
|
```
|
||
|
|
||
|
## 把字符串转换为相应的数值
|
||
|
|
||
|
String转int型:
|
||
|
|
||
|
```java
|
||
|
//第一种
|
||
|
int i = Integer.parseInt(String str)
|
||
|
//第二种
|
||
|
int i = Integer.valueOf(s).intValue();
|
||
|
|
||
|
```
|
||
|
|
||
|
String转long型:
|
||
|
|
||
|
```java
|
||
|
long l = Long.parseLong(String str);
|
||
|
1
|
||
|
```
|
||
|
|
||
|
String转double型:
|
||
|
|
||
|
```java
|
||
|
double d = Double.valueOf(String str).doubleValue();//doubleValue()不要也可
|
||
|
double d = Double.parseDouble(str);
|
||
|
|
||
|
```
|
||
|
|
||
|
int转string型:
|
||
|
|
||
|
```java
|
||
|
//第一种
|
||
|
String s = String.valueOf(i);
|
||
|
//第二种
|
||
|
String s = Integer.toString(i);
|
||
|
//第三种
|
||
|
String s = "" + i;
|
||
|
|
||
|
```
|
||
|
|
||
|
## 字符大小写转换
|
||
|
|
||
|
String toLowerCase():将字符串中的所有字符从大写字母改写为小写字母
|
||
|
String toUpperCase():将字符串中的所有字符从小写字母改写为大写字母
|
||
|
|
||
|
```java
|
||
|
String str1 = "abcde";
|
||
|
String str2 = str1.toUpperCase();//str2 = "ABCDE";
|
||
|
String str3 = str2.toLowerCase();//str3 = "abcde";
|
||
|
|
||
|
```
|
||
|
|
||
|
## 字符串分割
|
||
|
|
||
|
String[] split():根据匹配给定的正则表达式来拆分字符串,将分割后的结果存入字符数组中。
|
||
|
|
||
|
String[] split(String regex):regex为正则表达式分隔符, . 、 $、 | 和 * 等转义字符,必须得加 \\;多个分隔符,可以用 | 作为连字符。
|
||
|
String[] split(String regex, int limit):limit为分割份数
|
||
|
|
||
|
```java
|
||
|
String str = "Hello World A.B.C"
|
||
|
String[] res = str.split(" ");//res = {"Hello","World","A.B.C"}
|
||
|
String[] res = str.split(" ",2);//res = {"Hello","World A.B.C"}
|
||
|
String[] res = str.split("\\.");//res = {"Hello World A","B","C"}
|
||
|
|
||
|
String str = "A=1 and B=2 or C=3"
|
||
|
String[] res = str.split("and|or");//res = {"A=1 "," B=2 "," C=3"}
|
||
|
|
||
|
```
|
||
|
|
||
|
## 字符数组与字符串的转换
|
||
|
|
||
|
public String(char[] value) :通过char[]数组来创建字符串
|
||
|
char[] toCharArray():将此字符串转换为一个新的字符数组。
|
||
|
|
||
|
```java
|
||
|
String str = "abcde";
|
||
|
char mychar[] = str.toCharArray();//char[0] = 'a'; char[1] = 'b'...
|
||
|
|
||
|
```
|
||
|
|
||
|
## 字符串与byte数组的转换
|
||
|
|
||
|
byte[] getBytes()
|
||
|
|
||
|
byte[] getBytes():使用平台的默认字符集将此 String 编码为 byte 序列,并将结果存储到一个新的 byte 数组中。
|
||
|
byte[] getBytes(String charsetName):使用指定的字符集将此 String 编码为 byte 序列,并将结果存储到一个新的 byte 数组中。
|
||
|
|
||
|
```java
|
||
|
byte[] Str2 = Str1.getBytes();
|
||
|
|
||
|
|
||
|
```
|
||
|
|
||
|
## StringBuffer&StringBuilder类
|
||
|
|
||
|
与String类最大的不同在于这两个类可以对字符串进行修改。
|
||
|
StringBuilder相较StringBuffer来说速度较快,多数情况下使用StringBuilder,但是StringBuilder的方法不是线性安全的(不能同步访问),所以在应用程序要求线程安全的情况下,必须使用StringBuffer。
|
||
|
|
||
|
## 创建StringBuffer字符串
|
||
|
|
||
|
```java
|
||
|
StringBuffer str = new StringBuffer("");
|
||
|
```
|
||
|
|
||
|
## 添加字符(最常用方法)
|
||
|
|
||
|
public StringBuffer append(String s):将指定的字符串追加到字符序列中
|
||
|
|
||
|
```java
|
||
|
str.append("abc");//此时str为“abc”
|
||
|
```
|
||
|
|
||
|
## 删除字符串中的指定字符
|
||
|
|
||
|
public delete(int start,int end):移除此序列中的子字符串的内容
|
||
|
|
||
|
public deleteCharAt(int i):删除指定位置的字符
|
||
|
|
||
|
```java
|
||
|
str.delete(0,1);//此时str为“c”
|
||
|
str.deleteCharAt(str.length()-1);//删除最后一个字符
|
||
|
|
||
|
```
|
||
|
|
||
|
## 翻转字符串
|
||
|
|
||
|
public StringBuffer reverse()
|
||
|
|
||
|
```java
|
||
|
str.reverse();
|
||
|
|
||
|
```
|
||
|
|
||
|
## 换字符串中内容
|
||
|
|
||
|
replace(int start,int end,String str):用String类型的字符串str替换此字符串的子字符串中的内容
|
||
|
|
||
|
```java
|
||
|
String s = "1";
|
||
|
str.replace(1,1,s);//此时str为"a1c"
|
||
|
|
||
|
```
|
||
|
|
||
|
## 插入字符
|
||
|
|
||
|
public insert(int offset, int i):将int参数形式的字符串表示形式插入此序列中
|
||
|
|
||
|
```java
|
||
|
str.insert(1,2);
|
||
|
```
|
||
|
|
||
|
## 字符串长度
|
||
|
|
||
|
int length():返回长度(字符数)
|
||
|
void setLength(int new Length):设置字符序列的长度
|
||
|
|
||
|
```
|
||
|
str.length();
|
||
|
str.setLength(4);
|
||
|
```
|
||
|
|
||
|
## 当前容量
|
||
|
|
||
|
int capacity():获取当前容量
|
||
|
void ensureCapacity(int minimumCapacity):确保容量小于指定的最小值
|
||
|
|
||
|
```java
|
||
|
str.capacity();
|
||
|
```
|
||
|
|
||
|
## 将其转变为String
|
||
|
|
||
|
String toString()
|
||
|
|
||
|
```java
|
||
|
str.toString();//将StringBuffer类型的序列转变为String类型的字符串
|
||
|
```
|
||
|
|
||
|
## 设置指定索引处的字符
|
||
|
|
||
|
void setCharAt(int index,char ch):将给定索引处的字符设置为ch
|
||
|
|
||
|
其余方法和String类型的方法大致相同。
|
||
|
|
||
|
|
||
|
# 数组
|
||
|
|
||
|
数组是相同类型数据的有序集合
|
||
|
数组特点:
|
||
|
|
||
|
1. 长度是固定的,一旦创建,大小就是不可改变的;
|
||
|
2. 元素类型必须相同;
|
||
|
3. 数组变量属于引用类型 ,数组也是对象。
|
||
|
|
||
|
数组的生命(一维数组)
|
||
|
|
||
|
```java
|
||
|
// type[] arr_name;
|
||
|
|
||
|
int[] s = null; //声明数组
|
||
|
s = new int[10 ]; //分配空间
|
||
|
|
||
|
//数组的初始化:三种
|
||
|
默认、动态、静态
|
||
|
|
||
|
//数组的遍历
|
||
|
for(int i = 0; i<s.length;i++){
|
||
|
...
|
||
|
}
|
||
|
for(s i:s){
|
||
|
...
|
||
|
}
|
||
|
|
||
|
//数组的拷贝 arraycopy()
|
||
|
static void arraycopy(object s1, int srcpos, object s2, int destpos ,int length)
|
||
|
```
|
||
|
|
||
|
```java
|
||
|
package JavaStudy;
|
||
|
|
||
|
import java.util.Arrays;
|
||
|
|
||
|
/**
|
||
|
* test arrays methods
|
||
|
*/
|
||
|
|
||
|
public class Test {
|
||
|
public static void main(String[] args) {
|
||
|
int[] s = new int[10]; //creat array
|
||
|
int[] s1 ={1,3,2,5,1}; // init array s1
|
||
|
System.out.println(Arrays.toString(s1)); //toString method
|
||
|
System.arraycopy(s1,0,s,0,5); //copy method
|
||
|
System.out.println(Arrays.toString(s));
|
||
|
Arrays.sort(s1); //sort method
|
||
|
System.out.println(Arrays.toString(s1));
|
||
|
//二分法查找,使用该方法前,必须先使用sort进行排序
|
||
|
Arrays.sort(s);
|
||
|
System.out.println(Arrays.toString(s));
|
||
|
System.out.println("位置为:"+Arrays.binarySearch(s,3)); //该方法返回下标,如果未找到,则返回负数
|
||
|
}
|
||
|
}
|
||
|
```
|
||
|
|
||
|
# 多维数组
|
||
|
|
||
|
```java
|
||
|
int[][] a = new int[3][];
|
||
|
int[][] b = {{1,2,3},{1},{3,2}};
|
||
|
```
|
||
|
|
||
|
|
||
|
# comparable接口
|
||
|
|
||
|
对某个类的对象进行比较,设置比较规则;
|
||
|
|
||
|
|
||
|
Comparable接口只有一个方法:
|
||
|
`public int compareTo(Object obj)//obj为要进行比较的对象`
|
||
|
|
||
|
```java
|
||
|
public int compareTo(Object obj){
|
||
|
Man man = (Man)o;
|
||
|
if(this.age<man.age){
|
||
|
return -1;
|
||
|
}
|
||
|
if(this.age>man.age){
|
||
|
return 1;
|
||
|
}
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
```
|
||
|
|
||
|
|
||
|
# 异常
|
||
|
|
||
|
程序运行过程中出现的非正常情况
|
||
|
|
||
|
```java
|
||
|
try{
|
||
|
...
|
||
|
}catch(Exception e){
|
||
|
e.printStackTrace();
|
||
|
}
|
||
|
```
|
||
|
|
||
|
java采用面向对象的方式来进行异常处理:
|
||
|
|
||
|
1. 抛出异常:如果发生异常,则这个方法生成代表该异常的一个对象,停止当前执行路径,并把异常对象提交给jre
|
||
|
2. 捕获异常:jre得到该异常后,寻找相应的代码来处理该异常
|
||
|
|
||
|
|
||
|
## 异常的分类
|
||
|
|
||
|
java对异常进行了分类,不同的异常用不同的java类表示,所有异常类的根类为java.lang . Throwable,Throwable下面派生了两个子类:error和exception
|
||
|
|
||
|
|
||
|
exception分为checkedexception和uncheckedexception异常,前者在编译时就能发现,后者需要在运行时发现。
|
||
|
|
||
|
## 异常的处理
|
||
|
|
||
|
### 捕获异常
|
||
|
|
||
|
```java
|
||
|
try{
|
||
|
语句1; //语句1出现异常,语句2不会再执行
|
||
|
语句2; //抛出异常
|
||
|
}catch(Exception1 e){
|
||
|
|
||
|
}catch(Exception2 e){
|
||
|
|
||
|
}finally{
|
||
|
语句3; //统一出口,不管有无异常,都会执行
|
||
|
}
|
||
|
```
|
||
|
|
||
|
|
||
|
### 声明异常
|
||
|
|
||
|
```java
|
||
|
//逐级向上抛出异常,自己不处理
|
||
|
public static void main(String[] args) throws Exception{
|
||
|
|
||
|
}
|
||
|
```
|
||
|
|
||
|
|
||
|
|
||
|
## try-with-resource自动关闭closable接口的资源
|
||
|
|
||
|
```java
|
||
|
try(,,){
|
||
|
,,
|
||
|
}catch(Exception e){
|
||
|
|
||
|
}
|
||
|
```
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|