最近发现文章中的截图不在了干脆把笔记做成了PDF文件上传,下载:点击打开链接
什么是Java编程语言
Java开发的环境搭建
JDK 安装完成后 用CMD→Java→Java -version 查看安装的版本信息
JDK安装目录介绍:
配置环境变量:
使系统可以使用Java的一些控制命令
计算机→属性→高级系统设置→高级→环境变量→选中变量名ComSpec→新建→变量名:JAVA_HOME→变量值:JDK的安装目录地址C:\ProgramFiles\Java\jdk1.7.0_80→确定→找到变量名path双击打开→在变量值最后加一个;%JAVA_HOME&\bin(C:\Program Files\Java\jdk1.7.0_80\bin)→确定→重新打开CMD输入Javac测试是否配置变量成功
Java 程序入门
源代码:程序员编写的代码文件,Java源代码文件后缀为.java
字节码:二进制代码,由源代码编译产生。(大小写一定要区分)
public class hell{
public static void main(String[] args){
System.out.println("自定义");
}
}
源代码:把
源代码
转换成
字节码
的过程叫编译。
编译工具:javac 命令
使用: Javac 文件名.java
结果:会得到一个同名的 .class文件
运行:让计算机执行你的字节码
解释工具:Java class文件名
java的基础语法
public class Hello{ 模块名(一个类就是一个模块)
public static void main( String[] args ){ 程序入口
System.out.println( "今天学习java编程很快乐!" );
}
}
Java Hello ---> 让jvm 执行 Hello 模块,jvm会从程序入口开始执行你的代码,程序入口写法是固定的,如果jvm找不到入口,则会报错。
一个源代码可以包含多个类(这些类中只有一个叫主类,用public 修饰的的类,主类名必须和源代码的名字相同)
注意:
每个类都是相互独立的,编译 Hehe.java 会同时产生 每个类的字节码,这些字节码可独立运行
注释
起到解释与说明的作用:
单行注释:// 代码
多行注释:/*内容*/
文档注释:/**内容*/
字面量
字符串:用" "把内容包括起来
整数:一串数字为整数
浮点数:就是一串小数
字符:用' '把内容包括起来
布尔值:true false
关键字
已经被java语言使用过的单词,具备一定的语法含义,关键字是小写的,高级开发工具中会有特定的颜色,不能使用关键字作为你的类名、变量名、方法名。
关键字 | 含义 |
abstract | 表明类或者成员方法具有抽象属性 |
assert | 用来进行程序调试 |
boolean | 基本数据类型之一,布尔类型 |
break | 提前跳出一个块 |
byte | 基本数据类型之一,字节类型 |
case | 用在switch语句之中,表示其中的一个分支 |
catch | 用在异常处理中,用来捕捉异常 |
char | 基本数据类型之一,字符类型 |
class | 类 |
const | 保留关键字,没有具体含义 |
continue | 回到一个块的开始处 |
default | 默认,例如,用在switch语句中,表明一个默认的分支 |
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算术规范 |
super | 表明当前对象的父类型的引用或者父类型的构造方法 |
switch | 分支语句结构的引导词 |
synchronized | 表明一段代码需要同步执行 |
this | 指向当前实例对象的引用 |
throw | 抛出一个异常 |
throws | 声明在当前定义的成员方法中所有需要抛出的异常 |
transient | 声明不用序列化的成员域 |
try | 尝试一个可能抛出异常的程序块 |
void | 声明当前成员方法没有返回值 |
volatile | 表明两个或者多个变量必须同步地发生变化 |
while | 用在循环结构中 |
变量
变量是存放数据的容器,在内存中对应一块小空间,为了方便访问这块空间,需要为这块空间取一个名字,这个名字就是变量名,不同的数据需要不同的数据类型。
定义变量的语法:
数据类型 变量名=值;
注意:
java 是一门强类型语言,定义变量必须声明其数据类型,并且所赋予值必须是变量的类型。
变量的声明周期:
属性:
全部的成员和方法都能使用。
方法的参数:
只能在该方法的内部使用。
局部变量:
只能在对应的代码{}中使用,且保存局部变量时必须要为这个变量赋值初始化,如:int sum=0;
变量的命名规则:
1、由数字、 字母 、下划线 、$ 组成
2、数字不能开头
3、不能使用关键字
4、类名首字母要大写 变量名要小写
5、变量名如果有多个单词组成,应该使用驼峰命名法:多个单词组合语句中每个单词首字母要大写
数据类型
java语言中有8大基本数据类型
字节:byte 最大两位数
短整型:short 最大四位数
长整型:long 默认是int类型,数字最后加一个L去掉int位数的范围限制
整数:int (integer) 最大十位数
小数:float(单精度)默认是double类型,数字最后加一个F去掉double限制、double(双精度)
字符:char
布尔:boolean
测试每个数据类型的最大与最小范围,注意字母大小写!
数据类型转换:
把高精度的值 赋值给 低精度的变量,可能会丢失精度。
数据类型 变量名=(与前面同等的数据类型)值;
把低精度的值赋值给高精度的变量
运算符:
1、赋值运算符 =
2、算术运算符 + - * / %
3、关系运算符> < >= <= == !=
4、逻辑运算符 && || !
5、复合赋值运算符 += -= *= /= %=
6、自增++ 、自减-- 当赋值时或者输出时自增自减运算符必须在前才能运算!
7、三目运算符 ?
8、位运算 >> 、 <<
流程控制:
选择控制:
if:
Switch……case、for、while、do……while:
函数:
计算圆与三角形面积
return函数的使用
数组:
用于存放一组相同数据类型的数据集合
导入工具包
向数组中添加数据
冒泡排序:
按数据大小排序
选择排序
JAVA 面向对象
创建对象:
类名 对象名=new 类名();
构造器:构造器也叫构造方法
作用
:创建对象、为属性赋值
特点
:构造器本质上是一个方法
构造器的名字与类名必须一致
构造器没有返回值类型
一个类如果程序员没有自己定义构造系统会提供一个无参构造器,一旦程序员自己定义了有参数构造器,系统将不再提供无参构造。
构造器不能显示调用,只能new
生成构造器的快捷方式:Alt+Shift+s
构造器重载:多个构造器并存,通过参数情况加以区分
参数区分方式:参数的个数
参数的类型
参数的顺序
保存数组
成员与静态
成员方法与成员属性必须通过该类的对象来调用。
静态方法和静态属性 通过类名调用即可,添加static的方法或属性就是静态的;且静态属性在最后赋值时之前的所有值都会变为统一的值。
静态方法中不能调用成员方法与成员属性,反之成员中可以调用静态方法与静态属性;如果一定需要在静态中调用成员,可以在静态中创建一个对象来调用。
调用Math静态数学计算的一部分方法:
针对数据类型的一些错误!
引用数据类型如果不赋值,默认值为null!
基本数据类型赋值,默认值为:
int、long、byte、short 默认为0
float 、double 默认为0.0
char 默认为空白符
boolean 默认为false
运行后报错:java.lang.NullpointerException是空指针异常
对一个值为空 ,进行了引用或者是调用了属性、方法时出现,这时应该找出输出的变量名所赋值是不是有错误!
面向对象三大特征:
1、封装:
实现信息隐藏,提高代码的安全性。
Ctrl+Shift+O快速导入同一个项目下其他包(直接在本包名下写import 包名.类名也可以实现)
软件包:package 用来管理源代码,降低程序的复杂度,便于查看项目的结构
注意:被使用的类不在当前类同项目名下
封装权限:
private私有权限:在属性的数据类型前或方法的返回值前添加private把这个属性或方法隐藏掉,其他类中无法使用。
public公开权限:在属性的数据类型前或方法的返回值前添加public这个属性或方法在同一个项目下所有的包都可以访问。
protected继承权限:子类中可以访问,可以跨包访问。
使用原则
:在没有要求的情况下
属性全部私有化都用:private
方法全部公开都用:public
需要在子类中访问的都用:protected
注:如果需要给私有权限的属性赋值,就需要给这个属性添加一个存值(set)和取值(get)的方法,就是添加一个public公开权限的方法参数中把这个属性放进去。可使用快捷键Alt+Shift+s如下图:
使用存值(set)和取值(get)的方法:
2、继承:
实现代码复用,提高代码的重用率。(特别是当之前版本的类不能更改代码的时候用!)抽象类为父类!
给子类继承构造器时的快捷键Alt+Shift+s
给父类继承子类:
子类名 extends 父类名
当父类属性用
private
权限时, 调用父类的有参构造器,初始化继承来的属性的方法
当父类属性用
protected
权限时, 调用父类的有参构造器,初始化继承来的属性的方法
注:子类的构造器会无条件的调用父类的构造器,所以创建父类构造器时必须要有一个无参构造器!
子类添加属性且权限是
private
私有权限时,赋值的使用方法
子类方法覆盖父类方法的同时调用父类方法时,返回值类型、方法名、参数要一样,且权限不能比父类的权限严格!不能抛出更宽泛的异常。
object:它是所有引用数据类型的默认父类
toString 覆盖属性名,快捷键Alt+Shift+s
3、多态:
多态建立在继承的基础之上,没有继承就没有多态,多态的目的是让代码更灵活,便于扩展。
语法:
以父类去new子类,可避免以后子类出现改变时,可进行覆盖,且new的哪一个子类就时用的哪一个子类的方法:
父类名 自定义别名=new 子类名();
自定义别名.子类的方法名;
强制类型转换
:把类对象赋值给子类类型,强转的目的,调用子类特有的方法,
同是子类直接不能转换,强制类型转换要先用多态,父类new子类创建一个对象。
可以使用
instanceof 关键字判断一个对象是哪种类型
,且可以用if判断进行强转:
父类用数组保存各种子类对象,按照数组下标输出
父类类型作为参数;父类类型作为返回值。
抽象类:
用abstract修饰的类;用abstract修饰方法。
注:抽象类中可定义抽象的方法,没有方法体{};抽象类不能用自己new自己创建对象实例化,可以使用多态形式,用自己new子类创建对象实例化,子类必须对父类为抽象类的抽象方法和构造器进行覆盖
接口:
定义一个接口用interface修饰;接口中方法用abstract修饰抽象方法。
注:
接口中没有构造器,只能定义常量和抽象方法 ;不能用自己new自己创建对象实例化,可以使用多态形式,用自己new子类创建对象实例化,子类必须对接口为抽象类的抽象方法进行覆盖
子类(实现类)继承接口:
子类名 implements 接口名
注:
一个子类可以和多个接口继承,每个接口用,分开,每个接口中的抽象方法都要在子类中进行覆盖;在new对象时可用多态和强制类型转换来实现;在
子类方法输出中添加接口的属性
直接用
接口名.属性
。强制类型转换要先用多态,父类new子类创建一个对象。
扩展接口(子接口):
当一个接口继承另一个接口时,子接口会同时把父接口的方法继承过来,且子接口可再创建扩展一个方法
标志接口:
没有任何的抽象方法,仅仅是为了把多个类之间的关系(统一数据类型)
单例模式:
一个类只有一个对象,构造器权限为private,在自己的类中创建一个静态对象方法。
final最终的:
1、修饰变量(属性),定义一个常量(附静态值),不能再被赋值。
2、修饰类:修饰后不能继承,这个类是最终的。
3、修饰方法:修饰后方法不能不能被子类继承。
数据类型的存储原理:
八大基本数据类型(int、double、float):存内容,当赋值内容为多少就是多少。基本数据类型可以直接用==来确认对比数据。
引用数据类型(String):存地址,当赋值时不是存的不是内容,而是地址;应用数据类型可以用equals来确认比对数据。
API的使用:
String字符串
StringBuilder可变字符串:
可在原本的内容上操作,不会产生垃圾;可以把多个字符拼接成一个字符串。
String不可变字符串:
不能在原来的内容上操作,操作后会产生额外的垃圾字符串。
StringBuffer:
作用与StringBuilder相同,StringBuffer是线程安全的,适用于多线程,StringBulider是线程安全的,单线程环境下效率比StringBuffer高。
date日期:
需要导入工具包import java.util.date
SimpleDateFormat:
自定义日期格式,需要导入工具包import Java.text.SimpleDateFormat
Calender日历:
需要导入工具包import Java.util.Calendar
包装类:
进本数据类型对应的引用数据类型(对应的基本数据类型包装)。可实现强制类型转换。
对应的单词:
byte -----→ Byte
int -----→ Integer
short -----→ Short
long -----→ Long
double -----→ Double
float -----→ Float
boolean -----→ Boolean
char -----→ Character
随机数Random:
需要导入Random工具包import java.util.Random
产生需要输入的规定数字以内的随机数用nextInt。
全球唯一码UUID:
可结合Random产生随机的UUID
Iterator集合框架
List接口:
有序可重复
ArrayList接口的实现类:
需导入工具包import java.util.ArrayList;线程是不安全的,扩容时增长一半;底层是依靠Object数组来实现的,所以查询效率高(支持下标访问),增删改效率低(数组扩容,插入元素,删除元素,会造成位置移动)。
ArrayList用来做类似于数组保存
ArrayList API的使用:
LinkedList接口的实现类:
需导入工具包import java.util.LinkedList;比ArrayList多了先进先出的队列的操作;底层是链表形式存储的,所以查询效率低(需要节点间的联系关系,逐级搜索),增删效率高(不需要维护节点的位置,只需要更新联系地址)。
Vector接口实现类:
需导入工具包import java.util.Vector;和ArrayList用法已经存值原来相同,底层是依靠Object数组来实现的,具备的操作方法绝大多数都是线程安全的;单线程效率不如ArrayList。扩容时增长1倍。
Set接口:
无序不可重复
HashSet接口实现类:
需导入工具包import java.util.HashSet; 底层依靠HashMap实现的,无序不重复(不像数组一样是有顺序保存的,而且数据不会重复,即使有重复的也会去掉)
确认数据存储地址与数据哈希值改变为相等的来确认数据内容是否重复。
TreeSet接口实现类:
需导入工具包import java.util.TreeSet;添加的类型必须是已经实现了Comparable类,且添加的数据类型为基本数据类型或单个引用数据类型的可排序,覆盖compareTo()中的方法,返回值有-1(降序)、+1(升序)、0等于(不变) 这三种排序。
泛型:
为集合指明存储元素的类型,所使用的类型必须是引用数据类型,八大基本数据类型不能泛型但可以使用相对应的包装类型。
Map映射接口:
HashMap:
需导入工具包import java.util.HashMap;按照key来比对,有重复的key后面的会把前面的覆盖了。HashSet接口建立在HashMap之上;HashMap依靠哈希表实现,底层为散列表,哈希表是一种数组和链表的数据结构;当给键值添加数据时,首先判断key的哈希值是否已经存在,如果已经存在则判断key里的equals()是否相同,如果不同就存入同一个链表上,反之就不存入该键值。线程是不安全,且支持null作为key。
HashTable:
需导入工具包import java.util.HashTable;继承于Dictionary(字典),且又实现了Map接口,所以API和HashMap是一样的,不支持null为key,线程是安全的。
Properties:
需导入工具包import java.util.Properties;属性类,是HashTable的子类,在高级框架中使用到,一般用来存储软件的意思。
Stack栈:
有序为后进先出;需导入工具包import java.util.Stack;继承Vector的方法。
异常处理:
提高代码的健壮性,当代码出现错误时,不影响后续代码的运行。
异常类型:
运行时异常:
RuntimeException及其子类;不需要捕获和处理,这种类型的异常在编码阶段时无法预计到的,编译时也不会提醒,运行时会爆发出来
非运行时异常(检查异常):
Exception;除了运行时异常其他都是非运行时异常;在编译过程中就会提醒,必须处理,否则编译不通过。
异常处理方法:
try{
异常代码
}catch(异常类型 e){
//这里的异常类型一定要比后面的小
一旦发生异常就显示这里的提示输出
}catch(异常类型 e){
//这里的异常类型一定要比前面的大
一旦发生异常就显示这里的提示输出
}finally{
无论是否发生异常都会执行这里的提示输出
}
抛出异常:
跳过这个异常,在方法的参数()后声明抛出异常throws Exception 如:public void 方法名() throws Exception{}
声明抛出异常后,自己的方法本就是一个异常的,别人调用这个方法要进行处理
常见的异常: