java类的加载(包含有static定义的方法和变量)

本文详细解析了Java中类的加载与初始化过程,包括静态初始化块、静态成员变量及静态方法的初始化时机,以及类实例创建和销毁的过程。通过具体的代码示例展示了父类与子类在初始化时的执行顺序。

转载:http://www.cnblogs.com/guoyuqiangf8/archive/2012/10/31/2748909.html

1、虚拟机在首次加载Java类时,会对静态初始化块、静态成员变量、静态方法进行一次初始化
 2、只有在调用new方法时才会创建类的实例
 3、类实例创建过程:按照父子继承关系进行初始化,首先执行父类的初始化块部分,然后是父类的构造方法;再执行本类继承的子类的初始化块,最后是子类的构造方法
 4、类实例销毁时候,首先销毁子类部分,再销毁父类部分

复制代码
public class Parent
{
    public static int t = parentStaticMethod2();
    {
        System.out.println("父类非静态初始化块");
    }
    static
    {
        System.out.println("父类静态初始化块");
    }
    public Parent()
    {
        System.out.println("父类的构造方法");
    }
    public static int parentStaticMethod()
    {
        System.out.println("父类类的静态方法");
        return 10;
    }
    public static int parentStaticMethod2()
    {
        System.out.println("父类的静态方法2");
        return 9;
    }
  
    @Override
    protected void finalize() throws Throwable
    {
        // TODO Auto-generated method stub
        super.finalize();
        System.out.println("销毁父类");
    }
    
}
复制代码
复制代码
public class Child extends Parent
{
    {
        System.out.println("子类非静态初始化块");
    }
    static
    {
        System.out.println("子类静态初始化块");
    }
    public Child()
    {
        System.out.println("子类的构造方法");
    }
    public static int childStaticMethod()
    {
        System.out.println("子类的静态方法");
        return 1000;
    }
    @Override
    protected void finalize() throws Throwable
    {
        // TODO Auto-generated method stub
        super.finalize();
        System.out.println("销毁子类");
    }
}
复制代码
复制代码
public class Test
{
   
    public static void main(String[] args)
    {
        // TODO Auto-generated method stub
        Parent.parentStaticMethod();
//        Child child = new Child();
        
    }

}
复制代码

输出

父类的静态方法2
父类静态初始化块
父类类的静态方法

类中static 方法在第一次调用时加载,类中static成员按在类中出现的顺序加载。当调用静态方法2时输出

父类的静态方法2
父类静态初始化块
父类的静态方法2

注释掉Parent.parentStaticMethod();

去掉注释Child child = new Child();

复制代码
父类的静态方法2
父类静态初始化块
子类静态初始化块
父类非静态初始化块
父类的构造方法
子类非静态初始化块
子类的构造方法
复制代码
<think>嗯,用户问的是Javastatic变量能不能定义里面,方法外面。首先,我需要确认Java的语法规则。记得在Java中,的成员变量,无论是静态还是非静态,都是定义体内部的,也就是的大括号里面,而不是在方法或者代码块里面。所以static变量应该是在里面、方法外面声明的。 然后,用户可能对static变量的作用域生命周期有误解。或许他们遇到了编译错误,比如把static变量放在方法内部,导致无法编译。这时候需要解释,方法内部只能定义局部变量,而static变量属于级别的,必须在体中声明。 再想想,有没有例外情况?比如内部或者接口中的变量,但接口中的变量默认是public static final的,不过用户的问题可能更基础。需要举例说明正确的写法,比如里面直接声明static变量,然后在方法中使用它。 可能用户的实际问题是在方法外正确声明static变量,但之前尝试时可能错误地放在了其他位置。需要明确说明static变量的正确位置,并指出如果在方法内部声明会导致错误,因为方法内部不能有static修饰的变量。 最后,总结一下,确保用户理解static变量必须定义内部、方法外部,作为的成员变量存在。</think>在Java中,static变量是完全可以定义内部、方法外部的,这实际上是static变量的标准声明方式。以下是逐步说明: 1. **static变量的本质** static变量属于级别的成员(变量),而非实例级别的成员。它的生命周期与绑定,在加载时初始化,且所有实例共享同一个static变量。 2. **语法规范** static变量的正确定义位置是: ```java public class MyClass { // ✅ 正确:在内部、方法外部声明static变量 static int count = 0; public void myMethod() { // ❌ 错误:不能在方法内部声明static变量 // static int localVar = 10; } } ``` 3. **常见错误场景** 如果尝试在方法内部声明static变量,编译器会报错: ```java public class Test { public void demo() { static int x = 10; // ❌ 编译错误:此处不允许使用修饰符static } } ``` 错误原因是:方法内部只能定义局部变量,而局部变量不能有任何访问修饰符(包括static)。 4. **对比实例变量** static变量实例变量的声明位置相同,区别仅在于是否有`static`关键字: ```java public class Example { int instanceVar; // 实例变量 static int classVar; // 变量static变量) } ``` 5. **使用场景建议** static变量适合用于: - 需要跨实例共享的数据(如计数器) - 定义常量(通常配合`final`使用,如`public static final double PI = 3.14159;`) **总结**: static变量必须定义内部、方法外部,这是Java语法明确要求的。如果在方法内部声明static变量,会违反Java的语法规则导致编译错误。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值