思否学否

类的初始化和执行过程
父类的静态域---子类的静态域---父类的非静态域---父类的构造函数--- 子类的非静态域----子类的构造函数
规律就是:
父类先于子类
静态的先于非静态的
其中静态域包含静态代码块与静态方法以及静态变量,这个谁在前面,则先执行谁。
非静态域同理
 
父类静态域——》子类静态域——》父类成员初始化——》父类构造块——》父类构造方法——》子类成员初始化——》子类构造块——》子类构造方法
 
note :构造方法没有返回值,也不写void,非静态成员只能被类的实例化对象引用
 
1、在无参构造器时, java会自动在派生类的构造器中插入对基类的构造器的调用
eg:
public class Humans {     
    Humans(){  
        System.out.println("我是人!");  
    }   
} 

public class Student extends Humans{  
  
    Student(){  //无参数构造器
        System.out.println("我是学生!");  
    }   
}  
public class test {  
    public static void main(String args[]){  
          new Student();  
    }  
}  

结果是:

 我是人!
我是学生!

2.当构造器有参数时,那就必须使用关键字super显式地调用基类构造器的代码,并且匹配适当的参数列表。

 

public class Humans {  
      
    private String name;  
    Humans(String name){  
        System.out.println("我是叫"+name+"的人");  
    }  
  
    public String getName() {  
        return name;  
    }  
  
    public void setName(String name) {  
        this.name = name;  
    }  
  
}

public class Student extends Humans{  //派生类
      
    private String name;  
    Student(String name){  
        super(name);  //注释掉super(name);将会报错。原因是派生类必须调用基类构造器。因为实例化派生类时,
// 基类也会被实例化,如果不调用基类的构造器,基类将不会被实例化。 System.out.println("我是学生!"); } public String getName() { return name; } public void setName(String name) { this.name = name; } } public class test { public static void main(String args[]){ new Student("zhangsan"); } }

  输出为:

我是叫zhangsan的人

我是学生!

  3.如果派生类定义了和基类一样的属性或方法,将覆盖基类的属性和方法。

public class Student extends Humans{  
      
    public String sex;  
      
    protected int age ;  
      
    private String name;  
      
    Student(String sex ,String name,int age){  
        super(sex,name,age);  
    }  
      
    public String getName() {  
        return name;  
    }  
  
    public void setName(String name) {  
        this.name = name;  
    }  
}

  输出:

null

null

0

  因为只有基类的属性在构造时赋值了,派生类的没有,当访问这些属性时,访问的是派生类的属性,所以全为null或者0。

只有当派生类的属性也被实例化时,才会得到属性的值。代码改为如下:

public class Student extends Humans{  
      
    public String sex;  
      
    protected int age ;  
      
    private String name;  
      
    Student(String sex ,String name,int age){  
        super(sex,name,age);  
        this.sex = sex;  
        this.name = name;  
        this.age = age;  
    }  
      
    public String getName() {  
        return name;  
    }  
  
    public void setName(String name) {  
        this.name = name;  
    }  
}

  才能输出:

男
zhangsan
10  

  

posted on 2019-11-22 22:23  思否学否  阅读(228)  评论(0编辑  收藏  举报