一、Java入门
1、最常用DOS命令
DOS命令基本已过时,但仍有几个常用命令需要掌握,以便后续使用。
2、用eclipse写的第一个代码
运行可使用快捷键:Ctrl+F11(部分笔记本电脑需要先按“Esc+Fn”键将F快捷键的功能作用取消)
运行结果:
二、数据类型和运算符
1、注释
注释不会出现在字节码文件中,根据注释功能的不同,主要分为:
(1)单行注释:“//”开头;
(2)多行注释:以“/*”开头,“*/"结尾,注意不可嵌套使用(可在句内使用);
(3)文档注释:以“/**”开头,“*/"结尾,可以生成项目的API。
2.标识符
用来给变量、类、方法以及包进行命名。
使用规范:
识符必须以字母、下划线、美元符号$开头。
标识符其它部分可以是字母、下划线"_”、美元符"$"和数字的任意组合。
Java标识符大小写敏感,且长度无限制。
标识符不可以是Java的关键字(如class)。
表示类名的标识符:每个单词的首字母大写,如Man, GoodMan
表示方法和变量的标识符:第一个单词小写,从第二个单词开始首字母大写,我们称之为“驼峰原则”,如eat(), eatFood()
[注意] : Java不采用通常语言使用的ASCI字符集,而是采用Unicode这样标准的国际字符集。
因此,这里字母的含义不仅仅是英文,还包括汉字(但不建议使用汉字来定义标识符!)等等。
3、关键字/保留字(不需要死记硬背)
4、变量
变量本质上就是代表一个”可操作的存储空间”, 空间位置确定 ,但是放置什么值不确定。我们可通过变量名来访问“对应的存储空间”, 从而操纵这个 “存储空间”存储的值。
Java是一种强类型语言,每个变量都必须声明其数据类型。变量的数据类型决定了变量占据存储空间的大小。比如, int a=3;表示a变量的空间大小为4个字节。
变量作为程序中最基本的存储单元,其要素包括变量名, 变量类型和作用域。变量在使用前必须对其声明,只有在变量声明以后,才能为其分配相应长度的存储空间。
注意:
每个变量都有类型,类型可以是基本类型,也可以是引用类型;
变量名必须是合法的标识符;
变量声明是一条完整的语句,必须以分号结束; 不提倡一行声明多个变量。
声明变量:
变量的分类:
(1)局部变量:使用前需先定义、初始化(赋初值)。
(2)成员变量(实例变量):定义于方法外部、类的内部,从属于对象。可以自动初始化。
(3)静态变量:使用static定义,从属于类。
5.常量
主要利用关键字final定义一个常量。(建议命名常量时使用大写字母和下划线)
6、基本数据类型
(1)整形
以byte为例,超出范围会报错。
(2)浮点型
默认类型是double
注意:不要使用浮点数进行比较!需要比较请使用BigDecimal类。
(3)字符型
char 类型用来表示在Unicode编码表中的字符。用单引号。
注意:String类,其实是字符序列。
(4)boolean类型
boolean类型有两个常量值,true和false,在内存中占一位(不是一个字节),不可以使用 0 或非 0 的整数替代 true 和 false ,这点和C++不同。
boolean 类型用来判断逻辑条件,一般用于程序流程控制 。
boolean
flag ;
flag =
true
;
//或者flag=false;
if
(flag) {
// true分支
}
else
{
// false分支
}
注意:
7、运算符
都很重要,全部掌握。
(1)算数运算符
二元运算符的运算规则:
整数运算:
1. 如果两个操作数有一个为Long, 则结果也为long。
2. 没有long时,结果为int。即使操作数全为short,byte,结果也是int。
浮点运算:
3. 如果两个操作数有一个为double,则结果为double。
4. 只有两个操作数都是float,则结果才为float。
取模运算:
1.其操作数可以为浮点数,一般使用整数,结果是“余数”,“余数”符号和左边操作数相同,如:7%3=1,-7%3=-1,7%-3=1。
算术运算符中++,--属于一元运算符,该类运算符只需要一个操作数。
++a:先自增再赋值;a++:先赋值再自增。
(2)赋值及其拓展赋值运算符
(3)关系运算符
关系运算的结果是布尔值:true/false 注意:==、!= 是所有(基本和引用)数据类型都可以使用;
> 、>=、 <、 <= 仅针对数值类型(byte/short/int/long, float/double,以及char)
(4)逻辑运算符
示例: (5)位运算符
注意:&和|既是逻辑运算符,也是位运算符。如果两侧操作数都是boolean类型,就作为逻辑运算符。如果两侧的操作数是整数类型,就是位运算符。
(6)字符串连接符
“+”运算符两侧的操作数中只要有一个是字符串(String)类型,系统会自动将另一个操作数转换为字符串然后再进行连接。
(7)条件运算符
语法:x ? y : z
(8)运算符优先级
建议:1.优先使用小括号;
2.逻辑非>逻辑与>逻辑或。如:a||b&&c的运算结果是:a||(b&&c)
8.1、自动类型转换
自动类型转换指的是容量小的数据类型可以自动转换为容量大的数据类型。
黑色实线表示无数据丢失的自动类型转换,虚线表示在转换时可能会有精度的损失。
可将整型常量直接赋值给byte、 short、 char等类型变量,而不需要进行强制类型转换,只要不超出其表数范围即可。
8.2强制类型转换
又被称为造型,用于显式的转换一个数值的类型。在有可能丢失信息的情况下进行的转换是通过造型来完成的,但可能造成精度降低或溢出。
语法:(type)var
8.3基本类型转化时常见的错误和问题
(1)操作比较大的数时,要留意是否溢出,尤其是整数操作时。
(2)不要命名名字为l的变量,l容易和1混淆。long类型使用大写L不要用小写。
9.使用Scanner获取键盘输入
结果如下:
三、控制语句
控制语句分为三类:顺序、选择和循环。
“顺序结构”代表“先执行a,再执行b”的逻辑;
“选择结构”代表“如果…,则…”的逻辑;
“循环结构”代表“如果…,则再继续…”的逻辑。
1.选择结构
(1)if单选择结构
Math类的使用: 1.java.lang包中的Math类提供了一些用于数学计算的方法。
2.Math.random()该方法用于产生一个0到1区间的double类型的随机数,但不包括1。
int i = (int) (6 * Math.random()); //产生:[0,5]之间的随机整数
(2)if-else双选择结构
条件运算符有时候可用于代替if-else
与结果相同。
(3)if-else if-else多选择结构
(4)switch多选择结构
switch语句会根据表达式的值从相匹配的case标签处开始执行,一直执行到break语句处或者是switch语句的末尾。如果表达式的值与任一case值不匹配,则进入default语句(如果存在default语句的情况)。
switch语句中case标签允许使用字符串(String)。
遇到多值判断的时候使用switch,也完全可以用if-else if-else多选择结构代替。
2、循环结构
(1)当型:当布尔表达式条件为true时,反复执行某语句,当布尔表达式的值为false时才停止循环,比如:while与for循环。
(2)直到型:
先执行某语句, 再判断布尔表达式,如果为true,再执行某语句,如此反复,直到布尔表达式条件为false时才停止循环,比如do-while循环。
2.1 while循环
例:求1-100的累加和
2.2 do-while循环
先执行循环体,然后再判断布尔表达式的值,总是保证循环体至少会被执行一次。
上一例题利用do-while实现做法:
2.3 for循环
语法:for (初始表达式;布尔表达式;迭代因子)
{循环体;}
逗号运算符
无限循环:for( ; ; )
2.4嵌套循环
在一个循环语句内部再嵌套一个或多个循环,称为嵌套循环。while、do-while与for循环可以任意嵌套多层。
2.5 break、continue语句
在任何循环语句的主体部分,均可用break控制循环的流程。break用于强行退出循环,不执行循环中剩余的语句。
continue 语句用在循环语句体中,用于终止某次循环过程,即跳过循环体中尚未执行的语句,接着进行下一次是否执行循环的判定。
注意:
1. continue用在while,do-while中,continue 语句立刻跳到循环首部,越过了当前循环的其余部分。
2. continue用在for循环中,跳到for循环的迭代因子部分。
2.6带标签的 break、continue语句
goto关键字很早就在程序设计语言中出现。尽管goto仍是Java的一个保留字,但并未在Java语言中得到正式使用;Java没有goto语句。然而,在break和continue这两个关键字的身上,我们仍然能看出一些goto的影子---带标签的break和continue。
“标签”是指后面跟一个冒号的标识符,例如:“label:”。对Java来说唯一用到标签的地方是在循环语句之前。而在循环之前设置标签的唯一理由是:我们希望在其中嵌套另一个循环,由于break和continue关键字通常只中断当前循环,但若随同标签使用,它们就会中断到存在标签的地方。
3、语句块
语句块中定义的变量作用域只限于语句块。{。。。。}
4、方法
声明格式:[修饰符1 修饰符2 …] 返回值类型 方法名(形式参数列表){
Java语句;… … …
}
方法就是一段用来完成特定功能的代码片段,类似于其它语言的函数。用于定义该类或该类的实例的行为特征和功能实现。 方法是类和对象行为特征的抽象。很类似于面向过程中的函数。面向过程中,函数是最基本单位,整个程序由一个个函数调用组成。面向对象中,整个程序的基本单位是类,方法是从属于类和对象的。
调用方式: 对象名.方法名(实参列表)
说明: 1. 形式参数:在方法声明时用于接收外界传入的数据。
2. 实参:调用方法时实际传给方法的数据。
3. 返回值:方法在执行完毕后返还给调用它的环境的数据。
4. 返回值类型:事先约定的返回值的数据类型,如无返回值,必须显示指定为为void。
注意: 1. 实参的数目、数据类型和次序必须和所调用的方法声明的形式参数列表匹配。
2. return 语句终止方法的运行并指定要返回的数据。
3. Java中进行方法调用中传递参数时,遵循值传递的原则(传递的都是数据的副本):
4. 基本类型传递的是该数据值的copy值。
5. 引用类型传递的是该对象引用的copy值,但指向的是同一个对象。
5、方法的重载
一个类中可以定义多个方法名相同,但参数不同的方法。 调用时,会根据不同的参数自动匹配对应的方法。
构成方法重载的条件: 1.不同的含义:形参类型、形参个数、形参顺序不同;
2.只有返回值不同不构成方法的重载;
3.只有形参的名称不同,不构成方法的重载。
6、递归结构
基本思想:自己调用自己。
(1)定义递归头。解答:什么时候不调用自身方法。如果没有头,将陷入死循环,也就是递归的结束条件。
(2)递归体。解答:什么时候需要调用自身方法。
缺点:递归调用会占用大量的系统堆栈,内存耗用多,在递归调用层次多时速度要比循环慢的多,所以在使用递归时要慎重。
注意:
任何能用递归解决的问题也能使用迭代解决。当递归方法可以更加自然地反映问题,并且易于理解和调试,并且不强调效率问题时,可以采用递归;
在要求高性能的情况下尽量避免使用递归,递归调用既花时间又耗内存。
四、面向对象基础
1、面向过程和面向对象
2、对象的进化史
3、对象和类的概念
(1)第一个类的定义
(2)属性 (field)
属性用于定义该类或该类对象包含的数据或者说静态特征。属性作用范围是整个类体。在定义成员变量时可以对其初始化,如果不对其初始化,Java使用默认的值对其初始化。
(3)方法
用于定义该类或该类实例的行为特征和功能实现。
(4)一个典型类的定义和UML图
4、面向对象的内存分析
Java虚拟机的内存可以分为三个区域:栈stack、堆heap、方法区method area。
5、构造方法
构造器也叫构造方法(constructor),用于对象的初始化。
6、构造方法的重载
7、垃圾回收机制
Java引入了垃圾回收机制,令C++程序员最头疼的内存管理问题迎刃而解。Java程序员可以将更多的精力放到业务逻辑上而不是内存管理工作上,大大的提高了开发效率。
(1)原理和算法
任何一种垃圾回收算法一般要做两件基本事情:
1. 发现无用的对象
2. 回收无用对象占用的内存空间。
1. 引用计数法 2. 引用可达法(根搜索算法)
(2)通用的分代垃圾回收机制
垃圾回收过程:
1、新创建的对象,绝大多数都会存储在Eden中;
2、当Eden满了(达到一定比例)不能创建新对象,则触发垃圾回收(GC),将无用对象清理掉, 然后剩余对象复制到某个Survivor中,如S1,同时清空Eden区
3、当Eden区再次满了,会将S1中的不能清空的对象存到另外一个Survivor中,如S2,同时将Eden区中的不能清空的对象,也复制到S1中,保证Eden和S1,均被清空。
4、重复多次(默认15次)Survivor中没有被清理的对象,则会复制到老年代Old(Tenured)区中,
5、当Old区满了,则会触发一个一次完整地垃圾回收(FullGC),之前新生代的垃圾回收称为(minorGC)
(3)JVM调优和Full GC
在对JVM调优的过程中,很大一部分工作就是对于Full GC的调节。有如下原因可能导致Full GC:
1.年老代(Tenured)被写满
2.持久代(Perm)被写满
3.System.gc()被显式调用(程序建议GC启动,不是调用GC)
4.上一次GC之后Heap的各域分配策略动态变化
(4)开发中容易造成内存泄露的操作
创建大量无用对象;静态集合类的使用;各种连接对象(IO流对象、数据库连接对象、网络连接对象);未关闭监听器的使用
8、this关键字
this的本质就是“创建好的对象的地址”。
this最常的用法:
1. 在程序中产生二义性之处,应使用this来指明当前对象;普通方法中,this总是指向调用该方法的对象。构造方法中,this总是指向正要初始化的对象。
2. 使用this关键字调用重载的构造方法,避免相同的初始化代码。但只能在构造方法中用,并且必须位于构造方法的第一句。
3. this不能用于static方法中。
代表当前对象示例:
9、static关键字
static修饰的成员变量和方法,从属于类。普通变量和方法从属于对象的。
10、静态初始化块
用于类的初始化操作!在静态初始化块中不能直接访问非static成员。
静态初始化块执行顺序(学完继承再看这里):
1. 上溯到Object类,先执行Object的静态初始化块,再向下执行子类的静态初始化块,直到我们的类的静态初始化块为止。
2. 构造方法执行顺序和上面顺序一样!
11、参数传值机制
Java中,方法中所有参数都是“值传递”,也就是“传递的是值的副本”。 也就是说,我们得到的是“原参数的复印件,而不是原件”。因此,复印件改变不会影响原件。
引用类型指的是“对象的地址”。
12、包
13、package
要点:1. 通常是类的第一句非注释性语句。
2. 包名:域名倒着写即可,再加上模块名,便于内部管理类。
使用:
(1)JDK中的主要包
(2)导入类import
如果我们要使用其他包的类,需要使用import导入,从而可以在本类中直接通过类名来调用,否则就需要书写类的完整包名和类名。import后,便于编写代码,提高可维护性。
要点:1. Java会默认导入java.lang包下所有的类,因此这些类我们可以直接使用。
2. 如果导入两个同名的类,只能用包名+类名来显示调用相关类:
java.util.Date date=new java.util.Date();
(3)静态导入
使用:
五、面向对象进阶
重点针对面向对象的三大特征:继承、封装、多态。
1、继承
(1)继承的实现
(2)instanceof运算符
instanceof是二元运算符,左边是对象,右边是类;当对象是右面类或子类所创建对象时,返回true;否则,返回false。
(3)要点
(4)方法的重写override
2.1Object类基本特性
2.2toString()方法
Object类中定义有public String toString()方法,其返回值是 String 类型。
2.3==和equals方法
3、super关键字
3.1继承树追溯
4.1封装的作用和含义
4.2 封装的实现—使用访问控制符
4.3封装的使用细节
(工作用)
封装示例:
5、多态
6、对象的转型(casting)
父类引用指向子类对象,我们称这个过程为向上转型,属于自动类型转换。
向上转型后的父类引用变量只能调用它编译类型的方法,不能调用它运行时类型的方法。这时,我们就需要进行类型的强制转换,我们称之为向下转型。
7、final关键字
六、数组
1、数组概述和特点
相同类型数据、有序集合
2.1数组声明
注意:
2.2初始化
数组的初始化方式总共有三种:静态初始化、动态初始化、默认初始化。
(1)静态初始化:除了用new关键字来产生数组以外,还可以直接在定义数组的同时就为数组元素分配空间并赋值。
(2)动态初始化:数组定义与为数组元素分配空间并赋值的操作分开进行,通过下标赋值。
(3)默认初始化
3.1数组的遍历
3.2 for-each循环
专门用于读取数组或集合中所有的元素。
3.3数组的拷贝
3.4java.util.Arrays类
4、多维数组
5、数组存储表格数据
6.1冒泡排序
6.2优化算法
7、二分法查找
前提:数据排好序
过程如下: