继承中的一些构造函数问题。
this(); 代表本类的构造函数
super(); 代表父类的构造函数。
在子类的构造函数中的第一行默认的包含super();隐式语句
但如果父类中有其他的非空参的构造函数而没有空参的构造函数,在子类的构造函数中第一行如果没有去调用父类的非空参构造函数,则会在编译时报错。因为子类中所有的构造函数默认都会访问父类中的空参构造函数。
例:
class Fu
{
Fu(){
System.out.println(“Fu…..run”);
}
}
class Zi extends Fu
{
Zi(){
Super();//隐式语句
System.out.println(“Zi......run”);
}
}
如果父类中不写构造函数的话,即存在一个隐式的空参的构造函数。
子类为什么要访问父类的构造函数?
因为子类在继承了父类的内容(属性)时,在使用之前必须知道父类是如何进行初始化的(如果没有显式的初始化,则,数值类型为0,boolean行为false,String 为 null)。所以必须调用父类的构造函数。
this(); 和 super();只能出现在子类构造函数的第一行。故二者只能有其一。
如果子类其中的某一构造函数的第一行使用了this调用了其他的子类构造函数。则在此构造函数中不会访问父类的构造函数。
子父类中的成员变量不存在继承覆盖。
在本类中,成员变量和局部变量同名用this 区分。
在子父类中,成员变量同名用super区分。
this 代表一个本类对象的引用。
Super 代表一个父类空间
子类不能直接访问父类中的私有成员
子父类中的成员函数同名,成为子类函数覆盖父类函数
函数的两个特性
1, 重载:发生在同一个类中。(函数名相同,形参不同)
2, 覆写:发生在子父类中。子父类函数一模一样(返回类型,函数名,形参都相同)
覆盖的注意事项:
1, 子类方法的权限必须大于或等于父类函数的权限。
2, 静态只能覆盖静态,或被静态覆盖。
final 最终修饰符
可以修饰类,方法,变量。
1, 当修饰类时,该类表示最终类,不能被其他类所继承。
2, 当修饰方法时,该方法不能被覆盖。
3, 当修饰变量时,该变量不能被修改。
public staticfinal double PI =3.1415; 全局常量
子类成员变量在new过程中值变化过程
首先通过子类构造函数的第一行的隐式supe();语句访问父类构造函数。在此时子类的成员变量都是默认值(数值类的为0,boolean类型的 为false,String类型的为null而不是“”)。
当调用父类构造函数结束后,则显示初始化成员变量。
再接着是按照子类构造函数的方式初始化成员变量。
例:
package ExtendsDemo; class Fu { int num ; Fu(){ System.out.println("----------------------Fu show start------------------------"); show(); System.out.println("----------------------Fu show end----------------------------"); } void show() { System.out.println("fu show run..."); } } class Zi extends Fu { int num = 8; String s = "子类显示初始化!"; boolean b = true; Zi(){ // super();隐式调用 在调用父类构造函数时还未对子类成员变量进行显式初始化。故此时num = 0 //等super方法执行完之后才对子类成员变量进行初始化。此时num = 8 //等显式初始化之后 show(); System.out.println("Zi 显示初始化 end....."); System.out.println("--------------------最后进行构造函数的初始化----------------------------------------"); num = 9; s = "子类构造方法初始化!"; b = false; } void show(){ System.out.println("zi show run ..."+num+"----"+s+",,,,,,"+b); } } public class ExtendsDemo1 { /** * @param args */ public static void main(String[] args) { // new Zi(); Zi z = new Zi(); z.show(); } }
运行结果:
----------------------Fu show start------------------------ zi show run ...0----null,,,,,,false ----------------------Fu show end---------------------------- zi show run ...8----子类显示初始化!,,,,,,true Zi 显示初始化 end..... --------------------最后进行构造函数的初始化---------------------------------------- zi show run ...9----子类构造方法初始化!,,,,,,false