构造方法的运行
对于子类将父类重写,测试代码时,还是会先将父类的构造方法运行,如果不在子类的构造方法写super(有参或者无参数);,在默认的先运行父类的无参构造方法。
public abstract class Demo6 {
public static void main(String[] args) {
new Zif("sfkg");
System.out.println("======");
new Zif();
}
}
class Fuf{
String name;
public Fuf(){
System.out.println("无参数fu");
}public Fuf(String sd){
System.out.println("有参数fu");
}
}
class Zif extends Fuf{
public Zif(){
System.out.println("无参数zi");
}public Zif(String sd){
//要想运行父类的有参方法需写上 **super(sd);**
System.out.println("有参数zi");
}
}
可能产生误会的一点
public class Dervied extends Base {
private String name = "dervied";
public Dervied() {
tellName();
printName();
}
public void tellName() {
System.out.println("Dervied tell name: " + name);
}
public void printName() {
System.out.println("Dervied print name: " + name);
}
public static void main(String[] args){
new Dervied();//1.执行父类的构造方法 2.给自己的成员变量赋值 3。调用构造方法中的调用的方法
}
}
class Base {
private String name = "base";
public Base() {
tellName();
printName();
}
public void tellName() {
System.out.println("Base tell name: " + name);
}
public void printName() {
System.out.println("Base print name: " + name);
}
}
看结果
这两个可能会产生误会,起码我一开始就弄混了,还是理解的不行:
这里的主要原因是,子类将父类的方法覆盖了所以父类的两个方法是不去编译的。
代码块
某道题的代码
class HelloA {
public HelloA() {
System.out.println("HelloA");
}
{ System.out.println("I'm A class"); }
static { System.out.println("static A"); }
}
public class HelloB extends HelloA {
public HelloB() {//优先调用父类的构造方法
System.out.println("HelloB");
}
{ System.out.println("I'm B class"); }
static { System.out.println("static B"); }
public static void main(String[] args) {
new HelloB();
}
/*
先后顺序
1、父类静态代码块
2、子类静态代码块
3、父类构造代码块
4、父类构造方法
5、子类构造代码块
6、子类构造方法
*/
}
注意看代码中的注释