在学习的过程和笔试过程中,易错的点,记录下来。
Java基础:
1、Math.round() : 四舍五入,Math.round(1.5)=2,Math.round(-1.5)=-1
2、final关键字:
- 修饰类:表示该类不能被继承; 但是该类可以实例化对象;
- 修饰方法:表示方法不能被重写,不希望父类的某个方法被子类覆盖/重写;
- 修饰变量:表示变量只能一次赋值以后值不能被修改(常量)。
- 进阶:final 和 static 往往搭配使用,效率更高,比如用final static 修饰的一个值在其他类中被使用,不会导致类加载,底层编译器做了优化。
3、抽象类:
- 抽象类的本质是类,可以有类的各种成员;抽象类的价值更多在于设计(模板设计模式);
- abstract 只能修饰类和方法;
- 抽象方法没有方法体;
- 普通类不能包含抽象方法,抽象类可以包含抽象方法(也可以不包含)和普通方法。 当一个类中存在抽象方法,需要将该类声明为abstract 类;
- 抽象类不能直接实例化,普通类可以直接实例化;
- 如果一个类继承了抽象类,则它必须实现抽象类的所有抽象方法(普通方法不用),除非它自己也是抽象类;
- 抽象方法不能使用private、final、static 修饰,都是与重写违背。
注:所谓实现方法,就是有方法体!!!
4、接口和抽象类区别:
共同点:都不能被实例化,都可以包含抽象方法,都可以有默认(default)实现的方法(1.8)
- 实现:抽象类的子类使用 extends 来继承;接口必须使用 implements 来实现接口。
- 构造函数:抽象类可以有构造函数;接口不能有。抽象类的构造器并不是用于创建对象,而是让字类调用这些构造器完成属于抽象类的初始化操作。
- 实现数量:类可以实现很多个接口;但是只能继承一个抽象类。
- 访问修饰符:接口中的方法默认使用 public 修饰;抽象类中的方法可以是任意访问修饰符。
- 接口不能包含普通方法,抽象类可以包含。接口只能定义静态变量(public static final),抽象类无限制。
- 接口可以有静态方法,抽象类没有。
5、实现接口和继承类:
- 解决的问题不同,继承的价值主要在于解决代码的复用性和可维护性;接口的价值主要在于设计,设计好各种规范(方法),让其他类去实现这些方法;
- 接口比继承更加灵活,接口是 like a 的关系,而继承是 is a 的关系;
- 接口在一定程度上实现代码解耦【即:接口规范性+动态绑定】。
6、接口是否可继承(extends)接口?抽象类是否可实现(implements)接口?抽象类是否可继承具体类(concrete class)?
接口可以继承接口,而且支持多重继承。抽象类可以实现(implements)接口,且不需要实现接口中的方法。抽象类可继承具体类也可以继承抽象类。
7、构造器为何不能用final、abstract、static修饰?
- 构造器不是通过继承得到的,所以没有必要把它声明为final的。
- 一个抽象的构造器将永远不会被实现,所以它也不能声明为abstract的。
- 构造器总是关联一个对象而被调用,所以把它声明为static是没有意义的。
JUC:
1、sleep 和 wait
共同点:wait()、wait(long) 和 sleep(long) 的效果都是让当前线程暂时放弃CPU的使用权,进入阻塞状态。
不同点:
- 方法归属不同,sleep 是 Thread 的静态方法,wait 是Object的成员方法
- 醒来时机不同,sleep(long) 和 wait(long) 的线程会再等待相应的毫秒后醒来,而wait() 如果不被 notify 等唤醒就一直等待下去
- 锁特性不同,wait 的调用必须先获取wait 对象的锁,sleep 无此限制,wait方法会释放锁,sleep 不会释放锁。
- 进阶:为什么方法的归属是上面那样,wait() 是让获得对象锁的线程实现等待,重点是对象,每个对象都拥有锁;sleep() 是让当前线程暂停执行,不涉及对象。
2、synchronized 和 ReentrantLock 区别
共同点:两者都是可重入锁,可重入锁指的是自己可以再次获取自己的内部锁,加了几层锁,释放的时候也需要释放几次。
不同点:
- synchronized 依赖于JVM,ReentrantLock 依赖于API。ReentrantLock 需要lock() he unlock() 方法配合 try/finally 语句来完成。
- ReentrantLock 比 synchronized 功能更多:a、等待可中断,提供了一种能够中断等待锁的线程的机制;b、可实现公平锁,synchronized只能是非公平锁;c、可实现选择性通知,将线程对象注册在指定的 Condition 中,从而可以选择性的进行线程通知。
其他:
1、跨域
指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对javascript施加的安全限制。
同源策略:是指协议,域名,端口都要相同,其中有一个不同都会产生跨域。