l java是一种简单的 ,面向对象的高级语言,安全的 可移植的,性能优异的多线程语言
l Java四大特性:①继承②封装③多态④抽象
l Java平台的两个组件:Java虚拟机和JavaAPI
l JDK: 是java的开发工具包,里面包含了各种类库和工具
l JRE:jre只是一个运行环境而已
l Java程序的执行流程:
java源文件→javac.exe编译→.class类文件→Java虚拟机→本地代码
l class文件就是字节码文件
l 程序翻译的两种形式:编译(速度慢,跨平台)、解释(速度快,不跨平台)
l Java是半编译半解释
l JavaAPI是类库,java虚拟机是将源代码编译成本地机器语言。他们可以阻断本地代码与下层硬件的关联。
l JIT: 即时编译器 作用 :提高执行速度
l 类加载器:为程序的执行加载所需要的全部类,java字节码通过类加载器,为程序的执行加载所需要的全部类,在类加载的过程中,由于是按照先加载启动类库、在加载扩展类、用户自定义类库、从而避免一些非法代码的执行,提高代码的执行安全性
l 世间万物皆是对象,类是对象的集合。对象有属性和行为。
l Java程序的基本单位是类。
l Java平台: javaEE javaME javaSE
l Java的注释方式:单行注释,多行注释,javadoc注释
l Java的关键字(有特定作用的单词,const、goto不能在java中使用)、标识符(自己定义的单词,不能是关键字或保留字,不能以数字开头,包含数字、字母、下划线、$,不能是关键字,严格区分大小写),保留字:true,false,null
l Java数据类型:
基本类型:整型(byte short int long) 浮点型(float double) 字符型(char)
布尔型(boolean)
引用类型:类(class) 接口( interface) 数组
l Java的数据类型的以及其默认的数据类型(Byte—short—int—long—float—double(自转方向))
强转:精度受到丢失
自转:精度不受到丢失
l Java变量的定义与使用:int a=1;
l Java常量的定义与使用:final int a=1;
l Java中的运算符:
增量和减量运算符: ++ --
一元运算符:+ - ~ ! (强制转换)
乘法/除法/取模:* / %
移位运算符: << >> >>>
比较运算符:< <= > >= instanceof
相等运算符:== !=
布尔运算符: 短路和 &&、 和&、 短路或||、 或| 、异或^ 、非!
赋值运算符:=
扩展赋值运算符:*= /= %= += -= <<= >>= >>>= &= ^= !=
三目运算符: (布尔表达式)?语句1:语句2
l ^的数值运算 :先将数字转化为二进制,在依次比较,相同的为0,不同为1,再将的到的二进制数转化为十进制。
l 表达式是由数字、运算符、括号等有意义排列方法所得的组合
l Java程序执行期数据区→栈与堆
栈中的数据会在方法结束后被释放(及时定义、及时使用、及时清理),栈中的运行速度比堆中快,栈中存局部变量被调用的参数,返回值,运算中间结果,基本类型的变量、引用变量。
堆中存放对象,引用所指向的对象
l String数据类型使用+进行拼接
l length()方法可以求出字符串的长度,length属性可以求出数组的长度
l 输入类Scanner与随机数类Random
l Java流程控制——调用方法、选择语句、循环语句
l 选择语句:if语句与switch语句
l if语句中分为三种:单分支if语句、双分支if语句、多分支if语句
l switch语句与case关键字与break关键字的用法
l 循环:循环分为for循环、while循环、do...while循环(至少循环一次)
l continue关键字的用法——不能单独用于switch语句中
l break z;跳出指定标记的循环或者位置
l Java数组的定义方式:
int [] a=new a[10]; int a []=new a[]{1,2,3}; int a []={1,2,3};
l 在内存中数组的定义(栈和堆)
l 访问数组(注意不要下标越界): 数组名称[下标]
l 数组的长度(数组对象的length属性)
l 数组初始化,注意:int [] a = {1,2,3,4} 数组初始化并需在声明时同时赋值
l 数组的复制——System.arraycopy();方法
l 多维数组的定义与使用(二维)
l 什么是方法调用栈?方法调用栈中的知识点
Java代码从main方法开始,首先是main方法进行方法调用栈
当方法被调用时,其位于方法栈顶端
当执行完后移除,返回栈中前一个方法
方法执行完后,栈中的数据随着方法的移除而销毁,而堆中对象,当其无引用时会被gc立即回收
l 模块化开发:
将一个大型的工程分解为小的多个模块,每个模块只做自己的事情,完成每个模块都能达到一个功能,彼此之间没有必然的联系,最终将多个模块组装为该大型工程。
好处:使代码结构清晰,使代码得以重用
l 如何书写方法——方法标签
访问修饰符
public公共的
protect受保护的
默认的
private私有的
可选修饰符
static
final
返回类型
void无返回类型——若无返回类型,则不能返回值,但可以写return ;表示返回
Java数据类型为返回类型——若有返回类型,则必须返回值,并且返回的类型和返回的值类型要一直
方法名
main等其它方法名都是标识符
参数列表
实际参数列表
形式参数列表
注意事项:Java只有值传递!!!如果传递的是一个对象,则并不是传递对象本身,而是对象的引用
l 什么是可变长度的参数(未讲)
类似于public int add(int ... num){}
使用这种可变长度的参数,我们可以在实参位置输入不定个数的值>=0个
当然可变参数前仍可以添加其它的参数
类似于public int add(double num1,int ... num2){}
一个方法中可变参数只能放在最后,并且有且仅有一个,使用时和数组类似,相当于将传递进去的多个参数存放在了一个数组中
l 方法重载
什么是方法重载?——在Java一个类中有相同名称,但有不同参数列表的方法,称为重载
哪些属于重载
参数个数不同
参数类型不同
当其中拥有两个以上的不同类型参数时,参数顺序不同
l 递归(了解、会用)
什么是递归——程序调用自身的编程技巧称为递归--程序自己调用自己
递归有什么作用呢?
把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量
但是递归对栈的压力更大
如何使用递归
如果递归没有界限,则会一直引用其方法本身来计算,直至电脑内存溢出,所以一般都会给递归加上一个界限
l 构造器:一个特殊的方法,当对象实例化时初始化对象中的成员变量
构造器的名称必须与类名相同,不能有返回类型
构造器分为默认构造器和有参构造器
this(本类的) super(父类的,默认会有一个super());
l tostring()方法:返回对象的属性
l 在面向对象编程中,可以通过扩展一个已有的类,并继承该类的属性和行为,来创建一个新的类,这种方式称为继承,已有的类称为父类,而新的类称为子类
l Is a 与 has a:子类 is a父类 类 has a 属性
l 在类名后加extends 父类名 来继承
l Java是单继承语言,一个类只能继承一个父类
l 所有类的根基:object
l 方法重写:
①在重写父类的行为时,需要使子类的方法的返回类型、方法名、形式参数列表与父类一致,若仅仅只是方法名相同,参数列表不同则变成了方法的重载。
②访问修饰符的访问等级不能小于父类
l equals()方法:可以比较两个对象,测试二者是否相等
l Super关键字代表父类对象,this关键字代表本类对象
l Final关键字:
Final类:该类不能被其他类继承
Final方法:该方法不能被子类重写
l 实例化过程:
1.new关键字调用子类的构造器
2.子类会用this关键字调用子类的其他构造器,子类中的第一行代码中不是this()的构造器将被调用
3.在子类的构造器中的任何语句执行前,父类的构造器必须用super关键字调用,如果没有显式的使用super调用,那么编译器会用super()调用无参数的父类构造器
4.如果父类也是另一个类的子类,那么在父类的构造器中的任何语句执行前,父类构造器必须使用super()调用更高一层父类的构造器
5.本过程继续执行,直到到达类层次树的顶部,即Object类
6.Object类中的构造器执行,然后控制流程转到继承层次树中的Object下面的类的构造器中
7.构造器沿着继承层次树向下执行,最后一个要执行的构造器,就是第一步中先调用的那个构造器
l 封装:使类中的成员变量都是private,并提供public方法访问这些成员变量的技术
l Get()方法:只读 Set()方法:只写
l 类的静态成员被称为类成员,非静态的成员变量和方法被称为实例成员
l 在类的加载过程中,静态成员会随着类的加载而加载,而非静态成员会在实例化后才会加载
l 静态初始化块:只加载一次,与类同时加载
l Static{
l }
l 实例化初始化块:创建对象时加载
{
}
l 内部类:
1. 静态内部类:作为类的静态成员,存在于某个类的内中,可以不创建该类对象,直接引用
- 成员内部类:作为类的成员,存在于某个类的内部,需要创建该类对象才能引用
- 局部内部类:存在于某个方法内部的类,在类的方法内部定义的类,局部内部类只能在方法内部中使用,一旦方法执行完毕,局部内部类就会从内存中被清除
- 匿名内部类:存在于某个类的内部,但是无类名的类
l 多态:
静态多态:程序在编译时,系统就能决定调用哪个方法,静态多态实现的方式就是方法重载
动态多态:在运行中系统才能动态确定方法所指的对象,动态多态的实现方式是重写父类中的同名成员方法
l 向上转型技术:一个父类的引用变量可以指向不同的子类对象,或者说一个子对象可以被当作一个父类类型(向上转→自转 向下转→强转)
l instanceof关键字:用于判断运行时对象的真正类型
l 动态绑定技术:运行时根据父类引用变量所指对象的实际类型执行相应的子类方法,从而实现多态性
l 多态的应用:
多态参数:当方法的某个形式参数是一个引用的时候,与该引用兼容的任何对象都可以传递给方法,从而允许方法接受不同数据类型的形式参数
异构集合:不同对象的集合
l 要避免动态绑定默认行为的唯一方法是将方法声明为final,声明为final的方法不能被重写
final方法可以提升性能,因为避免了动态绑定的开销
l 抽象类:不能被实例化的类
l 使用关键字abstract可以声明一个抽象类
该关键字可以出现在类声明时class关键字前的任何地方
l 抽象方法:让某个方法变为抽象,不需要书写方法体,子类必须重写该方法
l 使用关键字abstract来声明抽象方法
l 将一个方法声明为抽象方法有两个结果:
①类也必须声明为抽象类。如果一个类包含了抽象方法,那么该类也必须是抽象的
②任何子类必须重写抽象方法,除非子类本身也是抽象的
l 使用抽象类和抽象方法的好处:
①类似于Employee这种不需要实例化的类,可以达到省时省力的效果
②强制子类进行某些方法的重写
③当有新的子类添加时,不会对任何其它类有影响
l 接口: 将抽象进行得更彻底,使所有方法都是抽象方法,所有方法都不提供具体的实现一种更为特殊的"抽象类"。因为接口中全部都是抽象方法,所以也不能实例化。 类不能继承接口,只能"实现"接口所定义的方法
l 接口与类之间的区别:
①接口不能被实例化;
②接口不包含任何构造器;
③接口中的所有方法都是抽象的;
④接口中不能包含实例成员变量。唯一可以出现在接口中的成员变量必须是同时声明为static和final;
⑤接口不能被一个类继承,只能被一个类来实现;
⑥一个接口能够继承多个接口。
l 接口与类的相似之处:
①接口可以有任意数量的方法;
②接口保存为以".java"为后缀名的文件,接口名需要与文件名匹配;
③接口编译后是后缀名为".class"的字节码文件;
④在包中的接口,其相应的字节码文件必须放置在和包名称相匹配的一个目录结构中
l 使用关键字interface用于声明接口:
public interface 接口名 {
//任意数量的final, static成员变量
//任意数量的抽象方法声明
}
l 接口的性质:
①接口默认是抽象的。在声明接口时,不需要使用关键字abstract;
②接口中的每一个方法默认也是抽象的,所以也不需要关键字abstract;
③接口中的方法默认访问级别是public。 在编写接口的时候通常用public关键字,但是如果我们不显式地将接口中的方法声明为public,它仍然将是public的。
l 接口可以包含成员变量,但是成员变量只能用static和final关键字共同来修饰
static final int a=1;
l 类实现接口用关键字implements
①实现接口的类必须实现接口里所有的方法
②一个类可以实现多个接口
l 高耦合低内聚:
耦合:一个软件结构内不同模块之间互连程度的度量(类与类,子程序之间的联系程度)。
内聚:一个模块内各个元素彼此结合的紧密程度(一个类中代码的利用程度)。
l 一个接口能够继承另外的一个接口,类似于一个类能够继承另外一个类。关键字extends被用于继承接口,子接口继承了父接口中的方法
l 一个没有任何方法的接口,我们将其称为"标记接口"
l 接口和抽象类在用法上的区别:
①接口中只能包含抽象方法;而抽象类中可以包含普通方法
②接口中不能定义静态方法;而抽象类可以定义静态方法
③接口中只能定义静态常量属性,不能定义普通属性;而抽象类既可以定义普通属性,也可以定义静态常量属性
④接口不包含构造器;而抽象类中可以包含构造器。抽象类中的构造器并不是用于创建对象,而是让子类调用这些构造器来完成属于抽象类的初始化工作
⑤接口中不包含初始化块;而抽象类可以包含初始化块
⑥一个类最多有一个直接父类,包括抽象类;但是一个类可以直接实现多个接口,通过实现多个接口来弥补Java单继承的不足