类的初始化和执行过程
Posted yz123
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了类的初始化和执行过程相关的知识,希望对你有一定的参考价值。
父类的静态域---子类的静态域---父类的非静态域---父类的构造函数--- 子类的非静态域----子类的构造函数
规律就是:
父类先于子类
静态的先于非静态的
其中静态域包含静态代码块与静态方法以及静态变量,这个谁在前面,则先执行谁。
非静态域同理
父类静态域——》子类静态域——》父类成员初始化——》父类构造块——》父类构造方法——》子类成员初始化——》子类构造块——》子类构造方法
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
以上是关于类的初始化和执行过程的主要内容,如果未能解决你的问题,请参考以下文章