类成员变量的初始化

1-1 类成员变量初始化的分类

类成员变量的初始化可简单分为两类:非静态成员变量的初始化(以下简称“普通初始化”)和静态成员变量的初始化(“静态初始化”)。

 

1-2 与初始化相关的规律

  1. 构造函数实际上也是静态方法;
  2. 首次创建类对象、访问类的静态成员(变量或方法)会引发类加载; 
  3. 类加载时会触发静态初始化;
  4. 普通初始化会在任何非静态方法(但包括构造函数)被调用前完成;
  5. 静态初始化会在任何方法被调用前完成;
  6. 总结4、5点有:调用除构造函数外静态方法只会引发静态初始化,而不会引发普通初始化。

 

1-3 类成员变量的初始化顺序

  1. 变量(无论是静态成员变量还是非静态成员变量)定义的先后顺序决定了初始化顺序;
  2. 顺序优先级:静态成员变量 = 静态代码块 > 非静态成员变量 = 非静态代码块 > 构造函数

 

1-4 相关案例

复制代码

class Cup{
    Cup(int marker){
        System.out.println("Cup("+marker+")");
    }

    void f1(int marker){
        System.out.println("f1("+marker+")");
    }
}

class Cups{
    static Cup cup1 = new Cup(1);
    Cup cup2 = new Cup(2);
    {
        Cup cup3 = new Cup(3);
    }
    static{
        Cup cup4 = new Cup(4);
    }

    Cups(){
        System.out.println("Cups()");
    }

    static void f2(int marker){
        System.out.println("f2("+marker+")");
    }
}

public class ExplicitStatic {
    public static void main(String[] args) {
        System.out.println("Inside main()");
        Cups.f2(5);
//        Cups cups = new Cups();
    }
}

复制代码

输出结果为:

复制代码

Inside main()
Cup(1)
Cup(4)
f2(5)

Process finished with exit code 0

复制代码

此结果验证了1-2中的规律6:调用除构造函数外静态方法只会引发静态初始化,而不会引发普通初始化。因为类中的普通成员变量cup2、cup3并未被显示初始化。

 

复制代码

public class ExplicitStatic {
    public static void main(String[] args) {
        System.out.println("Inside main()");
//        Cups.f2(5);
        Cups cups = new Cups();
    }
}

复制代码

输出的结果为:

复制代码

Inside main()
Cup(1)
Cup(4)
Cup(2)
Cup(3)
Cups()

Process finished with exit code 0

复制代码

此结果验证了1-2中的规律4、5 以及 初始化顺序的优先级。

本文首发于java黑洞网,csdn同步更新

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Python中,成员变量可以在初始化方法中进行初始化初始化方法是一个特殊的方法,用来定义具有哪些属性。在Python中,初始化方法的名称是`__init__`。初始化方法在创建对象时会被直接调用。通过在初始化方法中使用`self.属性名=属性的初始值`的方式来定义属性。 下面是一个示例代码,演示了如何在Python中进行成员变量初始化: ```python class Cat(): def __init__(self): self.name = "Tom" tom = Cat() print(tom.name) # 输出结果为 "Tom" ``` 在上述代码中,`Cat`定义了一个初始化方法`__init__`,在方法内部使用`self.name = "Tom"`给属性`name`赋予了初始值。然后通过创建`Cat`对象`tom`,可以通过`tom.name`来访问和使用这个成员变量。 另外,如果希望在创建对象的同时,就设置对象的属性,可以对初始化方法进行改造。可以把希望设置的属性值定义成初始化方法的参数,在方法内部使用`self.属性 = 形参`的方式来接收外部传递的参数。 下面是一个改造后的示例代码: ```python class Cat(): def __init__(self, name): self.name = name def shout(self): print("%s 喵喵叫" % self.name) tom = Cat("Tom") print(tom.name) # 输出结果为 "Tom" ``` 在上述代码中,`Cat`初始化方法接收一个`name`参数,并通过`self.name = name`来将参数值赋给成员变量`name`。创建`Cat`对象`tom`时,可以通过传递参数`"Tom"`来设置`name`属性的初始值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值