1. java 子类为什么不能继承父类的构造方法?
构造方法的作用是初始化类,子类初始化子类,父类初始化父类,在子类调用自己的构造方法前,会先自动调用父类的无参构造方法,先生成父类对象,再生成子类对象。如果父类没有无参构造方法,子类就必须用super()显示调用父类的构造方法。先有父亲才会有孩子。子类不能直接继承父类的构造方法,而是在new一个子类对象的时候,自动调用父类的无参构造方法。
2. 关于类型强转和 instanceof 运算符:
进行强制类型转换的时候,有可能会出现异常,无法强制转换,于是为了代码更加健壮,在强转之前,用 instanceof 运算符进行判断。
if(objPri instanceof String) {
String str = (String) objPri;
}
instanceof用来判断 objPri是否属于 String,即判断 objPri 是否是 String 类型的一个实例,是的话返回 true, 不是的话返回 false.从而保证在类型强的时候不会失败,提高程序健壮性。
3. 抽象类和抽象方法:
抽象类和抽象方法必须使用 abstract 修饰,抽象类不能被实例化,抽象方法不能有方法体,无法使用new 关键字调用抽象类的构造器创建抽象类的实例。
抽象类为什么不能被实例化?
从哲学上讲,进化不完全的物种是不能生存的,因为抽象类是抽象的,不能是一个完整的具体的类,所以不能被实例化,抽象的东西没有它存在的实际意义。
抽象类不能创建实例,只能做父类被子类继承,抽象类中的构造器是在创建子类的实例的时候被调用的(在子类的构造器中使用super关键字调用);
抽象类只能被继承,抽象方法必须由子类提供实现,也就是说只能被子类重写。
abstract只能用来修饰类和方法,不能修饰成员变量,局部变量和构造器,没有抽象构造器,抽象类中定义的构造器只能是普通的构造器。
4.不能一起用的关键字:
final修饰的类不能被继承,final修饰的方法不能被重写,所以 final 和abstract永远不能同时用。
static修饰方法,表示方法属于类本身,即可以通过类去调用该方法,但是如果定义成abstract类型,则该方法不能通过类去调用(调用没有方法体的方法会报错),所以static和 abstract 不能同时用。
private和abstract不能同时使用,因为private是私有的,不能被继承,但是abstract必须被子类继承重写。
5. 接口:如果将抽象进行的更加彻底,则可以提炼出更加特殊的抽象类-接口,接口里不能包含普通方法,接口中全是抽象方法。
java8对接口进行了改进,允许接口中定义默认方法,提供方法的实现
public interface testInterface {
//修饰符只能是 public 或者 default, 不能是 private
//没有构造器,没有初始化块
//常量定义,只能是静态常量
public static final int a=50;
//接口中不能包含普通方法,接口中所有方法都是抽象方法
//抽象方法无方法体,不提供方法实现
public abstract void out();
public abstract void getData();
//default修饰,默认方法,提供方法体, java8
public default void print() {};
//类方法,直接通过接口调用,java8,用static 修饰
public static String staticTest() {
return "";
};
//内部类,内部接口,内部枚举 public static 修饰
}
6.初始化块:
一个类中可以有多个初始化块,先定义的先执行,后定义的后执行,初始化块的修饰符只能是static,使用static修饰的初始化块被称为静态初始化块。
当创建java对象时,系统总是先调用该类的初始化块,并且按照顺序执行,初始化块没有名字没有标识,无法通过类,对象来调用,只有在创建java对象的时候,隐式调用,而且在构造器执行之前执行。
{
a=6;
}
int a=9;
以上结果为9
int a=9;
{
a=6;
}
以上结果为6;
静态初始化块:
加上static 关键字,就是静态初始化块,也被称为类初始化块,普通初始化块负责在对象执行的时候初始化,static初始化块负责对类进行初始化,所以,静态初始化块比普通初始化块先执行。
普通初始化块在javac编译之后会消失,会被还原到构造器中且位于构造器代码的最前面,但是static初始化块不会消失,因为是类构造器,不是对象构造器。所以所有的静态初始化块都会最先执行。