Java变量、Java对象初始化顺序

局部变量与成员变量:

局部变量分为:

  行参:在方法签名中定义的局部变量,随方法的结束而凋亡。

  方法内的局部变量:必须在方法内对其显示初始化,从初始化后开始生效,随方法的结束而凋亡。

  代码块内的局部变量:必须在代码块内对其显示初始化,从初始化后开始生效,随代码块的结束而凋亡。

成员变量:

  静态属性:类加载时初始化,随着类的存在而存在;

  非静态属性:随着实例的属性存在而存在;

关于他两的区别:

  1.局部变量不可以加static;

  2.局部变量不可以加public、protected、private;

  3.局部变量必须赋初始值;

  4.局部变量存在于栈中;

  5.只写了局部变量,成员变量对比懂的。

实例变量与类变量:

  实例变量:局部变量、非静态成员变量;

  类变量:静态成员变量;

区别:

  就是是不是静态的区别;

  实例的总是可以引用类的;

涉及到原理的一丢丢:

  在JVM中,每个类对应一个class,但是一个类可以创建多个java对象;

  jvm的类变量只需要一块内存空间;

  这个类有几个实例,就要分配几块内存空间。

static可以修饰:

  1.只能修饰类里的成员部分;

  2.成员部分包括:成员变量;成员方法;内部类;初始化块;内部枚举类。

实例变量初始化的时机:

  1.定义变量时

  2.非静态初始化块

  3.构造方法

  4.注意:第1、2种方式比第3种方式更早执行,1、2种方式的执行属性与他们在源程序中的排序相同。

  5.第4点是因为下面一点

Java对象初始化顺序:

  1.先初始化静态的

  2.同静态先初始化父类的

  3.静态中先初始化变量,再初始化代码块

  4.非静态的也是先变量,再代码块,再构造函数

  5.所以初始化顺序可以看下面那张图

  6.子类构造器执行体内执行第一行代码使用super显示调用父类构造器,系统将根据super调用里传入的参数列表判断调用哪个构造器

  7.子类构造器执行体的第一行代码使用this调用本类中重载的构造器,根据传入参数判断调用哪个本类构造器

  8.子类构造器中既没有super调用也没有this调用,系统将会在执行子类构造器前,隐式调用父类无参数的构造器。

  9.super和this都只能在构造器中使用,而且super和this都必须作为构造器中的第一行,因此super和this只能调用其中之一,且最多只能调用一次。

  

    

原文地址:https://www.cnblogs.com/wzdnwyyu/p/11082175.html

时间: 2024-11-09 14:13:26

Java变量、Java对象初始化顺序的相关文章

Java 对象初始化顺序 执行顺序

先看一道Java面试题: 求这段程序的输出. 解答此题关键在于理解和掌握类的加载过程以及子类继承父类后,重写方法的调用问题: 从程序的执行顺序去解答: 1.编译:当这个类被编译通知后,会在相应的目录下生成两个.class 文件.一个是 Base.class,另外一个就是Base$Sub.class.这个时候类加载器将这两个.class  文件加载到内存 2.Base base= new Sub(): 声明父类变量base对子类的引用,JAVA类加载器将Base,Sub类加载到JVM(Java虚拟

Java对象初始化顺序(一)

---恢复内容开始--- 偶尔翻到了关于Java对象初始化顺序的面试题,重新复习了一下,顺便做笔记. 1.父类子类构造函数执行的先后顺序 public class Test2 { public int Field; //step 1 public Test2(){ Field = 1; } } /*************************************************/ /** * 次类的目的仅是为了验证父类子类构造函数执行的先后顺序 */ public class T

Java 类中成员初始化顺序

Java 中的类成员 基本分为 静态成员, 实例变量  方法中特别的是静态方法和构造方法. 1.定义一个类 public class ClassLoaderTest { public int a ; public String b; private static int c; public  ClassLoaderTest(){ System.out.println("执行前:"+ a + "  "+ b); a = 10; b = "lisi"

有关java类、对象初始化的话题,从一道面试题切入

最近在整理东西时,刚好碰到以前看的一道有关java类.对象初始化相关题目,觉得答案并不是非常好(记忆点比较差,不是很连贯).加上刚好复习完类加载全过程的五个阶段(加载-验证-准备-解析-初始化),所以如果周志明大大诚不我欺的话,无论是类加载过程.还是实例化过程的顺序我都已经了然于心了才对. 一道面试题 标题:2015携程JAVA工程师笔试题(基础却又没多少人做对的面向对象面试题) 地址:https://zhuanlan.zhihu.com/p/25746159 该题代码如下: public cl

Java 类成员的初始化顺序

Java 类成员的初始化顺序 前言:开发中碰到一个Java文件中有很多的成员变量,包括静态和非静态的,还有很多的初始化方法,很好奇这些成员的初始化顺序,在这里作个研究. ? 1 ?无继承情况下的Java初始化顺序: class Sample { Sample(String s) { System.out.println(s); } Sample() { System.out.println("Sample默认构造函数被调用"); } } class Test { static Samp

Java对象初始化顺序

最近我发现了一个有趣的问题,这个问题的答案乍一看下骗过了我的眼睛.看一下这三个类: package com.ds.test;   public class Upper { String upperString;   public Upper() {   Initializer.initialize(this); } } package com.ds.test;   public class Lower extends Upper {   String lowerString = null;  

java 成员变量 静态成员变量 方法 静态方法初始化顺序

Java构造方法.成员变量初始化以及静态成员变量初始化三者的先后顺序是什么样的? [Java笔试真题]:构造方法.成员变量初始化以及静态成员变量初始化三者的先后顺序是什么样的? [解答]:当类第一次被加载的时候,静态变量会首先初始化,接着编译器会把实例变量初始化为默认值,然后执行构造方法. Java程序的初始化一般遵循以下三个原则(以下三原则优先级依次递减): ① 静态对象(变量)优先于非静态对象(变量)初始化,其中,静态对象(变量)只初始化一次,而非静态对象(变量)可能会初始化多次: ② 父类

java面试扫盲:对象初始化顺序(真的未必能答对)

记录下面试里面遇到的一些java盲区,一方面扫描自己的知识盲区,一方面也可以给后面面试的朋友一些警示,以免面试的时候出现不知道的尴尬情况. 提出问题:父类静态属性,父类属性,父类构造方法,子类静态属性, 子类属性,子类构造方法的初始化顺序? 提出猜想:父类静态属性=> 父类属性=> 父类构造方法= > 子类静态属性=> 子类属性=> 子类构造方法? 方法论:实践是检验真理的唯一标准. 初步设计类的结构uml. 直接上源代码 /** * 轮子类 */ public class

java类加载和对象初始化

对象初始化过程:  1.首先,初始化父类中的静态成员变量和静态代码块,按照在程序中出现的顺序初始化:  2.然后,初始化子类中的静态成员变量和静态代码块,按照在程序中出现的顺序初始化:  3.其次,初始化父类的普通成员变量和代码块,在执行父类的构造方法: 4.最后,初始化子类的普通成员变量和代码块,在执行子类的构造方法: Java类加载机制 1.概述 Class文件由类装载器装载后,在JVM中将形成一份描述Class结构的元信息对象,通过该元信息对象可以获知Class的结构信息:如构造函数,属性