类变量和实例变量及其初始化

0.基本概念

  类变量是指java类中的static数据成员,实例变量则是指java类中的非static数据成员。由于类变量不需要创建一个对象即可访问,而实例变量则必须与一个具体的对象对应,因此类变量和实例变量的初始化时机是不同的。本文主要关注以下3个问题:

  (1)什么时候初始化类变量?什么时候初始化实例变量?

  (2)什么时候会同时初始化类变量和实例变量?

  (3)在(1)、(2)情形下各个类变量和实例变量的初始化顺序?

1.类变量初始化

  根据有无被final关键字修饰,类变量的初始化时机不同。被final关键字修饰的类变量在编译时就已经被初始化被放置在常量池中了,而没有被final修饰的类变量则在该类首次使用时被初始化。特别需要注意的是,类变量只在该类首次使用时被初始化,这意味着类变量只会被初始化一次。

  在下列情形下,如果一个java类中没有被final修饰的类变量尚未初始化,那么这些没有被final修饰的类变量将会被初始化:

  (1)访问该类中没有被final修饰的类变量时;

  (2)设置该类中没有被final修饰的类变量时;

  (3)调用该类的static方法。

  初始化顺序确定规则

  (1)在上述3个情形下,首先会初始化该类中所有没有被final修饰的类变量,然后再执行对应的操作;

  (2)static变量初始化的方式有两种:定义时初始化和static代码块中初始化。因此,在类变量初始化时机时(上述的3种情形)java虚拟机会按照代码中的顺序依次执行static变量定义语句和static代码块。(两种初始化方式的示例代码如下)

  (3)如果该类有父类且父类的类变量没有初始化,则先初始化父类的类变量。

1 class A(){
2   public static final String STR = "hello";//final static变量,在编译时被初始化
3   public static int i = 1;//static变量初始化方式一:在定义时初始化
4   static{//static变量初始化方式二:在static代码块初始化static变量
5     System.out.println("statci 代码块");
6     }
7 }

  根据上述的初始化顺序确定规则,可以确定初始化顺序如下:

//没有继承的情形
static变量初始化和static代码块

//有继承的情形
1.父类的static变量初始化和static代码块
2.子类的static变量初始化和static代码块

2.实例变量初始化

  实例变量初始化是在创建该类的对象时进行的,确定初始化顺序的规则下:

  (1)如果创建该类的对象时该类的类变量尚未初始化,则先初始化类变量,载初始化实例变量;

  (2)如果该类有父类的话,则先创建一个父类对象;并且,如果父类类变量没被初始化时,先初始化父类的类变量,再初始化父类的实例变量,再调用父类的默认构造器;

  (3)如果父类还有父类的话,根据(2)的规则以此类推,一直到根基类。

  根据上述初始化顺序规则,可以确定的初始化顺序如下:

//没有继承的情形
1.static变量初始化和static代码块
2.实例变量初始化和实例变量初始化代码块
3.构造函数

//有继承的情形
有继承的情形:
1.父类的static变量初始化和static代码块
2.子类的static变量初始化和static代码块
3.父类的实例变量初始化和实例变量初始化代码块
4.父类的构造函数
5.子类的实例变量初始化和实例变量初始化代码块
6.子类构造函数

3.实例

  

原文地址:https://www.cnblogs.com/walkingzq/p/8490383.html

时间: 2025-01-05 06:31:15

类变量和实例变量及其初始化的相关文章

变量:类变量,实例变量

1. 分类 分为类变量(静态变量.全局变量).实例变量.局部变量.其中静态变量.实例变量的区别是是否被static修饰 2. 类变量与实例变量在内存和调用上的区别 (1)调用:类变量是用"类名.变量名"格式来调用,实例变量通过"对象名.变量名"格式来调用 (2)内存: 类变量在类加载的时候就被初始化,而实例变量在对象new 出来后初始化. 类变量单独划分一块内存区域,独立于该类的任何对象.也就是说,不依赖于特定的实例,被类的所有实例共享: 实例变量在对象new出来后

类变量与实例变量

public class Cat { String name; int age; static void test(){ System.out.println("test static"); } public Cat(String name,int age){ System.out.println("执行构造器"); this.name = name; this.age = age; } {//这里一定要用花括号 System.out.println("执

Java中静态变量(类变量)、实例变量、局部变量和成员变量

导读 学习Java的过程中,一开始很容易被这些各种变量绕晕,这篇博客主要介绍了这几种变量之间的关系和区别. 例程 package com.cunyu.demo public class Demo { private String name; //成员变量.实例变量 private int age; //成员变量.实例变量 private int ID; //成员变量.实例变量 public static final String school = "卡塞尔学院"; //成员变量.静态变

Python3学习之路~6.3 类变量 VS 实例变量

类变量 VS 实例变量 #Author:Zheng Na # 实例里面可以查询.增加.删除.修改实例变量 class Role: # 类名 # 类变量 name = '我是类name' n=1 n_list=[] def __init__(self,name,role,weapon,life_value=100,money=15000): # 构造函数 # 在实例化时做一些类的初始化的工作 # 开辟一块内存,将下面这些变量传进去 self.name = name # 实例变量(静态属性),作用域

类变量和实例变量的区别

1.简介:       1.类变量也叫静态变量,也就是在变量前加了static 的变量:       2.实例变量也叫对象变量,即没加static 的变量: 区别在于:类变量和实例变量的区别在于:类变量是所有对象共有,其中一个对象将它值改变,其他对象得到的就是改变后的结果:而实例变量则属对象私有,某一个对象将其值改变,不影响其他对象: 例: 1 public class A{ 2 static int a = 0; //类变量 3 private int b = 0; //实力变量 4 } 5

python——实例方法、静态方法、类方法、类变量和实例变量浅析

概述: 实例方法就是类的实例能够使用的方法. 静态方法是一种普通函数,就位于类定义的命名空间中,它不会对任何实例类型进行操作.使用装饰器@staticmethod定义静态方法.类对象和实例都可调用静态方法. 类方法是将类本身作为对象进行操作的方法.类方法使用@classmethod装饰器定义,其第一个参数是类,约定写为cls.类对象和实例都可以调用类方法. super用来执行父类中的函数. 类变量定义在类的定义之后,实例变量则是以为self.开头. 如何调用父类的构造函数:子类(派生类)并不会自

怎么区分类变量和实例变量?

# -*- coding: utf-8 -*- #python 27 #xiaodeng #怎么区分类变量和实例变量? #实例变量:在变量前面添加了self,就是实例变量,比如:self.name(完整定义为:属于实例私有,对实例变量的操作不会影响到其他的实例对象) #类变量:不添加前缀self,就是类变量(完整定义为:被该类的所有实例可以共享的变量,如果某个实例修改了该变量,这个变量可以被其他实例看到) class Person() : count = 0 def __init__(self,

朝花夕拾——看清java实例变量的初始化内幕

过一段时间可能就得去找实习,今天在宿舍翻开以前常放在枕头边的大砖头<Java编程思想>打算重温下之前学的知识点,看到有关java初始化的一些知识,综合之前看过的网页和书籍,记下自己对java实例变量初始化的理解,仅供需要的朋友参考,也为自己积累一些java编程应该注意的知识点. java中对实例变量的初始化可以在三个地方出现:定义实例变量时指定初始值:初始化块中为实例变量指定的初始值:构造器中为实例变量指定的初始值.如果理解其内部初始化的规律,一般在编程和面试中出现的变量赋值问题基本都可以解决

python中的实例方法、静态方法、类方法、类变量和实例变量

http://www.jb51.net/article/49402.htm 注:使用的是Python2.7. 一.实例方法 实例方法就是类的实例能够使用的方法.如下: 复制代码 代码如下: class Foo:    def __init__(self, name):        self.name = name    def hi(self):        print self.name if __name__ == '__main__':    foo01 = Foo('letian')