遗忘的java基础知识
java访问权限
方法重写规则:
(1)返回类型与被重写方法的返回类型可以不相同,但是必须是父类返回值的派生类
(2)访问权限不能比父类中被重写的方法的访问权限更低。例如:如果父类的一个方法被声明为 public,那么在子类中重写该方法就不能声明为 protected。被覆盖的方法不能是 private 的,否则只是在子类中重新定义了一个新方法。
(3)声明为 final 的方法不能被重写。声明为 static 的方法不能被重写,但是能够被再次声明。
(4)子类和父类在同一个包中,那么子类可以重写父类所有方法,除了声明为 private 和 final 的方法;子类和父类不在同一个包中,那么子类只能够重写父类的声明为 public 和 protected 的非 final 方法。
(5)重写的方法能够抛出任何非强制异常,无论被重写的方法是否抛出异常。但是,重写的方法不能抛出新的强制性异常,或者比被重写方法声明的更广泛的强制性异常,反之则可以。
接口和抽象类的区别
抽象类与接口对比Java 8 中接口中会有 default 方法,即方法可以被实现。
抽象类中可以存在属性(非静态),而接口中若有属性必须是静态属性(static)。也就是说,接口中只能存在抽象方法、静态属性;而抽象类中可以存在抽象方法,具体实现,非静态属性,静态属性等。
JDK中常用的包
JDK中主要的包String相关问题
String源码
string维护的是final字符串数组,不可变
常量池(专门存储常量的地方,都指的是方法区中)分为编译常量池(不研究,存储字节码的相关信息)和运行常量池(存储常量数据)
string对象创建过程
StringBuilder与StringBuffer
StringBuffer中所有的方法都是用了synchronized修饰符,因此线程安全,但是开销大。
String创建对象问题
str1==str2/3 , 与其他不相等
(1)单独使用""引号创建的字符串都是直接量,编译期就已经确定存储到常量池中;
(2)使用new String("")创建的对象会存储到堆内存中,是运行期才创建;
(3)使用只包含直接量的字符串连接符如"aa" + "bb"创建的也是直接量编译期就能确定,已经确定存储到常量池中(str2和str3);
(4)使用包含String直接量(无final修饰符)的字符串表达式(如"aa" + s1)创建的对象是运行期才创建的,存储在堆中;
(5)通过变量/调用方法去连接字符串,都只能在运行时期才能确定变量的值和方法的返回值,不存在编译优化操作.
++i与i++的区别
熟悉的表述是:前置++是先将变量的值加 1,然后使用加 1 后的值参与运算,而后置++则是先使用该值参与运算,然后再将该值加 1。
实际上:不管是前置 ++,还是后置 ++,都是先将变量的值加 1,然后才继续计算的。二者之间真正的区别是:前置 ++ 是将变量的值加 1 后,使用增值后的变量进行运算的,而后置 ++ 是首先将变量赋值给一个临时变量,接下来对变量的值加 1,然后使用那个临时变量进行运算
java对象初始化顺序
父类和子类的final static属性 >> 父类的static属性 >> 父类的static代码块 >> 子类的static属性
>> 子类的static代码块 >> 父类的非静态变量属性 >> 父类的非静态代码块 >> 父类构造函数
>> 子类的非静态变量 >> 子类的非静态代码块 >> 子类的构造函数
总结:final static在类的准备阶段已经加载好,最优先;
static优先于非静态; 属性优先于代码块; 父类优先于子类;
throw和throws区别
throw用在方法体内,表示抛出异常
throws用在方法定义头部,表示可能的抛出异常类型。