`

static相关的内容(静态类、方法、变量、域,以及非静态的 学习

阅读更多
static解析
http://www.iteye.com/topic/691013
要是改变初始化与域的位置,输出结果也会有相应改变,同样静态(或非静态)的初始化和域,基本按照先后顺序执行。

结论是:

1)静态元素(变量、方法、域、内部类)不能直接调用非静态元素 ,需要对非静态元素所属类实例化,特别是调用非静态内部类时,需要对其外部类实例化,然后获取非静态内部类的实例对象。
 
2)不管位置如何,静态初始化 / 域先于非静态初始化 / 域,父类的初始化 / 域先于子类的初始化 / 域,变量的初始化以及域先于构造方法执行。即:
      a) 先初始化 / 域,后构造方法;
      b) 先“静态”后“非静态”;
      c) 先父后子。
其他静态 / 非静态方法均需调用才能执行

这里请注意次序排列的先后顺序,比如静态非静态的区分先于父子类的区分,即子类的静态初始化比父类的非静态初始化优先的。

3)静态方法在第一次被执行时,会先执行静态的初始化和域,如所属类的main方法,构造方法虽没有static标示符,但也可以认为是静态方法。而在构造方法执行(即实例化)时,除了执行静态初始化和域,接着又会执行非静态的初始化和域。

当然非静态在每次实例化都会执行一次。


关于域,那是不归于方法封装的执行代码,即它是可以主动执行(静态在定义时,非静态在实例化时进行)的,而不必通过方法调用,应该有点类似C吧。

4)域中可以定义变量和类,但不能是静态变量和静态类(因为不需要共享),并且变量和类都只是域内部使用,因此不需要public/protected/private标识符。


其实我想事实是这样的:
一个类的运行,JVM做会以下几件事情 1、类装载 2、链接 3、初始化 4、实例化;而初始化阶段做的事情是初始化静态变量和执行静态方法等的工作。所以,当Class.forName(args[0],true,off.getClass().getClassLoader());中的true变为false的时候,就是告诉JVM不需再load class之后进行initial的工作。这样,将initial的工作推迟到了newInstance的时候进行。所以,static块的绝对不是什么“只是在类被第一次实体化的时候才会被仅仅调用一次”,而应该是在类被初始化的时候,仅仅调用一次。
分享到:
评论

相关推荐

    php中静态类与静态变量用法类.zip

    直接调用类方法量:class::attribute/function,无论是静态/非静态都可以,静态static:声明类成员或方法为 static,就可以不实例化类而直接访问,不能通过一个对象来访问其中的静态成员(静态方法除外),静态成员属于类,不...

    static静态变量使用@Value注入方式.md

    MarkDown文档,大家应该都知道,@Value注解可以给类中的非静态变量注入值,但是给静态变量注入值则会有警告,结果是失败的,本文档说明了如何使用@Value注解给类的静态变量赋值

    静态变量与非静态变量获取配置文件application中变量值的区别.docx

    springboot引用静态资源static中变量常用方法,经常用到的是非静态变量,在需求类方法中引入比较容易配置,当遇到静态变量时常出现错误,本文档为手动操作样例与结构展示

    C#静态static的用法实例分析

    静态类与非静态类的重要区别在于静态类不能实例化,也就是说,不能使用 new 关键字创建静态类类型的变量。在声明一个类时使用static关键字,具有两个方面的意义:首先,它防止程序员写代码来实例化该静态类;其次,...

    PHP静态成员变量和非静态成员变量详解

    数据成员可以分静态变量、非静态变量两种. 静态成员:静态类中的成员加入static修饰符,即是静态成员.可以直接使用类名+静态成员名访问此静态成员,因为静态成员存在于内存,非静态成员需要实例化才会分配内存,所以静态...

    C++非静态成员函数完全可以作为线程函数

    一般地,线程要读写类的私有成员变量,只有两种方法:将全局函数声明为类友元friend,或者使用静态的成员函数static。那非静态的成员函数呢?一般地方都说的是,不行,做不了。。。为什么不行?都是代码区的代码,...

    springboot无法从静态上下文中引用非静态变量的解决方法

    主要介绍了springboot无法从静态上下文中引用非静态变量的解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    java 静态非静态 字段方法 子类父类构造_初始化顺序!

    java 静态_非静态 字段_方法_代码块 子类父类构造_初始化顺序! 三个class 让你清清楚楚 第一个class java代码如下: package initialOrder; class Parent { // 静态变量 public static String p_StaticField...

    PHP类的静态(static)方法和静态(static)变量使用介绍

    直接调用类方法/变量:class::attribute/function,无论是静态/非静态都可以。但是有前提条件: A. 如果是变量,需要该变量可访问。 B. 如果是方法,除了该方法可访问外,还需要满足: b1) 如果是静态方法,没有...

    php中静态类与静态变量用法的区别分析

    static是定义一个静态对象或静态变量,关于static 定义的变量或类方法有什么特性我们看完本文章的相关实例后就见分晓了. 1. 创建对象$object = new Class(),然后使用”->”调用:$object->attribute/function,前提...

    深入浅析Java中Static Class及静态内部类和非静态内部类的不同

    上次有朋友问我,java中的类可以是static吗?我给他肯定的回答是可以的,在java中我们可以有静态实例变量、...当然类也可以是静态的,下面小编整理了些关于java中的static class相关资料分享在脚本之家平台供大家参考

    详解php用static方法的原因

    静态方法不需要所在类被实例化就可以直接使用。 静态方法效率上要比实例化高,静态方法的缺点是不自动进行销毁,而实例化的则可以...这两者的区别在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组

    C#静态方法与非静态方法实例分析

    通常来说,C#的类中可以包含两种方法:静态方法和非静态方法。 使用了static 修饰符的方法为静态方法,反之则是非静态方法。 静态方法是一种特殊的成员方法,它不属于类的某一个具体的实例,而是属于类本身。所以对...

    Java中的静态变量、静态方法与静态代码块

    而非静态代码则在类的使用阶段(也是实例化一个类的时候)才会被初始化。  静态变量  可以将静态变量理解为类变量(与对象无关),而实例变量则属于一个特定的对象。  静态变量有两种情况:  ● 静态...

    c#静态方法和非静态方法详细介绍

    C#的类中可以包含两种方法:静态方法和非静态方法。 使用了static 修饰符的方法为静态方法,反之则是非静态方法。 静态方法是一种 特殊的成员方法,它不属于类的某一个具体的实例,而是属于类本身。所以对静态方法不...

    .NET中的静态与非静态的区别分析

    5)静态类不能作为字段,方法参数和局部变量使用;普通类可以; 静态类的意义: 可以用静态类封装一组不与任何对象相关联的方法,如Math类,Console类。   静态构造函数 vs 实例构造函数 静态构造函数与实例构造函数...

    PHP面向对象之旅:深入理解static变量与方法

    static 的属性和方法,只能访问static的属性和方法,不能类访问非静态的属性和方法。因为静态属性和方法被创建时,可能还没有任何这个类的实例可以被调用。 static的属性,在内存中只有一份,为所有的实例共用。 ...

    static学习

    有关static的学习:静态方法和静态变量是属于某一个类,而不属于类的对象。 2)静态方法和静态变量的引用直接通过类名引用。 3)在静态方法中不能调用非静态的方法和引用非静态的成员变量。反之,则可以。 4)静态...

    C++静态成员变量和静态成员函数

    静态成员变量和静态成员函数 class ClassA { int a; int b; static int c; //静态成员变量 static void xxx_fun() //静态成员函数 { ... } } 普通成员变量每个对象都有各自的一份,静态成员变量所有对象...

    c# static 静态数据成员

    ① 静态成员属于类所有,非静态成员属于类的实例所有。 ② 每创建一个类的实例,都市在内存中为非静(动)态成员新分派一块存储; 静态成员属于类所有,为各个类的实例所公用,无论类创建了几多实例,类的静态成员在...

Global site tag (gtag.js) - Google Analytics