一个对象的实例化过程【重点】

一、过程
  Person p = new Person();
  1,JVM会去读取指定路径下的Person.class文件,并加载进内存,
    并会先加载Person的父类(如果有直接父类的情况下)
  2,在堆内存中开辟空间,分配地址。
  3,并在对象空间中,对对象中的属性进行默认初始化
  4,调用对应的构造函数,进行初始化
  5,在构造函数中,第一行会先调用父类中的构造函数进行初始化。
  6,父类初始化完毕后,再对子类的属性,进行显示初始化。
  7,指定构造函数的特定初始化
  8,初始化完毕后,将堆内存中的地址值赋给引用变量。
  
  即:过程为:
   子类属性默认初始化==》父类构造函数初始化==》子类属性显示初始化!!!
   
二、特点:
  在子类构造对象时,发现,访问子类构造函数时,父类也运行了。
    一】具体:
      在子类的构造函数中第一行有一个默认的隐式语句。 super();
      但是,当自己在子类构造函数中写了一个super的构造语句,则就不会自动调用了。
    
    注意:当父类中构造函数为Fu(int x)时,
       子类中则必须用super(6);否则报错!
       
    子类的实例化过程中:
     子类中所有的构造函数默认都会访问父类中的空参数构造函数。
     
     
    二】【重点】为什么子类实例化的时候要访问父类中的构造函数?
     1》子类继承了父类,获取到了父类中的内容(属性),所以在使用父类内容之前
       要先看父类是如何对自己的内容进行初始化的。
        所以子类在构造对象时,就必须访问父类中的构造函数,因此要在子类的构造函数中加入super语句。
     
     2》如果父类中没有定义空构造函数,那么子类的构造函数必须用super明确调用父类中对应的构造函数
     
     3》子类构造函数中如果使用this调用了本类构造函数时,则调用this的这个构造函数中super便没有了,
        因为super和this都只能定义在第一行。
        但是可以保证的是,子类中肯定会有其它的构造函数访问父类的构造函数。
        
     注:super语句必须要定义在子类构造函数的第一行。因为父类的初始化动作要先完成。
     
     注:java所有的类都是Objiect的子类。

时间: 2024-10-11 07:10:54

一个对象的实例化过程【重点】的相关文章

10. JavaSE-子类实例化过程 & 构造方法间调用

子类的实例化过程: 子类中所有的构造函数默认都会访问父类中空参数的构造函数. class Parent { Parent(){ System.out.println("parent class run"); } } class Children extends Parent { Children(){ //super();//调用的就是父类空参数的构造函数 System.out.println("children class run"); //return; /*说

深夜睡不着,第二篇随笔,说说js的创建实例化过程

媳妇白天加班太累了,我呢,白天睡太多了,晚上太过于亢奋,自己一个人偷偷的拿着笔记本到客厅写博客~ 上一篇可能很多人看到了觉得就是个joke,那个真的是一个joke,但是在实际开发过程中,很多年轻的coder对于写不写分号很不以为然,要知道,真实生产环境下的代码要远比我栗子中给的代码要复杂得多,因此很有可能不用我的误导,你就看不出来,因此浪费了一下午的宝贵开发时间,所以写代码还是要规范一些. 第二篇文章我依旧不想讲太过于深入的技术,还是说两个“花边新闻”,聊以自慰罢了,看官有兴致你就看,没兴致也可

Mybatis深入之DataSource实例化过程

Mybatis深入之DataSource实例化过程 简介 主要介绍Mybatis启动过程中DataSource实例化的过程.为后面解析一个完整SQL执行过程做个前章. Mybatis中DataSource体系 MybatisDataSource整体简介 Mybatis中关于数据库的类都在org.apache.ibatis.datasource包中 Mybatis配置文件中关于数据库的配置: <environments default="development"> <e

【python】-- 类的实例化过程、特征、共有属性和私有属性

实例化过程 1.类的定义和语法 class dog(object): #用class定义类 "dog class" #对类的说明 def __init__(self,name): #构造函数或者是构造方法,也可以叫初始化方法 self.name = name def sayhi(self): #类方法 "sayhi funcation" #对类方法的说明 print("hello,i am a dog,my name is ",self.name

Spring中bean的实例化过程

1.从缓存中.优先从一级缓存中拿,有则返回. 如果没有,则从二级缓存中获取,有则返回. 如果二级缓存中拿不到,则从三级缓存中拿,能拿到,则从三级缓存中删除,移到二级缓存. 如果三级缓存也没有,则返回null. 2. 如果是单例模式, 则走createBean 的流程,进行bean对象的实例化. 2.1 获取到该beanDefinition对应的字节码对象. 2.2 prepareMethodOverrides. 检查beanDefinition对象的每一个methodOverride的对象.如果

java4android (继承中的子类实例化过程)

生成子类的过程 见代码: class Person { String name; int age; Person(){ System.out.print("Person的无参数构造函数"); } Person(String name,int age){ this.name = name; this.age = age; System.out.print("Person的有2个参数的构造函数"); } void eat(){ System.out.print(&quo

【Spring源码分析】非懒加载的Bean实例化过程(下篇)

doCreateBean方法 上文[Spring源码分析]非懒加载的Bean实例化过程(上篇),分析了单例的Bean初始化流程,并跟踪代码进入了主流程,看到了Bean是如何被实例化出来的.先贴一下AbstractAutowireCapableBeanFactory的doCreateBean方法代码: 1 protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final Object[]

面向对象(子父类中构造函数的特点-子类实例化过程)

/* 3,子父类中的构造函数. 在对子类对象进行初始化时,父类的构造函数也会运行, 那是因为子类的构造函数默认第一行有一条隐式的语句 super(); super():会访问父类中空参数的构造函数.而且子类中所有的构造函数默认第一行都是super(); 为什么子类一定要访问父类中的构造函数. 因为父类中的数据子类可以直接获取.所以子类对象在建立时,需要先查看父类是如何对这些数据进行初始化的.//指在在父类构造函数初始化 所以子类在对象初始化时,要先访问一下父类中的构造函数. 如果要访问父类中指定

python基础8之类的实例化过程剖析

一.概述 之前我们说关于python中的类,都一脸懵逼,都想说,类这么牛逼到底是什么,什么才是类?下面我们就来讲讲,什么是类?它具有哪些特性. 二.类的语法 2.1 语法 class dog(object): #用class定义类 "dog class" #对类的说明 def __init__(self,name): #构造函数或者是构造方法,也可以叫初始化方法 self.name = name def sayhi(self): #类方法 "sayhi funcation&q