㈠ java 中静态内部类字段什么时候初始化是在外部类加载的时候就初始化吗
首先分析下名字:静态内部类
静态是static。静态的方法或者参数是随着类的加载而产生的(感觉应该是JVM启动时static属性就加载了。)。这就是为什么不用实例化类,就可以调用它的原因。
内部类:用内部类是因为内部类与所在外部类有一定的关系,往往只有该外部类调用此内部类。其他类不会调用。所以没必要另写一个类。外部类可以调用内部类。而内部类不能调用外部类的方法。
所以我觉得
静态内部类中的属性,方法,是在外部类加载的时候初始化的。
希望对您有帮助。如果有问题请自行
谷歌
度娘.
㈡ 关于JAVA中static初始化问题
java虚拟机在首次主动使用类型的时候才会初始化(lazy-load的形式),主动使用包括以下6种情况
1. 创建类的实例
2. 调用类的静态方法
3. 操作类的非常量静态字段(非final static)
4. 调用特定的反射方法
5. 初始化一个类的子类
6. 指定一个类为虚拟机启动时的初始化类
所以说,你必须主动使用到这个类,这个类才会被初始化,这就能解释第一次有输出,而第二次没有输出的情况了
另外,值得一提的是,加载和初始化不是一个概念,比如,在main函数中写
Table a = null;
一样不会有输出。。Table类被加载了但是没有被初始化,因为这不属于上述6种“主动使用”情况之一,不信试试。。。
㈢ java 静态数据初始化
从主类public class StaticInitialization 中的开始main函数开始。
在初始化对象时,开始 静态数据的初始化
譬如:
执行完
public class StaticInitialization {
public static void main(String[] args) {
System.out.println(
"Creating new Cupboard() in main");
后,然后
执行new Cupboard();这段代码
这时,程序就会跳到Cupboard这个类中,当实例化Cupboard这个类的对象的时候,Cupboard这个类的里面静态数据也同时被处理。
剩下的代码都一样。
㈣ java static 初始化顺序语法并不正确
执行到Test1.a
调用了Test1所以开始对Test1中静态部分初始化
初始化a static int a=(new Test1()).aa();
因为new了Test1对象 所以线程执行实例化类Test1,实例代码块执行
之后调用int aa() , aa()执行
到这里 a的初始化完毕
又开始执行 静态代码块"
最后输出结果
你调用一个类 静态方法块或属性没有初始化的话 就进行初始化
实例化一个类 就调用构造方法实例化 并没有什么语法相悖啊
若static int a=(new Test1()).aa();改为static int a=10;则该程序实例初始化根本就不会执行
你有没有实例化对象 又怎么会执行"实例初始化"
㈤ java static 类 什么时候初始化
java">代码:Student s = new Student();做了哪些事情?(理解)
(1)把Student.class文件加载到内存
(2)在栈内存为s开辟空间
(3)在堆内存为学生对象申请空间
(4)给学生的成员变量进行默认初始化。null,0
(5)给学生的成员变量进行显示初始化。林青霞,27
(6)通过构造方法给成员变量进行初始化。刘意,30
(7)对象构造完毕,把地址赋值给s变量
㈥ 高级Java开发中什么是静态初始化器
静态初始化器是由关键字static引导的一对大括号括起的语句组。它的作用与类的构造函数有些相似,都用来完成初始化的工作,但是静态初始化器与构造函数有三点根本的不同:
(1)构造函数是对每个新创建的对象初始化,而静态初始化器是对每个类进行初始化;
(2)构造函数是在用new运算符产生新对象时由系统自动执行,而静态初始化器则是在它所属的类加载入内存时由系统调用运行的;
(3)不同于构造函数,静态初始化器不是方法,没有方法名、返回值和参数列表。
package com.text.java;
/**
* <p class="detail">
* 功能:静态初始化器
* static{ 和 }之间的代码被称为静态初始化器。它只有在第一次加载类时运行。
* 只有静态变量才可以在静态初始化器中进行访问。
* 虽然创建了多个实例,但静态初始化器只运行一次。
* </p>
* @ClassName: StaticUtil
* @version V1.0
* @date 2016-8-10
* @author dmw
*/
public class StaticUtil {
static int count;
static{
System.out.println("类初始化静态加载++++");
System.out.println("加载次数"+count);
count++;
}
public static void main(String[] args) {
StaticUtil temp1=new StaticUtil();
StaticUtil temp2=new StaticUtil();
StaticUtil temp3=new StaticUtil();
// 输出: 类初始化静态加载++++
// 加载次数0
}
}
㈦ Java的静态块和初始化块分别何时执行有什么区别
静态初始化块:当类第一次加载时执行。
非静态初始化块:非静态初始化块会在构造函数执行时,且在构造函数主体代码执行之前被执行。
区别如下:
1、执行次数不同
静态块只执行一次,初始化块可以执行多次。
2、作用不同
静态初始化块仅能初始化类变量,即static修饰的数据成员。
非静态初始化块可以初始化类的实例变量。
(7)javastatic初始化扩展阅读:
使用Java静态代码块注意事项:
1、它是随着类的加载而执行,只执行一次,并优先于主函数。具体说,静态代码块是由类调用的。类调用时,先执行静态代码块,然后才执行主函数的。
2、静态代码块其实就是给类初始化的,而构造代码块是给对象初始化的。
3、静态代码块中的变量是局部变量,与普通函数中的局部变量性质没有区别。
4、一个类中可以有多个静态代码块。
5、对于静态变量、静态初始化块、变量、初始化块、构造器,它们的初始化顺序依次是(静态变量、静态初始化块)>(变量、初始化块)>构造器。
㈧ java中的静态初始化和动态初始化
静态初始化就是static,动态初始化就是new
所谓的静态和动态是相对于程序运行是而言的,静态是在程序编译时就初始化好了的,动态初始化是在程序运行是才动态分配内存空间,
我觉得已经够通俗的了
㈨ 关于Java显示的静态初始化
static{ cup1=new Cup(1);cup2=new Cup(2);} 这个就是java里的静态成员初始化语法。不是方法,只是给静态成员数据赋初始值。
Cup.cup1.f(99)可以看成两部分:
x = Cup.cup1 这是取出Cup类中的静态成员数据cup1,这里称之x
x.f(99) 这是调用对象x的成员函数f
㈩ Java 中final static变量为什么要初始化
举个例子:一、一个属性成员变量为:public int age;(编写完该句意味着虚拟机已经为该成员变量age赋默认值0。int类型默认值为0。也可以直接定义时赋值,如public int age =10;。该age的值可以被赋值或者在构造方法里面进行改变)。
二、public static int age;(该句增加static修饰age,不同的是,加了static表示了该变量为全局变量,且默认取值为0,因为int默认取值为0。也可以进行直接定义时赋值public static int age =10;不同的是该属性不依赖对象、依赖类,本类对象共享一份,和上面一样该age的值一样可以被赋值或者在构造方法里面进行改变)。
三、public final int age;(该句用final单独修饰,表示该成员属性变量age将不会取int类型的默认值,故age没有被初始化,必须在定义的时候进行直接赋值,或者在创建对象的时候使用构造方法对该成员属性变量进行赋值。并且一旦用final定义后,就变为最终变量,值 不可以再被改变!所以,该句代码的正确写法应该是如下两种:1、public final int age = 10;
2、
class Dog{
public final int age;
public Dog(){
int age = 10;
}
}
)。
四、public static final int age;(该句和上面一样,也是age没有被初始化,所以age必须被赋值,不同的是该情况下必须是直接赋值,而不能在构造方法里面进行赋值。正确的写法是:public static final int age = 10;这是因为第一、用final修饰的属性不能够用数据类型的默认值为初始化的值,必须要直接赋值,或者在使用构造方法去创建对象的时候对变量进行赋值。但是,第二、由于被static修饰以后的属性成员变量,该成员变量是在类加载完的时候其值已经被确定了,该值依赖类,并不依赖对象。即使不创建对象它就已经有值了,并且由于被final所修饰不能够用数据类型的默认值,故而只能直接赋值,并且被final所修饰成为了最终变量,不可以改变。故而,由于以上两方面原因,只能是直接赋值。public static final int age = 10;)