java基础
java:Java是一门面向对象的编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程 。
Java具有简单性、面向对象、分布式、健壮性、安全性、平台独立与可移植性、多线程、动态性等特点 。Java可以编写桌面应用程序、Web应用程序、分布式系统和嵌入式系统应用程序等
注释:java注释有三种 单行注释 多行注释 文档注释
1.平时我们编写代码,在代码量比较少的时候,我们还可以看懂我们自己写的,但是当项目结构一旦复杂起来,我们就需要用到注释了
2.注释并不会被执行,是给我们写代码的人看的
3.书写注释是一个非常好的习惯
4.平时写代码一定主义规范
单行注释 //
多行注释/* */
文档注释/** */
标识符 关键字
关键字 | 含义 |
abstract | 抽象类或方法 |
assert | 用来查找内部程序错误 |
break | 跳出一个switch或循环 |
byte | 8位整数类型 |
case | switch的一个分支 |
catch | 捕获异常的try块子句 |
class | 定义一个类类型 |
continue | 在循环末尾继续 |
default | switch的缺省语句 |
do | do/while循环最前面的语句 |
double | 双精度浮点数类型 |
else | if语句的else子句 |
enum | 枚举类型 |
extends | 定义一个类的父类 |
final | 一个常量,或不能覆盖的一个类或方法 |
finally | try块中总会执行的部分 |
float | 单精度浮点数类型 |
for | 一个循环类型 |
if | 一个条件语句 |
implements | 定义一个类实现的接口 |
import | 导入一个包 |
instanceof | 测试一个对象是否是某个类的实例 |
int | 32位整型数 |
interface | 接口,一种抽象类型,仅有方法和常量的定义 |
long | 64位长整数型 |
native | 由宿主系统实现的一个方法 |
new | 分配新的类实例 |
null | 一个空引用 |
package | 包含类的一个包 |
private | 表示私有字段,或者方法等,只能从类内部访问 |
protected | 表示保护类型字段 |
public | 表示共有属性或者方法 |
return | 从一个方法中返回 |
short | 16位整数类型 |
static | 这个特性是这个类特有的,而不属于这个类的对象 |
strictfp | 对浮点数计算使用严格的规则 |
super | 超类对象或构造函数 |
switch | 选择语句 |
synchronized | 对线程而言是原子的方法或代码块 |
this | 当前类的一个方法或构造函数的隐含参数 |
throw | 抛出一个异常 |
throws | 一个方法可能抛出的异常 |
transient | 标志非永久性的数据 |
try | 捕获异常的代码块 |
void | 标记方法不返回任何值 |
volatile | 标记字段可能会被多个线程同时访问,而不做同步 |
while | 一种循环 |
标识符:
1.所有的标识符都应该以字母(A-z或a-z),美元符($)、或者下划线(_)开始
2.首字符之后可以是字母(A-Z或者a-z),美元符($)、下划线(_)开始或数字的任何字符组合
3.不能使用关键字作为变量名或方法名
4.标识符是大小写敏感的
5.合法标识符举例:age、$salary、_value、__1_value
6.非法标识符举例:123abc、-salary
可以使用中文名,但是也不建议这样去使用,也不建议用拼音,很low
数据类型:
强类型语言
要求变量的使用要严格符合规定,所有变量都必须先定义才能使用
弱类型语言
要求变量的使用要符合规定,所有变量都必须先定义才能使用
java的数据类型分为两大类
基本类型
引用类型
1bit表示一位
1Byte表示一个字节 1B=8b 1024B=1kB 1024KB=1M 1024M=1G 1024G=1TB
进制 二进制 十进制 十六进制0x 0~16(0~9 A-F)
10 1010 1 a
浮点数 有限 离散 舍入误差 大约 接近但不等于
最好完全避免使用浮点数进行比较
字符 所有的字符本质还是数字
编码 Unicode 表:(97=a 65=A) 2个字节 65536
转义字符 \t制表符 \n换行
类型转换
由于Java是强类型语言,所有要进行有些运算的时候的,需要用到类型转换
低------------------------------------------------------------->高
byte,short,char-->int-->long-->float-->double
运算中,不同类型的数据转化为同类型,然后进行运算
强制转化 (类型)变量名 高-->低
注意点:1.不能对布尔值进行转换
2.不能把对象类型转换为不相干的类型
3.再把高质量转换到低质量的时候,强制转换
4.转换的时候可能存在内存溢出,或者精度问题!
自动转换 低-->高
变量
变量是什么:就是可以变化的量!
java是一种强类型语言,每个变量都必须声明其类型
java变量是程序中最基本的存储单元,其要素包括变量名,变量类型和作用域
注意事项:
每个变量都有类型,类型可以是基本类型,也可以是引用类型
变量名必须是合法的标识符
变量声明是一条完整的语句,因此每一个声明以分好结束
作用域:类变量 实例变量 局部变量
常量
常量:初始化后不能在改变值!不会变动值
所谓常量可以理解成一中特殊的变量,它的值被设定后,在程序运行过程中不允许被改变
常量名一般使用大写字符
变量的命名规范
所有变量、方法、类名:见名知意
类成员变量:首字母小写和驼峰原则:monthSalary 除了第一个单词以外,后面的单词首字母大写 lastname lastName
局部变量:首字母小写和驼峰原则
常量:大写字母和下划线:MAX_VALUE
类名:首字母大写和驼峰原则:Man,GoodMan
方法名:首字母小写和驼峰原则:run(),runRun()
运算符
java语言支持如下运算符:优先级()
算数运算符:+,-,*,/,%,++,--
赋值运算符 =
关系运算符:>,<,>=,<=.==,!=instanceof
逻辑运算符:&&,||,!
位运算符:&,|,^,~,>>,<<,>>>(了解!!!) << *2 >>/2
条件运算符 ? :
扩展赋值运算符:+=,-=,*=,/=
包机制
为了更好的组织类,java提供了包机制,用于区别类名的命名空间
包语句的语法格式为:
package pkg1[.pkg2[.pkg3]];
一般利用公司域名倒置作为包名
为了能够使用某一个包的成员,我们需要在java程序中明确导入该包。使用“import”语句可完成此功能
Scanner对象
之前我们学的基本语法中我们并没有实现程序和人的交互,但是java给我们提供了这样一个工具类,我们可以获取用户的输入。java.util.Scanner 是java5的新特征,我们可以通过Scanner类获取用户的输入
基本语法:Scanner s=new Scanner(System.in);
通过Scanner类的next()与nextLine()方法获取输入的字符串,在读取前我们一般需要 使用hasNext()与hasNextLine()判断是否还有输入的数据
next()
1.一定要读取到有效字符后才可以结束输入
2.对输入有效字符之前遇到的空白,next()方法会自动将其去掉
3.只有输入有效字符之后才能将其后面输入的空白作为分隔符或者结束符。
4.next()不能得到带有空格的字符串
nextLine()
1.以Enter为结束符也就是说nextLine()方法返回的是输入回车之前的所有字符
2.可以获得空白
顺序结构
1.java的基本结构就是顺序结构,除非特别指明,否则就按照顺序一句一句执行
2.顺序结构是最简单的算法结构
3.语句与语句之间,框与框之间是按照从上到下的顺序进行的,它是由若干个依次执行的处理步骤组成的,它是任何一个算法都离不开的一种基本算法结构
选择结构
if单选泽结构
我们很多时候需要去判断一个东西是否可行,然后我们才去执行,这样一个过程程序中用if语句来表示
语法: if(布尔表达式){ //如果布尔表达式为true 将执行的语句 }
if双选择结构
那现在有个需求,公司要收购-个软件,成功了,给人支付100万元,失败了,自己找人开发。这样的需求用一个if就搞不定了,我们需要有两个判断,需要一个双选择结构, 所以就有了if-else结构
语法 if(布尔表达式){//如果布尔表达式的值为true
}else{//如果表达式为false }
if多选择的结构
我们发现刚才的代码不符合实际情况,真实的情况还可能存在ABCD,存在区间多级判断。比如90-100就是A,80-90 就是B..等等,在生活中我们很多时候的选择也不仅仅只有两个,所以我们需要- -个多选择结构来处理这类问题!
语法 if(布尔表达式1){//如果布尔表达式1的值为true执行代码
}else if(布尔表达式2){//如果布尔表达式2的值为true执行代码
}else if(布尔表达式3){//如果布尔表达式1的值为true执行代码
}else0{//如果以上布尔表达式都不为为true执行代码}
嵌套的if结构
使用嵌套的f...else语句是合法的。也就是说你可以在另一个if 或者else if语句中使用if或者else if语句。你可以像if 语句-样嵌套else if..else
语法 if(布尔表达式1){ //如果布尔表达式1为true执行代码
if(布尔表达式2){ //如果布尔表达式2的值为true执行代码
}
}
switch多选择结构
多选择结构还有一个实现方式就是switch case语句
Switch case语句判断一个变量与一系列值中是否相等,每个值称为一个分支。
switch 语句中的变量类型可以是:
byte、short、int、或者char
从java SE7开始
switch支持字符串String类型了
同时case标签必须为字符串常量或字面量
while循环
while是最基本的循环他的结构为
while(布尔表达式){
//循环内容
}
只要布尔表达式为true循环就会一直执行下去
我们大多数情况是会让循环停止下来的我们需要一个表达式失效的方式来结束循环
少部分情况下需要一直循环,比如服务器的请求响应监听 等
循环条件一直为true就会造成无限循环【死循环】我们正常的业务编程中应该避免死循环,会影响程序性能或者造成程序卡死崩溃
do...while循环
对于while语句而言,如果不满足条件,则不能进入循环但有时候我们需要即使不满足条件,也至少执行一次。
do...while循环和while循环相似,不同的是,do...while循环至少会执行一次
do{
//代码语句
} while(布尔表达式);
while和do...while区别
while先判断后执行,do...while先执行后判断
do...while总是保证 循环体会被至少执行一次!这是它们的主要差别
for循环
虽然所有循环结构都可以用while或者do...while表示,但Java提供了另- -种语句一for循环,使一些循环结构变得更加简单。
for循环语句是支持迭代的一种通用结构,是最有效、最灵活的循环结构。
for循环执行的次数是在执行前就确定的。
语法格式
for(初始化;布尔表达式;更新){
//代码语句
}
break,continue:
break在任何循环语句的主体部分,均可用break控制循环的流程。break用于强行退出循环,不执行循环中剩余的语句。(break语句也在switch语句中使用)
continue语句用在循环语句体中,用于终止某次循环过程. 即跳过循环休由尚未执行的语句,接着进行下一次是否执行循环的判定。
方法是什么:
Java方法是语句的集合,它们在一-起执行一个功能。
方法是解决-类问题的步骤的有序组合
方法包含于类或对象中
方法在程序中被创建,在其他地方被引用
设计方法的原则:
方法的本意是功能块,就是实现某个功能的语句块的集合。我们设计方法的时候,最好保持方法的原子性,就是一个方法只完成1个功能,这样利于我们后期的扩展,
方法的定义
Java的方法类似于其它语言的函数,是一段用来完成特定功能的代码片段, 一般情况下,定义一个方法包含以下语法:
方法包含一个方法头和一个方法体。下面是一个方法的所有部分:
修饰符:修饰符,这是可选的,告诉编译器如何调用该方法。定义了该方法的访问类型。
返回值类型:方法可能会返回值。returnValueType 是方法返回值的数据类型。有些方法执行所需的操作,但没有返回值。在这种情况下,returnValue Type是关键字void.
方法名:是方法的实际名称。方法名和参数表共同构成方法签名。
参数类型:参数像是一个占位符。当方法被调用时,传递值给参数。这个值被称为实参或变量。参数列表是指方法的参数类型、顺序和参数的个数。参数是可选的,方法可以不包含任何参数。
形式参数:在方法被调用时用于接收外界输入的数据。 修饰符返回值类型方法名(参数类型参数名){
实参:调用方法时实际传给方法的数据。
方法体:方法体包含具体的语句,定义该方法的功能。 方法体
return返回值;
}
方法的重载
重载就是在一一个 类中,有相同的函数名称,但形参不同的函数。
方法的重载的规则:
方法名称必须相同。
参数列表必须不同(个数不同、或类型不同、参数排列顺序不同等)。
方法的返回类型可以相同也可以不相同。
仅仅返回类型不同不足以成为方法的重载。
实现理论:
方法名称相同时,编译器会根据调用方法的参数个数、参数类型等去逐个匹配,以选择对应的方法,如果匹配失败,则编译器报错。
可变参数
JDK 1.5开始,Java支持传递同类型的可变参数给一一个方法。
在方法声明中,在指定参数类型后加一个省略号(..)。
一个方法中只能指定-个可变参数,它必须是方法的最后一个参数。任何普通的参数必须在它之前声明。
public" static”void- printMax( double... numbers){
if (numbers .length == 0) {
System. out. println("No argument passed");
return;
}
double result = numbers[0];
//排序!
for (int i = 1; i < numbers.length; i++){
if (numbers[i] > result) {
result = numbers[i];
}
}
System. out . print1n("The max value is”+ result) ;
}
递归
A方法调用B方法,我们很容易理解!
递归就是: A方法调用A方法!就是自己调用自己
利用递归可以用简单的程序来解决一 些复杂的问题。它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。
递归结构包括两个部分:
递归头:什么时候不调用自身方法。如果没有头,将陷入死循环。
递归体:什么时候需要调用自身方法。
数组的定义
数组是相同类型数据的有序集合
数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成
其中,每一个数据称作一个数组元素,每个数组元素可以通过一个下标来访问它们
声明创建
数据类型[] 变量=new 数据类型[数组的长度];
数据的元素通过索引访问的。数组索引从0开始
获取数组长度:变量.length
三种初始化
静态初始化
数据类型[] 变量={数据1,数据2,数据3...}
动态初始化
数据类型[] 变量=new 数据类型[数组的长度]
变量[索引]=值;
数组的默认初始化
数组是引用类型,它的元素相当于类的实例变量,因此数组一经分配空间,其中的每个元素也被按照实例变量同样的方式被隐式初始化
数组的四个基本特点
其长度是确定的。数组一旦被创建,它的大小就是不可以改变的。
其元素必须是相同类型,不允许出现混合类型。
数组中的元素可以是任何数据类型,包括基本类型和引用类型。
数组变量属引用类型,数组也可以看成是对象,数组中的每个元素相当于该对象的成员变量。
数组本身就是对象,Java中对象是在堆中的,因此数组无论保存原始类型还是其他对象类型,数组对象本身是在堆中的。
数组边界
下标的合法区间[0,length-1],如果越界就会报错
ArrayIndexOutBoundsException:数组下标越界异常!
小结:
数组是相同数据类型(数据类型可以为任意类型)的有序集合
数组也是对象。数组元素相当于对象的成员变量
数组的长度是确定的,不可变的。如果越界则报:ArrayIndexOutofBounds
多维数组
多维数组可以看成是数组的数组比如二维数组就是一个特殊的一维数组,其每一个元素都是一个一维数组
二维数组
数据类型 变量[][]=new 数据类型[数组的长度][数组的长度]
解析:以上二维数组可以看成一个几行几列的数组 ---前面的是行 ---后面的为列
Arrays类
数组的工具类java.util.Arrays
由于数组对象本身并没有什么方法可以供我们调用,但API中提供了一个工具类Arrays供我们使用,从而可以对数据对象进行一些基本的操作。
查看JDK帮助文档
Arrays类中的方法都是static修饰的静态方法,在使用的时候可以直接使用类名进行调用,而"不用"使用对象来调用(注意:是"不用"而不是"不能")
具有以下常用功能:
给数组赋值:通过fill方法
对数组排序:通过sort方法,按升序
比较数组:通过equals方法比较数组中元素值是否相等
查找数组元素:通过binarySearch方法能对排序好的数组进行二分查找发操作
冒泡排序
冒泡排序无疑是最为出名的排序算法之一,总共有八大排序
两层循环,外层冒泡轮数,里层依次比较