java用一个方法对变量初始化_java中变量和方法的初始化顺序

不管是静态变量,还是非静态变量,都是先初始化变量之后再执行构造方法

类中的变量分为3大类:局部变量、实例变量(成员变量)、类变量(静态变量)

public class App {

public static void main(String[] args) {

A c = new A(3);

System.out.println(c.a);

System.out.println(A.b);

}

}

class A {

public int a;//实例变量

static{

System.out.println("初始化a");

}

public static int b =9 ;//类变量

public A(int data){

System.out.println("A被初始化");

}   //一旦类自己写了构造方法,不管是带参或不带参的构造方法,系统将不再使用自带的无参构造器。如果只写了有参构造函数,却要调用无参构造方法,编辑器会报错。

}

初始化顺序:走到A c = new A(3)时,先把A类的相关信息加载进来,静态变量赋予默认值,然后执行(类变量)静态变量或静态代码块赋初值,如果没有初始值将不执行这部(静态变量和静态代码块两者之间没有顺序,谁在前谁先执行)--》然后给实例变量赋默认值--》初始化实例变量(如果有初始值)--》执行构造方法;

public class App {

public static void main(String[] args) {

A c = new A(3);

System.out.println(c.a);

System.out.println(A.b);

}

}

class A extends B{

public int a =10;

static{

System.out.println("初始化a");

}

public static int b =9;

public A(int data){

//super(3);

this.b = data;

System.out.println("A被初始化");

}

}

class B{

int b1 = 9;

static int b2=90;

public B(){

System.out.println("初始化B");

}

public B(int data){

System.out.println(data);

}

}

有继承关系的类的初始化跟单个类有点不同:

A c = new A(3);先执行加载,把子类和基类的信息全部加载到方法区(静态变量赋予默认值)-》执行基类的静态变量初始化(如果有初始值)和静态代码块--》子类的基类的静态变量初始化(如果有初始值)和静态代码块--》加载子类和父类的实例变量,并赋予默认值--》执行父类的实例变量初始化(如果有初始值)和父类的构造方法--》执行子类实例变量初始化(如果有初始值)和子类构造方法;

对于构造方法来说,有以下注意点:

1、子类不重写构造方法,采用默认的构造方法,默认会去调用父类的默认无参构造方法,如果父类一旦重写了构造方法,一定要重写无参构造方法;

2、子类重写了构造方法(不管是否带参),如果没有显示调用父类的某个构造方法,默认还是调用父类的无参构造方法,此时同样,如果父类一旦重写了构造方法,一定要重写无参构造方法;

3、子类重写了构造方法(不管是否带参),如果显示调用父类的某个带参构造方法,此时父类可以没有无参构造方法,只要含有子类调用的有参构造方法即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值