1、static修饰执行顺序
父类静态代码块–>子类静态代码块–>父类普通代码块–>父类构造方法–>子类代码块–>子类构造方法;
2、try…catch…finally
根据官方的JVM规范:
如果try语句里有return,返回的是try语句块中变量值。
详细执行过程如下:
1、如果有返回值,就把返回值保存到局部变量中;
2、执行jsr指令跳到finally语句里执行;
3、执行完finally语句后,返回之前保存在局部变量表里的值;
如果try,finally语句里均有return,忽略try的return,而使用finally的return.
3、HashMap和HashTable区别
区别 | HashMap | HashTable |
---|---|---|
简介 | HashMap是非线程安全的,只是用于单线程环境下,多线程环境下可以采用concurrent并发包下的concurrentHashMap | Hashtable是线程安全的,能用于多线程环境中 |
是否允许null值 | Hashmap是允许key和value为null值的 | HashTable键值对都不能为空,否则包空指针异常 |
4、构造方法
1:构造方法可以被重载,一个构造方法可以通过this关键字调用另一个构造方法,this语句必须位于构造方法的第一行;
2: 重载:方法的重载(overload):重载构成的条件:方法的名称相同,但参数类型或参数个数不同,才能构成方法的重载。
3:当一个类中没有定义任何构造方法,Java将自动提供一个缺省构造方法;
4:子类通过super关键字调用父类的一个构造方法;
5: 当子类的某个构造方法没有通过super关键字调用父类的构造方法,通过这个构造方法创建子类对象时,会自动先调用父类的缺省构造方法;
6:构造方法不是类的成员方法;
7:构造方法不能被继承。
5、有关final
1、final关键字可以用于成员变量、本地变量、方法以及类。
2、 final成员变量必须在声明的时候初始化或者在构造器中初始化,否则就会报编译错误。
3、你不能够对final变量再次赋值。
4、本地变量必须在声明时赋值。
5、在匿名类中所有变量都必须是final变量。
6、final方法不能被重写。
7、final类不能被继承。
8、没有在声明时初始化final变量的称为空白final变量(blank final variable),它们必须在构造器中初始化,或者调用this()初始化。不这么做的话,编译器会报错“final变量(变量名)需要进行初始化”。
6、面向对象的五大基本原则
1、单一职责原则(SRP)
一个类,最好只做一件事,只有一个引起它的变化。单一职责原则可以看做是低耦合、高内聚在面向对象原则上的引申,将职责定义为引起变化的原因,以提高内聚性来减少引起变化的原因。
2、开放封闭原则(OCP)
软件实体应该是可扩展的,而不可修改的。也就是,对扩展开放,对修改封闭的。
3、里氏替换原则(LSP)
子类必须能够替换其基类。这一思想体现为对继承机制的约束规范,只有子类能够替换基类时,才能保证系统在运行期内识别子类,这是保证继承复用的基础。
4、依赖倒置原则(DIP)
依赖于抽象。具体而言就是高层模块不依赖于底层模块,二者都同依赖于抽象;抽象不依赖于具体,具体依赖于抽象。
5、接口隔离原则(ISP)
使用多个小的专门的接口,而不要使用一个大的总接口
7、四大修饰符
权限 | 类内 | 同包 | 不同包子类 | 不同包非子类 |
---|---|---|---|---|
private | √ | × | × | × |
default | √ | √ | × | × |
protected | √ | √ | √ | × |
public | √ | √ | √ | √ |
8、switch(expr1)
switch支持byte、short、char、int、String(jdk1.7)、Enum
9、重写和重载
1、重写(两同两小一大原则)
方法名相同,参数类型相同,子类返回类型小于等于父类方法返回类型, 子类抛出异常小于等于父类方法抛出异常, 子类访问权限大于等于父类方法访问权限。[注意:这里的返回类型必须要在有继承关系的前提下比较]
2、重载
方法名必须相同,参数类型必须不同,包括但不限于一项,参数数目,参数类型,参数顺序
10、abstract,interface区别
1、abstract
含有abstract修饰符的class即为抽象类,abstract类不能创建的实例对象。含有abstract方法的类必须定义为abstract class,abstract class类中的方法不必是抽象的。abstract class类中定义抽象方法必须在具体(Concrete)子类中实现,所以,不能有抽象构造方法或抽象静态方法。如果的子类没有实现抽象父类中的所有抽象方法,那么子类也必须定义为abstract类型。
2、interface
接口(interface)可以说成是抽象类的一种特例,接口中的所有方法都必须是抽象的(1.8有所改变)。接口中的方法定义默认为public abstract类型,接口中的成员变量类型默认为public static final。
区别
1.抽象类可以有构造方法,接口中不能有构造方法。
2.抽象类中可以有普通成员变量,接口中没有普通成员变量
3.抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法。
4.抽象类中的抽象方法的访问类型可以是public,protected和(默认类型,虽然
eclipse下不报错,但应该也不行),但接口中的抽象方法只能是public类型的,并且默认即为public abstract类型。
5.抽象类中可以包含静态方法,接口中不能包含静态方法
6.抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是public static final类型,并且默认即为public static final类型。
7. 一个类可以实现多个接口,但只能继承一个抽象类。
interface在java8中作的改变
1.增加了default方法和static方法,这两种方法完全可以有方法体
2.default方法属于实例,static方法属于类(接口)
3.接口中的静态方法不会被继承,接口中的静态变量会被继承
11、x%y,正负取值问题
取余取头,取模取尾