### 构造器
* 仅当系统没有提供任何构造器时,系统才会提供默认构造器;
* 在构造器中,使用this调用另一个构造器:this\(\)
* 在构造器中,使用super调用父类构造器:super\(\)
### 构造器处理步骤
1. 所有数据域被初始化为默认值\(0、false或null\);
2. 按照类声明中出现的次序,依次执行所有域初始化语句和初始化块;
3. 如果构造器第一行调用了第二个构造器,则执行第二个构造器主体;
4. 执行这个构造器主体;
### 更改器方法与访问器方法
对实例域做出修改的方法被称为更改器方法(mutator method),仅访问实例域而不进行修改的方法被称为访问器方法(accessor method)
### Class
* 静态嵌套类
* 内部类
* 局部类:方法内定义的类称为局部类
* 匿名内部类
* 匿名子类
### 匿名内部类
```
public static void main(String[] args) throws InterruptedException {
new Thread(getTask()).start();
}
private static Runnable getTask(){
return new Runnable() {
@Override
public void run() {
System.err.println("这是匿名内部类");
}
};
}
```
### 抽象类
* 任何包含一个或多个抽象方法的类都必须被声明为抽象的;
* 抽象类的所有子类,要么实现超类中的所有抽象方法,要么自己也声明为抽象的;
### 内部类与嵌套类的区别与联系
* 内部类的方法可以访问外部类的实例变量
* 当静态嵌套类的实例不需要知道它属于外部那个类的实例时,使用静态嵌套类;否则使用内部类;
* 静态的嵌套类只能通过对象访问外层包含类的非静态成员;也就是说嵌套类不能直接引用包含类的非静态成员变量;
* 内部类可以访问外部类的所有成员变量和方法;
* 内部类对象拥有一个对外部类对象的引用\(outer\);
* JavaSE8之前,必须把从局部类访问的局部变量声明为final;
### 匿名子类
```
ArrayList<String> list = new ArrayList<String>(100) {
public void add() {
super.add("hello");
}
};
ArrayList<String> list1 = new ArrayList<String>() {
{
add("heel");
}
};
```
### 静态内部类
* 在内部类不需要访问外部类对象的时候,应该使用静态内部类;
* 与常规内部类不同,静态内部类可以有静态域和方法;
* 声明在接口中的内部类自动成为static和public类;
### 类设计技巧
* 一定要保证数据私有;
* 一定要对数据初始化;
* 不是所有的域都需要独立的域访问器和域更改器
* 将职责过多的类进行分解
* 类名和方法名要能够体现它们的职责
* 优先使用不可变的类
### 知识点
* 在将超类转换为子类之前,应该使用instanceof进行检查;
* 在调用x.toString\(\)的地方可以用"" + x代替
* instanceof\(如果被检查对象为null,则结果返回false\)
```
String str = null;
if (str instanceof Object) { // 不产生异常result is false
System.err.println("yes");
}
System.err.println("no");
```
* 内部类不能声明静态成员;
```
public class ClassDemo {
public static void main(String[] args) {
System.err.println(ClassDemo.Student.num);
System.err.println(ClassDemo.Teacher.code);
}
class Student {
private final static int num = 10; // ok
// private static int code = 10; // 编译报错
}
static class Teacher {
private static int code = 10; // ok
}
}
```
* 双括号初始化
```
public static void main(String[] args) throws Exception {
init(new ArrayList<String>() {
{
add("luoyoub");
add("robert");
}
});
}
private static void init(List<String> list) {
list.stream().forEach(System.err::println);
}
```
* 一个方法覆盖另一个方法时可以指定一个更严格的返回类型
```
class Student extends Person {
public Student get() {
return (Student) new Object();
}
}
class Person {
public Person get() {
return new Person();
}
}
```
### Object
![](../assets/20171002105010.png)
- java演变
- JDK各个版本的新特性
- JDK1.5新特性
- JDK1.6新特性
- JDK1.7新特性
- JDK1.8新特性
- JAVA基础
- 面向对象特性
- 多态
- 方法重载
- 方法重写
- class
- 常量
- 访问修饰符
- 类加载路径
- java-equals
- 局部类
- java-hashCode
- Java类初始化顺序
- java-clone方法
- JAVA对象实例化的方法
- 基础部分
- JAVA基础特性
- JAVA关键字
- javabean
- static
- 日期相关
- final
- interface
- 函数式接口
- JAVA异常
- 异常屏蔽
- try-with-resource资源泄露
- JAVA引用
- WeakReference
- SoftReference
- PhantomReference
- 位运算符
- try-with-resource语法糖
- JDK冷知识
- JAVA包装类
- JAVA基本类型与包装类
- java.lang.Boolean
- java.lang.Integer
- java.lang.Byte
- java.lang.Short
- java.lang.Long
- java.lang.Float
- java.lang.Double
- java.lang.Character
- 日期相关
- TemporalAdjusters
- String
- 字符串常量池
- String拼接
- String编译期优化
- StringBuilder&StringBuffer
- intern
- 注解
- java标准注解
- 内置注解
- 元注解
- 自定义注解
- 注解处理器
- JVM注解
- Java8 Annotation新特性
- 反射-Reflective
- Reflection
- Class
- Constructor
- Method
- javabean-property
- MethodHandles
- 泛型
- 类型擦除
- bridge-method
- Accessor&Mutator方法
- enum
- JAVA数组
- finalize方法
- JAR文件
- JAVA高级编程
- CORBA
- JMX
- SPI
- Java SPI使用约定
- ServiceLoader
- 实际应用
- IO
- 工具类
- JDK常用工具类
- Objects
- System
- Optional
- Throwable
- Collections
- Array
- Arrays
- System
- Unsafe
- Number
- ClassLoader
- Runtime
- Object
- Comparator
- VarHandle
- 数据结构
- 栈-Stack
- 队列(Queue)
- Deque
- PriorityQueue
- BlockingQueue
- SynchronousQueue
- ArrayBlockingQueue
- LinkedBlockingQueue
- PriorityBlockingQueue
- ConcurrentLinkedQueue
- 列表
- 迭代器
- KV键值对数据类型
- HashMap
- TreeMap
- Hash冲突
- ConcurrentHashMap
- JDK1.7 ConcurrentHashMap结构
- jdk7&jdk8区别
- 集合
- Vector
- Stack
- HashSet
- TreeSet
- ArrayList
- LinkedList
- ArrayList && LinkedList相互转换
- 线程安全的集合类
- 集合类遍历性能
- 并发容器
- CopyOnWriteArrayList
- ConcurrentHashMap
- 同步容器
- BitMap
- BloomFilter
- SkipList
- 设计模式
- 设计模式六大原则
- 单例模式
- 代理模式
- 静态代理
- 动态代理
- JDK动态代理
- cglib动态代理
- spring aop
- 策略模式
- SpringAOP策略模式的运用
- 生产者消费者模式
- 迭代器模式
- 函数式编程
- 方法引用
- 性能问题
- Lambda
- Lambda类型检查
- Stream
- findFirst和findAny
- reduce
- 原始类型流特化
- 无限流
- 收集器
- 并行流
- AOP
- 静态织入
- aspect
- aspect的定义
- AspectJ与SpringAOP
- 动态织入
- 静态代理
- 动态代理
- JDK动态代理
- CGLib动态代理
- Spring AOP
- SpringAOP五种通知类型
- @Before
- @AfterReturning
- @AfterThrowing
- @After
- @Around
- Aspect优先级
- SpringAOP切点表达式
- within
- execution
- 嵌套调用
- 系统优化与重构
- 重叠构造器模式
- 工具类构造器优化
- 常见面试题
- new Object()到底占用几个字节
- 访问修饰符
- cloneable接口实现原理
- 异常分类以及处理机制
- wait和sleep的区别
- 数组在内存中如何分配
- 类加载为什么要使用双亲委派模式,有没有什么场景是打破了这个模式
- 类的实例化顺序
- 附录
- JAVA术语
- FAQ
- 墨菲定律
- 康威定律
- 软件设计原则
- 阿姆达尔定律
- 字节码工具
- OSGI