Java
Java的优势和特性
- 简单性
- 面向对象
- 可移植性
- 高性能
- 分布式
- 动态性
- 多线程
- 安全性
- 健壮性
Java三大版本
- JavaSE:标准版(桌面程序,控制台开发…)
- JavaME:嵌入式开发(手机,小家电…)
- JavaEE:企业级开发(web端,服务器开发…)
JDK、JRE、JVM
- JDK(开发者工具包):Java Development Kit
- JRE(运行环境):Java Runtime Environment
- JVM(虚拟机):JAVA Virtual Machine
注释
-
单行注释 //
-
多行注释 /* */
-
文档注释 /** */
标识符和关键字
所有标识符都要以英文字母、$、_开头 。
不能使用关键字作为变量名或方法名。
标识符是大小写敏感的。
数据类型
强类型语言
要求变量的使用要严格符合规定,所有变量都必须先定义才能使用
弱类型语言
Java的数据类型分为两大类
基本类型 :
数值类型:
byte、short、int、long、
float(有限、离散、舍入误差、接近但不等于)、double、
char(2字节)、boolean(1字节)
引用类型:类、接口、数组
位(bit):是计算机内部数据存储的最小单位
字节(byte):是计算机中数据处理的基本单位,用B表示1B=8bit
字符:是指计算机中使用的字母、数字、字和符号
整数拓展
进制:二进制(0b) 十进制 八进制(0) 十六进制(0x)
转义字符
\t 制表符 \n换行
类型转换
低--------------------------------------------------------------------->高
byte,short,char->int->long->float->double
低->高:自动转换 高->低:强制转换
注意
1.不能对布尔值进行转换
2.不能把对象类型转换为不相干的类型
3.在把高容量转换到低容量的时候,强制转换
4.转换的时候可能存在内存溢出,或者精度问题!
- 强制类型转换
- 自动类型转换
变量
局部变量:必须声明和初始化值
全局变量
实例变量:从属于对象;如果不自行初始化,这个类型的默认值 0 0.0
boolean:默认是false、除了基本类型,其余默认值都是null
类变量:随着类的创建而创建,随着类的消失而消失。
注意事项
-
每个变量都有类型,类型可以是基本类型,也可以是引用类型。
-
变量名必须是合法的标识符。
-
变量声明是一条完整的语句,因此每一个声明都必须已分号结束。
常量
初始化后不能再改变值,不会变动的值。
所谓常量可以理解成一种特殊的变量,它的值被设定后,在程序运行过程中不允许被改变。
final 常量名 = 值;
常量名一般使用大写字符。
变量的命名规范
驼峰原则:变量名或函数名的每一个单词的首字母要大写,第一个单词的字母可大写或者小写
-
所有变量、方法、类名、见名知意
-
类成员变量:首字母小写和驼峰原则
-
局部变量:首字母小写和驼峰原则
-
常量:大写字母和下划线:MAX_VALUE
-
类名:首字母大写和驼峰原则
-
方法名:首字母小写和驼峰原则
运算符
-
算术运算符:+,-,*,/,%,++,–
-
赋值运算符:=,+=,-=,*=,/=
-
关系运算符:>,<,>=,<=,==,!=,instanceof
-
逻辑运算符:&&,||,!
-
位运算符:&,|,^(反):[一样的都变为0,不一样的不变],~,>>(右移)/2,<<(左移)*2,>>>
-
条件运算符:?,:
a++:先自增,后赋值
++a:先赋值,后自增
包机制
-
为了更好的组织类,Java提供了包机制,用于区别类名的命名空间
-
语法格式
- package pkg1[.pkg2[.pkg3…]];
-
导包 :import ……
Java Doc
- javadoc命令是用来生成自己API文档的
- 参数信息
- @author 作者名
- @version 版本号
- @since 指明需要最早使用的jdk版本
- @param 参数名
- @return 返回值情况
- @throws 异常抛出情况
Scanner
-
next():
-
一定要读取到有效字符后才可以结束输入。
-
对输入有效字符之前遇到的空白,next()方法会自动将其去掉。
-
只有输入有效字符后才将其后面输入的空白作为分隔符或者结束符。
-
*next()不能得到带有空格的字符串。
-
-
nextLine():
- 以Enter为结束符,也就是说nextLine()方法返回的输入回车之前的所有字符。
- 可以获得空白。
顺序结构
- java的基本结构就是顺序结构,除非特别指明,否则就按照顺序一句一句执行
- 顺序结构是最简单的算法结构
- 语句与语句之间,框与框之间是按从上到下的顺序进行的,它是由若干个依次执行的处理步骤组成的,它是任何一个算法都离不开的一种基本算法结构。
选择结构
-
if单分支
- if(布尔表达式){//如果布尔表达式为true将执行的语句}
-
if双选择结构
- if(布尔表达式){//如果布尔表达式为true将执行的语句}
- else{//如果布尔表达式为false将执行的语句}
-
if双选择结构
- if(布尔表达式 1){//如果布尔表达式1为true将执行的语句}
- else if(布尔表达式 2){//如果布尔表达式2为true将执行的语句}
- else{//如果布尔表达式都不为true将执行的语句}
-
嵌套的if结构
-
if(布尔表达式 1){//如果布尔表达式1为true将执行的语句
if(布尔表达式 2){//如果布尔表达式2为true将执行的语句}}
-
switch多选择结构
-
多选择结构还有一个实现方式就是switch case语句。
-
switch case语句判断一个变量与一系列值中某个值是否相等,每一个值称为一个分支。
-
switch语句中的变量类型可以是:
- byte、short、int或者char、String。
- 同时case标签必须为字符串常量或字面量。
-
语法格式:
switch(expression){
case value :
//语句
break;//可选
case value :
//语句
break;//可选
default://可选
//语句
}
循环结构
while循环
-
语法格式:
while(布尔表达式){//循环内容}
-
只要布尔表达式为true,循环就会一直执行。(一般情况会让循环停下来,少数会一直执行,比如服务器的请求响应监听)
do…while循环
do{
//代码语句
}while(布尔表达式);
-
对于while语句语言,如果不满足条件,则不能进入循环。但有时候我们需要即使不满足条件,也至少执行一次。
-
while和都-while的区别:
- while先判断后执行。dowhile是先执行后判断。
- Do…while总是保证循环体会至少执行一次!
for循环
for(初始化;布尔表达式;更新){//代码语句}
- for循环语句是支持迭代的一种通用结构,是最有效、最灵活的循环结构。
增强for循环
for(声明语句:表达式){//代码}
- 声明语句:声明新的局部变量,该变量的类型必须和数组元素的类型匹配。其作用域限定在循环语句块,其值与此时数组元素的值相等。
- 表达式:表达式是要访问的数组名,或者是返回值为数组的方法。
break continue
-
break在任何循环语句的主体部分,均可用break控制循环的流程。
break用于强行退出循环,不执行循环中剩余的语句。(也在switch中使用)
-
continue语句在循环体中,用于终止某次循环过程,即跳过循环体中尚未执行的语句,接着进行下一次是否执行循环的判定。
方法
-
Java方法是语句的结合,它们在一起执行一个功能。
- 方法是解决一类问题的步骤的有序集合
- 方法包含于类或对象中
- 方法在程序中被创建,在其他地方被引用
-
设计方法的原则:方法的本意是功能块,就是实现某个功能的语句块的集合。在设计方法的时候,最好保持方法的原子性,就是一个方法只完成1个功能,这样利于我们后期的扩展。
方法的定义
格式:
修饰符 返回值类型 方法名(参数类型 参数名){
……
方法体
……
return 返回值;
}
-
方法包含一个方法头和一个方法体。
-
修饰符:修饰符是可选的,告诉编译器如何调用该方法。定义了该方法的访问类型。
-
返回值类型:方法可能会返回值
-
方法名:是方法的实际名称。方法名和参数表共同构成方法签名。
-
参数类型:参数像是一个占位符。当方法被调用时,传递值给参数。这个值被称为实战或变量。参数列表是指方法的参数类型、顺序和参数的个数。参数是可选的,方法可以不包含任何函数。
-
形式参数:在方法被调用时用于接收外界输入的数据。
-
实参:调用方法时实际传给方法的数据。
-
-
方法体:方法体包含具体的语句,定义该方法的功能。
-
方法调用
- 调用方法:对象名。方法名(实参列表)
方法的重载
- 重载就是在一个类中,有相同的函数名称,但形参不同的函数。
- 方法的重载的规则:
- 方法名称必须相同。
- 参数列表必须不同(个数不同、或类型不同、参数排列顺序不同等)。
- 方法的返回类型可以相同也可以不相同。
- 仅仅返回类型不同不足以成为方法的重载。
重写
需要有继承关系,子类重写父类的方法
- 方法名必须相同
- 参数列表必须相同
- 修饰符:范围可以扩大:public>protected>default>private
- 抛出的异常:范围可以被缩小,但不能扩大;
重写,子类的方法和父类必要一致;方法体不同!
为什么需要重写:
- 父类的功能,子类不一定需要,或者不一定满足!
可变参数
- 在方法声明中,在指定参数类型后加一个省略号(……)
- 一个方法中只能指定一个可变参数,它必须时方法的最后一个参数。任何普通的参数必须在它之前声明。
递归
- 递归就是方法自己调用自己。
- 利用递归可以用简单的程序来解决一些复杂的问题。
- 递归的能力在于用有限的语句来定义对象的无限集合。
- 递归结构:
- 递归头:什么时候不调用自身方法。如果没有头,将陷入死循环。
- 递归体:什么时候需要调用自身方法。
数组
数组的定义
-
数组是相同类型数据的有序集合。
-
数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成。
-
其中,每一个数据称作一个数组元素,每个数组元素可以通过一个下标来访问他们。
数组的四个基本特点
- 长度确定,一旦创建,大小不可以改变。
- 其元素必须是相同类型,不允许出现混合类型。
- 数组中的元素可以是任何数据类型,包括基本类型和引用类型。
- 数组变量属引用类型,数组也可以看成是对象,数组中的每个元素相当于该对象的成员变量。数组对象本身是在堆中的。
三种初始化
-
静态初始化
int[] a = {1,2,3};
-
动态初始化
int[] a = new int[2];
a[0] = 1;
a[1] = 2;
-
数组的默认初始化
- 数组是引用类型,它的元素相当于类的实例变量,因此数组一经分配空间,其中的每个元素也被按照实例变量同样的方式被隐式初始化。
多维数组
- 多维数组可以看成是数组的数组,比如二维数组就是一个特殊的一维数组,其每一个元素都是一个一维数组。
Arrays 类
- Arrays类中的方法都是static修饰的静态方法,在使用的时候可以直接使用类名进行调用,而“不用”使用对象来调用
- 功能
- 给数组赋值:通过fill方法。
- 对数组排序:通过sort方法,按升序。
- 比较数组:通过equals方法比较数组元素值是否相等。
- 查找数组元素:通过binarySearch方法能对排序好的数组进行二分查找法操作。
面向对象
- 面向对象的本质就是:以类的方式组织代码,以对象的组织(封装)数据。
- 从认识论角度考虑是先有对象后有类。对象,是具体的事物。类,是抽象的,是对象的抽象。
- 从代码运行角度考虑是先有类后有对象。类是对象的模板。
- 三大特性:
-
封装:隐藏部分对象的属性和实现细节,对数据的访问只能通过公开的接口。
-
继承:子类(派生类)继承父类的特征和行为。关键字:extends
super //调用父类的构造器,必须要在子类构造器的第一行
必须只能出现在子类方法或者构造方法中!
super和this不能同时调用构造方法
与this的区别
代表的对象不同:
this:本身调用者这个对象
super:代表父类对象的应用
前提
this:没有继承也可以使用
super:只能在继承条件才可以使用
构造方法
this():本类的构造
super():父类的构造
-
多态:对于同一个行为,不同子类对象具有不同的表现形式。
- 多态存在的三个条件1:继承2.重写3.父类引用指向子类对象
注意:多态是方法的多态,属性没有多态性。
父类和子类,有联系 类型转换异常 (ClassCastException)
存在条件:继承关系,方法需要重写,父类引用指向子类对象!
-
类与对象的关系
- 类是一种抽象的数据类型,它是对某一类事物整体描述/定义,但是并不能代表某一个具体的事物。
- 对象是抽象概念的具体实例
- 能够体现出特点,展现出功能的是具体的实例,而不是一个抽象的概念。
创建与初始化对象
- 使用new关键字创建对象
- 使用new关键字创建的时候,除了分配内存空间之外,还会给创建好的对象进行默认的初始化以及对类中构造器的调用。
- 类中的构造器也称为构造方法,是在进行创建对象的时候必须要调用的。并且构造器有以下俩个特点:
- 1.必须和类的名字相同
- 2.必须没有返回类型,也不能写void
抽象类:关键字 abstract
- abstract修饰符可以用来修饰方法也可以修饰类,如果修饰方法,那么该方法就是抽象方法;如果修饰类,那么该类就是抽象类。
- 抽象类中可以没有抽象方法,但是有抽象方法的类一定要声明为抽象类。
- 抽象类,不能使用new关键字来创建对象,它是用来让子类继承的。
- 抽象方法,只有方法的声明,没有方法的实现,它是用来让子类实现的。
- 子类继承抽象类,那么就必须要实现抽象类没有实现的抽象方法,否则该子类也要声明为抽象类。
接口:关键字 interface
- 普通类:只有具体实现
- 抽象类:具体实现和规范(抽象方法)都有!
- 接口:只有规范!
- 接口就是规范,定义的是一组规则
- 接口的本质是契约,就像我们人间的法律一样。
内部类
- 内部类就是在一个类的内部再定义一个类,
- 成员内部类
- 静态内部类
- 局部内部类
- 匿名内部类
异常机制
分类:
- 检查性异常:最具代表的检查性异常是用户错误或问题引起的异常,
- 运行时异常:运行时异常是可能被程序员避免的异常。与检查性异常相反,运行时异常可以在编译时被忽略。
- 错误:错误不是异常,而是脱离程序员控制的问题。错误在代码中通常被忽略。例如,当栈溢出时,一个错误就发生了,它们在编译也检查不到的。
Error
- Error类对象由Java虚拟机生成并抛出,大多数错误与代码编写者所执行的操作无关。
- Java虚拟机运行错误,当JVM不再有继续执行操作所需的内存资源时,将出现OutOfMemoryError。这些异常发生时,Java虚拟机一般会选择线程终止。
- 还有发生在虚拟机试图执行应用时,如类定义错误(NoClassDefFoundError)、链接错误(LinkageError)。这些错误是不可查的,因为他们在应用程序的控制和处理能力之外,而且绝大多数是程序运行时不允许出现的状况。
Exception
- 这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生。
Error和Exception的区别:
Error通常时灾难性的致命的错误,是程序无法控制和处理的,当出现这些异常时,JVM一般会选择终止线程;Exception通常情况下是可以被程序处理的并且在程序中应该尽可能的去处理这些异常。
异常处理机制 :
关键字:
try :监控区域、
catch:捕获异常、
finally:处理善后工作、
throw :手动抛出异常、
throws:方法抛出异常、