命名规则
包 | 域名倒过来,全部小写;eg:com.sheepAdmin.www |
类和接口 | 若为一个单词首字母大写,多个单词采用驼峰 |
方法和变量 | 一个单词小写,多个单词驼峰 |
常量 |
数据类型
基本类型 (四类八种)
整数 | byte(1B),short(2B),int(4B),long(8B) |
浮点型 | float(4B)l,double(8B)f 默认 |
字符型 | char(2B) |
布尔型 | boolean(无指定,理论上1b) |
相关问题:
1.常量相加和变量相加区别:变量相加jvm无法判定两个变量的数值,byte运算会自动装化成int;常量相加:java有常量优化机制,直接赋值
2.byte,short,char – int – long – float – double;byte、short、char不会相互转化,其余的会提升为高的,任何数据类型与字符串相连都会产生新的字符串
3.java采用unicode编码,unicode每个字符占两个字符,汉字也是两个
引用类型(4B)
数组 |
对象 |
接口 |
枚举 |
数组
byte,short,int,long初始化都是0 | |
float,double初始化都是0.0 | |
boolean初始化是false | |
char初始化都是'\u0000' | |
三种初始化方式:1.动态初始化 2.静态初始化 3.默认初始化 |
变量
局部变量 | 从属于方法或语句块,必须被初始化 |
成员变量 | 定义在类里边,成员方法外面,系统自动初始化;数字:0.00 boolean:false;char“\u0000 引用类型:null |
静态变量 | static,从属于类,初始化规则同成员变量 |
static注意事项
在静态方法中没有static方法 | 静态方法随着类的加载而加载,而this随着类的;即静态比对象先存在 |
静态方法只能访问静态的成员变量和成员方法 | 非静态方法都可以访问 |
表达式
自动提升 | 有long转long 有double转double |
强制转换 |
运算符
算数运算符 | + - * / % ++ -- +有三种作用,做正号,做加法,字符串连接符 |
赋值运算符 | =,+=,-=,*=,/=,%= 不会改变其数据类型,eg:byte i=0;i+=10不报错但是i=i+10报错 |
比较(关系)运算符 | >,>=,<,<=,==,!= 运算结果都是布尔型 |
逻辑运算符 | !,&&,||(都是对布尔型进行运算的) |
位运算符 | ~,&,|,^ &(|)和&&(||)的区别:&&具有短路效果,如果左边为false不执行右边 ^:一个数据对另一个数据^两次本身不会变化:三种交换数值方式:指针形式有弊端(三种数值交换方式,指针型有缺陷) |
三元(条件)运算符 | 布尔表达式?表达式1:表达式2 |
移位运算符 | >>,<<,(以上两个都是有符号数移动,按照补码的规则移动)>>>无符号数右移 |
键盘的录入
1.导入包 | import java.util.Scanner |
2.创建键盘录入对象 | Scanner 对象名=new Scanner(System.in); |
3.通过对象获取数据 | 数据类型 数据名=对象名.nextInt();/即相应的next方法 |
控制语句
顺序结构 | 默认 |
选择结构 | if ,if else ,if else if else,switch switch的表达式为int或者可以自动转化成int的类型:int/byte/short,枚举;break问题 |
循环结构 | while ,for,do while; continue和break |
Switch
case后只能是常量,不能是变量,且case后不能相同 | |
default不建议省略,可以在任意位置,建议在最后 | |
switch执行到break或者右侧大括号就结束了 |
面向对象基础
面向对象的发展史
基本数据类型 | |
数组 | 相同数据类型 |
结构体 | 不同数据类型 |
类 | 不同数据类型,且可以在类中定义方法 |
定义类
(public) class 类名{
1.private 数据类型 数据名;//加相应的getter,setter方法
2.方法
3.构造函数
} //类体
类名 | 规范就是:开头大写,驼峰原则,参考文章开头规范 |
private 数据类型 数据名 | 规范就是private,设置get和set方法的目的是: 不直接修改该数据 |
方法 | 1.重载(Overload):两同三不同 两同:同一个类,同一个方法名 三不同:①参数列表不同:类型,个数,顺序 即返回值不同,形式参数名不同都不称为重载 |
构造函数 | 1.不用写返回值(系统自动为你返回一个对象类型) 2.如果自己不声明,系统会自动声明一个(对你是透明的),如果声明了,系统就不会为你声明 3.构造函数第一句都是 super,即调用父类的构造函数。上溯到Object对象;即有继承关系的调用 4.构造名必须和类名一致 5.通过new来调用 |
类中的关键字
this | 普通方法中:调用本方法的对象 构造方法中:正要初始化的对象 调用其他的构造方法 |
super | 直接父类的引用 |
static | 将变量和方法变为静态方法,从属于类(而不是对象),通过类名就可以调用,存储与方法区中 |
package | 必须位于非注释行第一句 包名:参考上文,域名倒着写,全部小写 |
import | 引入外部的类; 导入类的静态属性:import static |
final | 修饰变量:该变量就变成了常量(命名规范:参考上文) 修饰方法:不可以被重写 修饰类:不能被继承 |
面向对象三大特征
封装 | 关键字:private,default,protected,public,default 目的:实现属性或者方法的封装,最终实现”高内聚,低耦合“ |
继承 | 关键字:extends 好处:代码重用;通过继承实现对现实世界的建模;类只能单继承 方法的重写 |
多态 | 有三个必要条件: 1.继承 2.方法的重写 3.父类引用指向子类 |
继承
动态绑定,静态绑定:动态绑定慢
Object类
Object介绍 | 所有方法的根基类 |
Object所含的方法 | 1.toString 2.equals,hashcode 3.wait,notify,notifyAll |
代码块(用{}括起来的代码)
局部代码块 | 在方法中出现,限定变量声明出现,释放资源 |
构造代码块 | 在类中方法出现;多个构造方法中相同的代码放到一块,每次调用构造方法都执行,并且在构造方法之前执行 |
静态代码块 | 用于给类进行初始化,在加载的时候就执行,并且只执行一次。一般用于加载驱动 |
同步代码块 |
抽象类和接口
抽象类(abstract) | 1.包含抽象方法的类一定是抽象类 2.不能被new 3.可以包含普通方法,成员变量,构造函数 4.必须被子类重写 |
接口(interface) | 1.类可以实现接口,通过implements,一个类可以实现多个接口 2.接口之间可以多继承 3.接口实现的是现实世界中的一组规范,即如果你能。。。则必须能。。。。 |
重写(Override) | =:方法名一致 >=:子类权限修饰符可以大于等于父类 <=:子类返回类型小于父类返回类型;子类声明异常类型不能超过父类的类型 |
内存机制
堆(heap) | 共享; 存放对象 不连续,灵活,速度慢 |
栈(stack) | 每个线程 存放局部变量,系统自动分配,空间连续,速度快 |
方法区(meathod area) | 共享 存放类的信息,代码,静态变量,字符串常量; 方法区同heap |
程序计数器(PC register) | 每个线程 |
本地方法栈(native method stack) | 每个线程 引用其他语言的代码 |
成员变量和局部变量的区别
成员变量 | 在类中位置不同 在内存中位置不同:位于堆中 声明周期不同 初始化不同:默认有初始值 |
局部变量 | 在类中位置不同 在内存中位置不同:位于栈中 初始化不同:默认没有初始值,必须初始化才可以使用 |
成员变量名和局部变量名一致时:采用就近原则 |
成员变量和静态变量的不同
所属不同 | |
内存中位置不同 | 静态变量存储于方法的静态区 成员变量存储于堆内存 |
内存出现时间不同 | 静态方法随着类的加载而加载 成员变量随着对象的加载而加载,消失而消失 |
调用不同 |
垃圾回收器(GC,garbage collection)
发展史
Serial Old,Serial | |
Parallel Old,Parallel Scavenge | |
CMS,ParNew | |
G1 | 我的电脑中的版本 |
ZGC | 截止发稿仍在实验版本 |
组成介绍
相关提示
程序员不能调用垃圾回收器,但是可以通过System.gc()建议回收 |
finalize:一般也不需要调用 |
异常机制
try-catch-finally | |
声明异常throws | |
手动抛出异常throw | |
自定义异常 extends Expection或者他的子类 |
Arrays类(包含了对数组的排序,查找)
注意Comparable接口,可以定义排序的规则 | |
容器(Collection)
用for循环或者迭代器
List(有序可重复) | ArrayList:底层用数组实现。线程不安全,效率高 LinkedList:底层用双向链表实现,线程不安全 Vector:底层用数组实现。线程安全,效率低 |
Set(无序不可重复) | HashMap:内部使用hashmap实现 |
Map
用迭代器
Map(采用key-value存储数据) | HashMap:线程不安全,效率高 HashTable:线程不安全,效率高 |
Iterator
Iterator(通过它遍历容器中的元素) |
常用类
包装类 | 实现了基本数据类型和数据的互相转化。 自动装箱,自动拆箱 |
String/StringBuilder/StringBuffer | String:不可变字符序列 (拼接用后两个) StringBuilder:可变字符序列,线程不安全 StringBuffer:可变字符序列,线程安全 |
时间:Date,DateFormat,Clandar | Date:使用毫秒数来表示时间的概念 DateFormat:实现Date对象和String对象的互相转化(根据指定格式进行转化eg:yyyy -MM-DD ) Clander:将人的日期的概念与Date有效转化 |
File(代表文件或者目录的一个抽象) | |
Math(数学类) | |
枚举 | 如果要新建一组常量,建议使用枚举。不要学习和使用枚举的高级特性 |
I/O流
InputStream | FileInputStream ByteArrayInputStream ObjectInputStream:对象的序列化,实现空接口 DataInputStream:操作基本数据类型 BufferedInputStream |
OutputStream | FileOutputStream ByteArrayOutputStream ObjectOutputStream:对象的序列化,实现空接口 DataOutputStream:操作基本数据类型 PrintInputStream:打印数据流 BufferedOutputStream |
Reader | FileReader InputStreamReader:将字节流转化为字符流 BufferedReader |
Writer | FileWriter InputStreamWriter:将字节流转化为字符流 BufferedWriter |
定义多线程类的两种方式
Extends Thread | |
Implements Runnable |
线程的状态
new | 新建状态 |
就绪状态 | 调用start状态以后 |
运行状态 | |
阻塞状态 | sleep:不会释放持有的对象锁 join:等待另一个线程执行完成 wait:会释放所持有的对象锁 syncharinzed:运行同步代码,但是没有获得对象的锁,于是进入指定对象的锁池等待 |
终止 | 不建议使用stop,destory直接中止,因为不会释放锁,只会释放一些其他资源 建议通过增加bool变量,正常中止线程运行 |
线程的优先级
总共有1-10;默认优先级为5 | |
优先级别低只是意味着调用的概率低,不意味着不被调用 |
资源同步
synchorized修饰方法,语句块 |
死锁
建议不要同时持有多个对象的锁 |