1.初始化顺序错误处理
- 错误处理 初始化父类中的静态成员变量和静态代码块 ;
- 初始化子类中的静态成员变量和静态代码块 ;
- 初始化父类的普通成员变量和代码块(每次new都执行),再执行父类的构造方法(每次new都执行);
- 初始化子类的普通成员变量和代码块(每次new都执行),再执行子类的构造方法(每次new都执行);
2.重写原则(两同两小一大)
- 方法名相同,参数列表相同
- 返回类型兼容(小于),抛出异常兼容(小于)
- 访问权限只能放大不能缩小
3.重载原则:参数类型、参数顺序、参数个数等导致参数列表不同,仅权限、返回类型不同,属于编译错误
4.拆箱装箱
- 仅在基本数据类型与包装类对象(无论new来的还是装箱来的)比较时发生拆箱
- 特殊的,两个由装箱而来的Integer对象(不包括Float、Double),-128-127之间时,如Integer a=1; Integer b = Integer.valueOf(1);在比较时也会发生拆箱
5.基本数据类型转换顺序
(byte,short,char)-> int ->long -> float -> double
包装类的默认值为null,只有成员变量会有默认值,局部变量未赋值就使用属于编译错误
6.Java内存分区
- 堆区:只存放类对象,线程共享。PS:数组不是原生类(基本数据类型),但它是对象,也存放在堆;
- 方法区:又叫静态存储区,存放class文件和静态数据(常量池),线程共享;
- 栈区:存放方法局部变量,基本类型变量区、执行环境上下文、操作指令区,线程不共享。PS:栈区不需要垃圾回收,运行完即释放
7.常量池
-
String s = new String("abc"); //该语句创建了两个对象,常量池pool中一个,堆heap中一个。
-
String a = "ab"; String b= "a"+"b"; String c = "ab"; //编译后,a,b,c同指向常量池中的一个对象
8.静态static
- 静态方法中无法直接访问任何依赖于对象的方法和属性,需要new对象
- 只有内部类可以被static修饰,静态内部类完全可以看做一个外部类,不能访问外部类的私有成员变量
- 外部类只能被public、abstract、final关键字修饰
9.抽象abstract
- 接口的方法默认是public abstract的,变量(其实应该叫常量)默认是public static final,加权限控制符等于白加,一旦权限缩小,属于编译错误
- 接口可以有自己的default方法和static方法,Java8的新特性,所以接口只能有抽象方法是需要讨论的
- 抽象类自由度很高,可以没有抽象方法,可以加各种访问权限,可以有正常的成员函数
- 抽象类和接口都不能被实例化
- 抽象类和接口除了用于继承或实现之外,一个重要的用途是用于声明,实现动态绑定
- 抽象方法不能有方法体,有抽象方法的类必须定义为抽象类,子类没有实现基类的抽象方法时也必须被定义为抽象类
- 抽象方法不能被private、static、syschronized、native等修饰
- 抽象abstract与常量final关键字永远不兼容
10.常量final
- final修饰变量,表示这是一个常量,只能被赋值一次,如果是一个成员常量,那么只能在构造函数或声明时或初始化块中赋值,否则属于编译错误。
- final修饰方法,表示这是一个不能被重写的方法
- final修饰类,表示这是一个不需要被继承的类,觉见的final类如下:
包装类:Boolean,Character,Short,Integer,Long,Float,Double,Byte,Void 字符串类:String,StringBuilder,StringBuffer 系统类:Class,System,RuntimePermission,Compiler 数学类:Math,StrictMath
- final修饰引用,表示这是一个不能被转向的引用,但可以改对象的内容,如集合
11.权限private、protected、public、什么也不标
类内部 | package内 | 子类 | 其他 | |
public | 允许 | 允许 | 允许 | 允许 |
protected | 允许 | 允许 | 允许 | |
什么也不标 | 允许 | 允许 | ||
private | 允许 |
12.第一句规律
- this()和super()调用自己或基类的无参或有参构造函数,必须在本构造函数的第一句
- package 语句如果有的话,必须在文件的第一句
13.线程
- Vector、Stack、StringBuffer、HashTable、Enumeration是线程安全的
- 线程可以通过继承Thread类,实现Runnable接口,Callable,线程池等途径创建
- start是启动子线程的唯一方法,调用run方法只能在本线程中顺序执行
new Thread(new MyRunnable()).start() //实现Runnable接口的启动 new Thread().start() //继承Thread类的启动
- obj.wait() 或obj.notify()或obj.notifyAll()的obj必须与synchronized(X)中的X相同
- notify也只是在退出临界区之后,释放对象锁,不是立即释放
- 常用的同步器:CountDownLatch、Semaphore,不常用的:Barrier(如CyclicBarrier)、Exchanger
- ThreadLocal用于线程间的数据隔离,采用哈希表的方式来为每个线程都提供一个变量的副本,保证各个线程间数据安全,每个线程的数据不会被另外线程访问和破坏
-
Condition.await/signal/signalAll是Java1.5后更高效的线程协作工具
14.异常处理
- try,catch,finally原则上顺序执行
- catch只有在try块抛出异常后才执行,且异常被成功捕获后,只要没有return语句,System.exit(0)等,程序按顺序执行,不会跳出
- catch可以没有,也可以有多个。没有的情况下,需要throws声明未处理的异常有哪些。多个的情况下,从小到大捕获比较合理。
- finally总是会执行,区别于对象的finalize方法。try块或catch块中有return语句时,会先缓存return结果,去执行finally块,但finally块不能影响原本要return的结果。
try块中throw异常,未在当前方法catch时(throws情况),会先执行finally方法,然后才执行catch块。 - Thread.sleep()、obj.wait()均必须catch捕获InterruptException异常,否则属于编译错误
15.集合类
下图中,实框为类,短线框为抽象类,点框为接口
16.关键字、保留字
- 标识符由$、_、数字、字母组成,不能以数字开头,不能是关键字和保留字
- 关键字分类列表如下:
访问控制 | private 私有的 protected 受保护的 public 公共的 |
类、方法和变量修饰符 | abstract 声明抽象 class 类 extends 扩允,继承 final终极,不可改变的 implements实现 interface 接口 native 本地 new 新,创建 static 静态 strictfp 严格,精准 synchronized 线程,同步 transient 短暂 volatile 易失 |
程序控制语句 | break 跳出循环 continue 继续 return 返回 do 运行 while循环 if 如果 else 反之 for 循环 instanceof 实例 switch 开关 case 返回开关里的结果 default 默认 assert 断言 enum枚举 |
错误处理 | catch 处理异常 finally 有没有异常都执行 throw 抛出一个异常对象throws 声明一个异常可能被抛出 try 捕获异常 |
包相关 | import 引入 package 包 |
基本类型 | boolean 布尔型 byte 字节型 char 字符型 double 双精度 float 浮点int 整型 long 长整型 short 短整型 |
变量引用 | super 父类.超类 this 本类 void 无返回值 |
- 保留字列表:byValue, cast, false, future, generic, inner, operator, outer, rest, true, var , goto ,const,null
17.switch
- 块如果不及时break的话,会无视case是否满足而顺序执行
- switch只能作用于char、byte、short、int以及它们的包装类、String、enum,作用于boolean、long、float、double属于编译错误
18.继承extends、多态
- 子类会继承父类的所有成员方法和属性,只是私有属性和方法不可访问而已
- 静态方法无法实现多态,只能被隐藏,引用是谁的就调用谁的函数
- 属性(类变量或实例变量)无法实现多态,只能被隐藏,引用是谁的就调用谁的属性
- instanceof 方法是接受多态的
- 类只能继承一个基类,可以实现多个接口;接口可以继承或扩展多个接口
- 泛型不接受多态,但是有相应的范围表示法来应对多态, 代表小于等于A的范围,代表大于等于A的范围,代表全部范围
小范围可以赋值给大范围,点可以赋值给所在的某个范围
- 按照运行时多态,基类构造函数中调用的被覆盖函数,已经在使用子类的重写函数,但此时子类未执行任何初始化块,更没有执行构造函数,所以重写函数中获取到的任何成员变量值为默认值,任何成员对象为null;
19.构造函数
- 构造方法不能被static、final、synchronized、abstract、native修饰,但可以被public、private、protected修饰;
- 构造方法不是类的成员方法,不能被子类继承
- 自定义带参的构造函数会导致系统不给默认无参构造函数