java代码-java初学者提问 在类中 用static成员变量实例化自身类 程序的执行顺序过程是怎样的?

问题描述

java初学者提问 在类中 用static成员变量实例化自身类 程序的执行顺序过程是怎样的?

class Demo03 {
public static void main(String[] args) {
A.show();
}
}
class A {
//构造方法
A(){
System.out.println("构造方法执行");
System.out.println(b);
System.out.println(c);
}

static A a=new A();
static int b=10;
int c=20;

//静态方法
public static void show(){
    System.out.println("静态方法执行");
    System.out.println(b);
} 

//静态代码块
static {
    System.out.println("静态代码块执行");
    System.out.println(b);
}

//非静态代码块
{
System.out.println("非静态代码块执行");
System.out.println(b);
System.out.println(c);
}

//非静态方法
public void show2(){
    System.out.println("非静态方法执行");
    System.out.println(b);
    System.out.println(c);
}

}

程序执行结果是:
非静态代码块执行
0
20
构造方法执行
0
20
静态代码块执行
10
静态方法执行
10

不太理解为什么非静态代码块会先执行。
希望有前辈能告知一下这个程序的执行顺序过程 谢谢。

解决方案

第一次运行时运行类时,类首先加载到内存,先完成类的初始化,在方法区为为静态的成员分配内存空间,包括静态Field和静态的初始化块,接下来在堆内存中为实例的Field分配内存空间,对实例的Field进行隐式初始化,之后显式初始化,在接下来运行非静态的初始化块,最后调用构造器进行初始化创建相应的对象,注意这里的所有的初始化都是从根类父类再到当前类的,之后再次运行该类时,由于该类是停驻内存的,所以不用在初始化了直接调用构造器创建对象。还有不足之处,欢迎交流啊

时间: 2024-11-30 03:48:52

java代码-java初学者提问 在类中 用static成员变量实例化自身类 程序的执行顺序过程是怎样的?的相关文章

java代码-java关于变量初始值的问题

问题描述 java关于变量初始值的问题 int x; System.out.println(x); 这段会报错,而如果是以下的代码却不会报错 class A{ int x; int getX(){ return x; } void print(){ System.out.println(x); } } 原因在哪 解决方案 int x只是声明,java规定局部变量使用前必须初始化,否则编译不通过.而第二个是类内部的成员变量,编译器自动初始化成员变量 解决方案二: 说法同上,java编译器初始化ja

深入分析C++派生类中的保护成员继承_C 语言

protected 与 public 和 private 一样是用来声明成员的访问权限的.由protected声明的成员称为"受保护的成员",或简称"保护成员".从类的用户角度来看,保护成员等价于私有成员.但有一点与私有成员不同,保护成员可以被派生类的成员函数引用. 如果基类声明了私有成员,那么任何派生类都是不能访问它们的,若希望在派生类中能访问它们,应当把它们声明为保护成员.如果在一个类中声明了保护成员,就意味着该类可能要用作基类,在它的派生类中会访问这些成员.

c++-明明在类中定义了成员,为什么找不到标识符?

问题描述 明明在类中定义了成员,为什么找不到标识符? 类定义如下: class HelloWorld : public cocos2d::Layer { private: Sprite *beijing; Sprite *cangshu; Sprite *guazi1; public: // there's no 'id' in cpp, so we recommend returning the class instance pointer static cocos2d::Scene* cre

java static-假设有一个类,我只对这个类的引用做一个声明,那么这个类中的static方法会被初始化吗

问题描述 假设有一个类,我只对这个类的引用做一个声明,那么这个类中的static方法会被初始化吗 假设下面这种情况,test1中的do方法会被初始化吗? public class test{ public static void main(string []args){ test1 t: } } class test1{ int i: static void do(){} } 解决方案 第一次访问的含义是,访问了这个静态类中的任何方法.属性.字段,那么所有的属性都会被初始化. 解决方案二: 方法

反射-java代码实现生成一套表中的数据,包括表的关联关系

问题描述 java代码实现生成一套表中的数据,包括表的关联关系 在a表中生成一套a表中的数据,只是一个字段值不一样而已,并且还要生成表的关系关系 相当于在原来表关系的基础上在生成一套新的数据.

Java中成员方法与成员变量访问权限详解_java

记得在一次面试的笔试题中,有的面试官会要求写出具体的像pullic这些访问限定符的作用域.其实,平常我都没去系统的考虑这些访问限定符的作用域,特别是包内包外的情况,OK,笔试不行了.  这是java基本的知识,也是公司看重的,那没办法啦,我的脑袋记不住东西,那我只能把这些东西写下来方便自己温故知新,不废话了,贴代码了. 代码如下: package com.jaovo; /** *_1_ 成员变量访问权限的求证 * public private protected default(默认的权限) *

浅析Java中局部变量与成员变量同名解决技巧_java

要想区分这哥俩,首先,我们得知道它们分别是什么.先从成员变量下刀. 成员变量        我们来研究一个事物:                属性:外在特征:例如人的身高,体重                行为:能够做什么:例如人有说话,打球等行为.        而在Java语言中,最基本的单位是类,类就是用来体现事物的.        用类class来描述事物也是如此:                属性:对应类中的成员变量                行为:对应类中的成员函数    

锁-JAVA中多线程读取成员变量的重复问题

问题描述 JAVA中多线程读取成员变量的重复问题 这是个模拟卖票的问题,使用一个对象实现Runnable接口建立四个线程,这个对象有100张票,四个进程同时卖,因为没使用锁,所以会出现负数票,但是为什么会出现相同的票呢?8号票卖了四次,是因为成员变量在if之后进栈保存了值?然后直接用这个num输出吗? 代码: class Ticket implements Runnable//extends Thread { private int num = 100 public void run()//这时

关于JAVA接口中是否包含成员变量的争执,请大家帮忙解答!

问题描述 公司考试的试题中有一道判断题:接口不包含成员变量和方法实现.我选择的而是错,因为接口中可以包含成员变量(其实就是接口常量),但是答案是对的,我与出题人交流时无法达成一致,他的理由是:首先,对于变量和常量做一个澄清.常量就是不可以被改变的数值.变量就是可以被改变的数值.如果模糊一点,也可以都叫做变量. 对于接口中定义的变量,编译器会默认它是常量,不可更改.等同于 final static. 其次,对于接口来说,本身是不不可以被实例化,也不能包含任何可变的数据.您给出的例子是类中的变量,而