码迷,mamicode.com
首页 > 其他好文 > 详细

类的初始化和执行过程

时间:2019-11-22 23:52:08      阅读:136      评论:0      收藏:0      [点我收藏+]

标签:his   类构造   zhang   protected   ring   oid   extend   ati   插入   

父类的静态域---子类的静态域---父类的非静态域---父类的构造函数--- 子类的非静态域----子类的构造函数
规律就是:
父类先于子类
静态的先于非静态的
其中静态域包含静态代码块与静态方法以及静态变量,这个谁在前面,则先执行谁。
非静态域同理
 
父类静态域——》子类静态域——》父类成员初始化——》父类构造块——》父类构造方法——》子类成员初始化——》子类构造块——》子类构造方法
 
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  

  

类的初始化和执行过程

标签:his   类构造   zhang   protected   ring   oid   extend   ati   插入   

原文地址:https://www.cnblogs.com/yz123/p/11914586.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!