Java基础26-对象初始化过程】的更多相关文章

/* 1.因为new Test1()用到了Test1类,所以会把它从硬盘上加载进入内存 2.如果有static静态代码块就会随着类的加载而执行,还有静态成员和普通方法也会随着类的加载而被加载 3.在堆中开辟空间,分配内存地址 4.在堆中建立对象特有属性,并同时对特有属性进行默认初始化 5.对属性进行显示初始化 6.执行构造代码块.对所有对象进行初始化 7.执行对应的构造函数,对对象进行初始化 8.将内存地址给t(给栈中的变量) */ public class Test{ public stati…
摘要 Java基本的对象初始化过程,子类的初始化,以及涉及到父类和子类的转化时可能引起混乱的情况. 1. 基本初始化过程: 对于一个简单类的初始化过程是: static 修饰的模块(static变量和static 块)  ---> 按照代码顺序依次执行. | 实例变量  及非static模块---> 按照代码顺序依次执行. | 构造函数 ---> 执行对应的构造函数. 子类的初始化过程. 父类static修饰的模块 | 子类static修饰模块 | 父类实例变量和非static块 | 父…
序言 联系我上次写的关于Java内存的文章,对象访问在 Java 语言中无处不在,是最普通的程序行为,但即使是最简单的访问,也会却涉及 Java 栈.Java 堆.方法区这三个最重要内存区域之间的关联关系,如下面的这句代码: Object obj = new Object(): 1.假设这句代码出现在方法体中,那"Object obj"这部分的语义将会反映到Java 栈的本地变量表中,作为一个 reference 类型数据出现. 2.而"new Object()"这…
对象初始化过程:  1.首先,初始化父类中的静态成员变量和静态代码块,按照在程序中出现的顺序初始化:  2.然后,初始化子类中的静态成员变量和静态代码块,按照在程序中出现的顺序初始化:  3.其次,初始化父类的普通成员变量和代码块,在执行父类的构造方法: 4.最后,初始化子类的普通成员变量和代码块,在执行子类的构造方法: Java类加载机制 1.概述 Class文件由类装载器装载后,在JVM中将形成一份描述Class结构的元信息对象,通过该元信息对象可以获知Class的结构信息:如构造函数,属性…
Static那些事儿 Static关键字 被static修饰的变量成为静态变量(类变量) 作用:是一个修饰符,用于修饰成员(成员变量,成员方法) 1.被static修饰后的成员变量只有一份 2.当成员被static修饰之后,多了一种访问方式,除了可以被对象调用之外还可以被雷鸣直接调用(类名.静态成员) static关键字,修饰变量,只保存最后一个值,立即改,立即用. static关键字是一个修饰符说白了意思就是用static修饰成员以后,这个成员就变成大家共有的了 ,任意一个对象可以调用它并且也…
成员变量(字段)初始化顺序 在一个类里初始化的顺序是由成员变量在类里面的定义的顺序来决定的.即使成员变量大量散布于类的各个方法定义的中间,那些成员变量仍会在调用任何方法之前得以初始化,甚至在构造函数调用之前. 若数据是静态的(static),那么同样的事情就会发生:如果它属于一个基本类型(主类型),而且未对其初始化,就会自动获得自己的标准基本类型初始值:如果它是指向一个对象的句柄,那么除非新建一个对象,并将句柄同它连接起来,否则就会得到一个空值(NULL). static 初始化只有在必要的时候…
本文主要记录JAVA中对象的初始化过程,包括实例变量的初始化和类变量的初始化以及 final 关键字对初始化的影响.另外,还讨论了由于继承原因,探讨了引用变量的编译时类型和运行时类型 一,实例变量的初始化 一共有三种方式对实例变量进行初始化: ①定义实例变量时指定初始值 ②非静态初始化块中对实例变量进行初始化 ③构造器中对实例变量进行初始化 当new对象 初始化时,①②要先于③执行.而①②的顺序则按照它们在源代码中定义的顺序来执行. 当实例变量使用了final关键字修饰时,如果是在定义该fina…
Java中的继承机制看似简单,实际上包含了很多细节.最近在刷题过程中屡屡跳坑,于是自己仔细再学习了一下Java中子类初始化的细节,与大家分享. class Father { Father(){}; } class Child extends Father { super(); //隐式地调用父类构造函数,对父类进行初始化 int age = 10; Child(){}; } 以以上代码为例: 若执行Child child = new Child(); (1)首先对子类变量进行初始化(int ag…
Java为对象初始化提供了多种选项. 当new一个对象的时候,对象初始化开始: 1.首先,JVM加载类(只加载一次,所以,即使多次new对象,下面的代码也只会在第一次new的时候执行一次),此时, 静态字段默认初始化 声明为static的静态字段会被初始化为默认值:数字为0,布尔值为false,对象为null 静态字段显式初始化 如果statis字段有显式赋值,就执行显式初始化 静态代码块 静态代码块可以有任意多个,它们的执行顺序就是在类中声明的顺序 2.类加载完毕,然后以下代码(每次new对象…
类的生命周期: Java类的初始化: 本阶段负责为类变量赋正确的初始值.(类变量即静态变量) Java编译器把所有的类变量初始化语句和静态初始化器通通收集到<clinit>方法中,该方法只能被JVM调用,专门承担初始化工作. 初始化一个类必须保证其直接超类已被初始化. 并非所有类都拥有<clinit>()方法.以下类不会拥有<clinit>方法: 该类既没有声明任何类变量,也没有静态初始化语句. 该类声明了类变量,但没有使用类变量初始化语句或静态初始化语句初始化. 该类…
Java 对象和类 Java作为一种面向对象语言.支持以下基本概念: 多态 继承 封装 抽象 类 对象 实例 方法 重载 对象:对象是类的一个实例(对象不是找个女朋友),有状态和行为.例如,一条狗是一个对象,它的状态有:颜色.名字.品种:行为有:摇尾巴.叫.吃等. 类:类是一个模板,它描述一类对象的行为和状态. 下图中男孩女孩为类,而具体的每个人为该类的对象: Java中的对象 现在让我们深入了解什么是对象.看看周围真实的世界,会发现身边有很多对象,车,狗,人等等.所有这些对象都有自己的状态和行…
对象初始化器: 对象在创建过程中也可以使用对象初始化器完成“属性的初始化” Student stu =new Student(){ StudentId=, StudentName="张三", Age= }; 注意: 属性之间使用”,“分割. 只能在.NET3.0及其以后版本中才能使用 与构造函数一样具有感知 对象初始化器与构造方法(函数)的异同点: 相同点:都能够完成对象属性的初始化 不同点: 构造函数具有强制性,而对象初始化器没有强制性 前者只能完成属性的初始化,而构造函数可以完成任…
类加载过程: 1, JVM会先去方法区中找有没有相应类的.class存在.如果有,就直接使用:如果没有,则把相关类的.class加载到方法区 2, 在.class加载到方法区时,会分为两部分加载:先加载非静态内容,再加载静态内容 3, 加载非静态内容:把.class中的所有非静态内容加载到方法区下的非静态区域内 4, 加载静态内容: 4.1.把.class中的所有静态内容加载到方法区下的静态区域内 4.2.静态内容加载完成之后,对所有的静态变量进行默认初始化 4.3.所有的静态变量默认初始化完成…
单个对象 1.进入main函数,生成main函数的栈空间 2.先在mian函数的栈空间里产生一个Student变量(以后会用来存储Studnet对象的首地址),然后进入Student类,在堆内存创建String和int类型的变量,并赋上初值 3.将在堆内存的对象的首地址赋值给在栈内存的Studnet变量s,即这个对象创建完毕.然后该程序输出了该对象的地址值 4.取值拼接输出,然后再修改值,拼接输出 5.调用Student类的函数,创建study函数的栈空间,然后执行函数代码,执行完之后消除栈空间…
本文不再以ClassLoader的视角解释这些问题. 首先,Java代码有个特点,就是成员变量可以在前面的方法中使用,在后面定义.这一特性,很多人说Java了不起,可是为什么呢?Java为何能够这样呢? 我们首先来看一道面试题: 写出上面代码的运行结果. 其实对于Java了解比较深入的人,不屑于解决这道题,因为看代码写运行结果,再常规不过,可是这个题,要是写准了,还真的不容易,因为,我们要以类似C语言的视角审视这道题. OK,我们首先理解一个基本概念,内存空间一定是先申请,再初始化,再使用的.例…
class Fu { Fu() { show(); } void show() { System.out.println("xixi"); } } class Zi extends Fu { int num = 9; // 构造代码块 { System.out.println("constructor code..." + num); num = 10; } // 构造函数 Zi() { super(); // 显示初始化 // 构造代码块初始化 System.ou…
所有的类(以Dog类为例)在第一次使用时,动态的加载到JVM中,当首次创建Dog对象时,或者是Dog类的静态方法.静态属性域在第一次被访问时,JVM解释器查找到classpath,定位到Dog.class文件 载入Dog.class文件,生成一个class类型对象,所有有关的静态初始化动作(静态代码块.静态属性)都会被执行,并且这种初始化动作只在class对象首次加载时进行一次(包括父类的静态代码块.静态属性) 当用new Doa()创建对象时,首先JVM在堆上为Dog对象分配足够的存储空间 自…
对象比较 如果说现在有两个数字要判断是否相等,可以使用"=="完成 如果是字符串要判断是否相等使用"equals()" 但是如果说现在有一个自定义的类,要想判断它的两个对象是否相等,那么必须要实现类对象之中所有属性内容的比较. 范例:基础的比较方式 class Book { private String title; private double price; public Book(String title, double price) { this.title…
子类实例化是否会实例化父类? 不会.父类在子类实例化过程中是并没有被实例化,java中new子类没有实例化父类,只是调用父类的构造方法初始化了,子类从父类继承来的属性,这个调用是子类的对象调用的父类的构造方法,而子类自己的构造方法完成对自己属性的初始化(这里的初始化是指我们在内存分配完了,虚拟机初始化之后,我们按自己的要求进行的初始化). 子类对象实例化的全过程 1.当最底层子类实例化对象时,它的父类,父类的父类...到Object类的所有类的构造器都会被调用,只不过当一个类拥有多个构造器时,调…
对象的创建 Test test = new Test(); Test test = new Test("a"); 其实,对象被创建出来时,对象就是一个对象的引用,这个引用在内存中为对象分配了存储空间,可以在构造方法中初始化成员变量,当创建对象时,自动调用构造方法,也就是java中初始化与创建是被捆绑在一起的. 每个对象都是独立的,在内存中占据独立的内存地址,并且每个对象都有自己的生命周期,当一个对象生命周期结束时,对象就会变成垃圾,由java虚拟机自带的垃圾回收机制处理.…
一 容器的用途 如果对象的数量与生命周期都是固定的,自然我们也就不需要很复杂的数据结构. 我们可以通过创建引用来持有对象,如 Class clazz; 也可以通过数组来持有多个对象,如 Class[] clazs = new Class[10]; 然而,一般情况下,我们并不知道要创建多少对象,或者以何种方式创建对象.数组显然只能创建固定长度的对象,为了使程序变得更加灵活与高效,Java类库提供了一套完整的容器类,具备完善的方法来解决上述问题. 从上图可以看到容器中有七大接口: Collectio…
对象导论 1.1 抽象过程 所有编程语言都提供抽象机制.人们所能解决的问题的复杂性直接取决于抽象的类型和质量. 汇编语言是对底层机器的轻微抽象. 我们将问题空间中的元素及其再解空间中的表示称为对象.这种思想实质是:程序可以通过添加新类型的对象使自身适用于某个特定的问题. 万物皆为对象 可以抽取待求解问题的任何概念化构建表示程序中的对象. 程序是对象的集合 他们通过发送消息来告知彼此所要做的. 每个对象都有自己的由其他对象所构成的存储 每个对象都拥有其类型 某一特定类型的所有对象都可以接收同样的消…
1. 什么是Java对象序列化 Java平台允许我们在内存中创建可复用的Java对象,但一般情况下,只有当JVM处于运行时,这些对象才可能存在,即,这些对象的生命周期不会比JVM的生命周期更长.但在现实应用中,就可能要求在JVM停止运行之后能够保存(持久化)指定的对象,并在将来重新读取被保存的对象.Java对象序列化就能够帮助我们实现该功能. 使用Java对象序列化,在保存对象时,会把其状态保存为一组字节,在未来,再将这些字节组装成对象.必须注意地是,对象序列化保存的是对象的"状态",…
1. 多线程 1.1 多线程介绍 学习多线程之前,我们先要了解几个关于多线程有关的概念. 进程:进程指正在运行的程序.确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能. 线程:线程是进程中的一个执行单元,负责当前进程中程序的执行,一个进程中至少有一个线程.一个进程中是可以有多个线程的,这个应用程序也可以称之为多线程程序. 简而言之:一个程序运行后至少有一个进程,一个进程中可以包含多个线程 什么是多线程呢?即就是一个程序中有多个线程在同时执行.…
假设有这样一段代码: public class Cat { private String name; private int age; public String toString() { return "Cat [name=" + name + ", age=" + age + ", weight=" + weight + "]"; } public Cat(String name, int age) { System.ou…
第一讲     System类 一.概述 1.System是描述系统一些信息的类,类中的属性和方法都是静态的.不能被实例化,没有提供构造函数. 2.字段摘要 out:标准输出流.默认是控制台. in:标准输入流.默认是键盘. 二.方法 1.获取系统的属性信息: PropertiesgetProperties(); 说明: 1)此方法返回的双列集合,即键值对:因为Properties是Hahstable的子类,也就是Map集合的一个子类对象,那么通过Map方法取出该集合中的元素. 2)该集合存储的…
对象的克隆分为对象的浅克隆和深克隆 一.对象的浅克隆 注意事项: 1.如果一个对象需要调用clone的方法克隆,那么该对象必须要实现Cloneable接口 2.Cloneable对象只是一个标识对象,并没有方法 public class demo1 { public static void main(String[] args) throws Exception { Person person = new Person("001","狗娃"); Person per…
类初始化相关执行顺序 几个概念说明 代码块的含义与作用 static静态代码块: 一般用于初始化类中的静态变量.比如:给静态的数组或者list变量赋初值.使用static静态代码块进行初始化与直接在定义变量的时候初始化效果是一样的. static静态代码块其实完全可以看做是一个没有名字.没有参数.没有返回值的静态方法,这个静态方法会在main方法执行前执行,而且是主动执行的,不需要任何显示调用,除此之外它和普通的静态方法没有任何区别. 构造块(又称构造代码块) 没有static修饰的代码块: 主…
面对对象--概述 什么是对象? +---->对象可以泛指一切现实中存着的事物 +---->类是对象的抽象集合 什么是面对对象? +--->万物皆对象,面对对象实际就是人与万物接触====>面对对象 为什么要使用面对对象语言? +--->面对对象符合现实生活,是计算机语言更加符合现实逻辑,从而实现更好的为人服务. 面对对象有什么好处? +--->相比面对过程语言,面对过程的--->事事亲为 .  +--->面对对象相当于请他人做事,能够快速的完成,讲究相互协调…
1. 判断对象的类型:instanceOf 和 isInstance 或者直接将对象强转给任意一个类型,如果转换成功,则可以确定,如果不成功,在异常提示中可以确定类型 public static void main(String[] args) { Integer i = new Integer(10); System.out.println(i instanceof Integer); // 知道类型名 String parentClass = "java.lang.String";…