类的加载次序与继承

原创转载请注明出处:http://www.cnblogs.com/chaeyeon/p/6146169.html

如果:A extends B
1.若要加载类A,应先加载父类B。而只要加载一个类,静态字段就会分配内存,静态代码块就会执行。则先为父类B(Object)的静态变量分配内存以及执行父类的静态语句块(执行先后顺序按由书写执行决定)。

2.然后再加载子类A,及为类A的静态变量分配内存以及执行类A的静态语句块。(并且1、2步骤只会在类第一次加载的时候执行,即最多执行一次)

结论一:子类的加载,必须先加载其父类,类的加载伴随着,静态变量的内存分配,静态语句的执行。
可以通过:Class.forname(A)加载类A。在父类的静态代码中输出父类中的静态变量,并在子类的静态代码块中输出子类的静态字段来验证1,2结论。

3.若需实例化类A,则在子类的构造方法执行之前,先调用其父类B的构造函数。并且在调用其父类B的构造函数前、在父类中会发生:
        1.父类B中的非静态变量分配内存以及执行父类中的非静态语句块.再调用父类B中的构造函数初始化初始化父类中的字段(因为父类中的字段要被子类继承,而字段的初始化,要通过自己的构造函数完成)。

2.然后再给类A中的非静态变量分配内存以及执行类A非静态语句块.最后调用A中的构造函数初始化。( 并且第次实例化子类对象的时候过程3都会发生)

结论二:实例化对象的时候需要调用构造方法,由于子类继承父类的成员变量,所以实例化子类的时候,在子类的构造方法中一定要先调用了父类的构造方法(super()在子类的构造方法的第一行)来给子类中继承自父类的字段初始化,然后再执行子类中的构造函数来初始化子类特有的字段,这个步骤,会在每次实例化子类对象的时候重复执行。注意:一个类构造方法每次被调用之前,一定会先执行一次该类中的实例语句块。

5.对于静态方法和非静态方法都是被动调用,即系统不会自动调用执行,所以用户没有调用时都不执行,方法都存放在方法区中(静态区)等待用户的调用。只有用户调用时才给方法中的局部变量分配内存。

注意:加载不意味着执行!!!

总结:
子类的加载必先加载父类。类的加载伴随着静态变量的分配与静态语句块的执行(这个过程只会类第一次被加载时执行 )
子类的实例化,伴随着父类的实例化(先实例化父类,然后实例化子类),此时伴随着成员变量和实例语句块的执行(这个过程在每次实例化子类的时候都会发生)

继承:
1.子类会继承父类中所有的字段和方法(包括私有的字段和方法),但构造方法不能被继承。

2.子类即使继承了父类的私有字段,也不能直接访问,只能间接访问,或不能访问(但是可以通过父类提供的公开的方法中来做到间接地访问父类中私有的成员字段或方法,既然能被访问,说明子类为父类的私有字段分配了空间,继承了父类的私有字段,不然数据往那里存)

通过.net的调试器,可以清楚的验证这一结论,既然子类中可以访问父类的成员方法的成员变量那么可以理解为在子类对象中包含一个父类对象。

3.构造方法虽然不能被继承,但是子类中的任何一个构造方法执行前都会执行父类的构造方法。目的同继承为了减少代码的重复因为可以通过在子类中调用父类的构造来初始化子类,而不用在子类中在写一遍对父类中成员变量赋值的代码(如果子类中不显示地调用默认调用父类的无参构造,可以在父类中的无参构造中输出一名话,然后在实现化一个子类来验证)

4.子类可以通过方法的重写,或字段的重名来覆盖都父类中的方法或都字段。但是只要该字段或方法在父类中不是私有的,在子类中仍然可以通过”super.“字段名或方法名去访问。

5.this表示的就是当前对象,谁调用就指代谁,this就是对象的引象,保证对象的地址,每一个对象都有this存在堆中,可以理解为Object
o=new Object();new返回的就是堆中对象中的this(this保存对象的引用,它的含义等价引用)静态代码段中没有this

6、super(或者base)都是指代当前子类对象中的父类型的特征。super指代子类从父类中继承过来的字段或方法,用于区分子类中重写父类的方法或者子类覆盖父类的中的字段,就可以通过”super.“方法名或字段名来显示的在子类中调用父类中的方法或字段,即使这些方法或字段被子类重写或覆盖。super不是引用,不保存内存地址,它只是存在于this中来指代子类从父类继承过来的数据(即父类中的数据),和子类中特有的数据。this能存在的地方super就存在,super是this的组成部分。
验证:

从这张图看所谓的继承应该很明了

时间: 2024-12-21 20:56:41

类的加载次序与继承的相关文章

1.类的加载机制_继承类的加载(一个小的Demo)说明

今天我们先来一个小的Demo来了解类的加载顺序. 1 public class ClassLoaderTest { 2 public static void main(String[] args) { 3 System.out.println("*******************测试类的加载顺序开始*******************"); 4 new SubClass(); 5 System.out.println("*******************测试类的加载

java中带继承类的加载顺序详解及实战

一.背景: 在面试中,在java基础方面,类的加载顺序经常被问及,很多时候我们是搞不清楚到底类的加载顺序是怎么样的,那么今天我们就来看看带有继承的类的加载顺序到底是怎么一回事?在此记下也方便以后复习巩固! 二.测试步骤: 1.父类代码 1 package com.hafiz.zhang; 2 3 public class Fu 4 { 5 private int i = print("this is father common variable"); 6 private static

jvm系列(一):java类的加载机制

java类的加载机制 原文:http://www.cnblogs.com/ityouknow/p/5603287.html 1.什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构.类的加载的最终产品是位于堆区中的Class对象,Class对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口. 类加载器并不需要等到某个

【转】Android类动态加载技术

http://www.blogjava.net/zh-weir/archive/2011/10/29/362294.html Android应用开发在一般情况下,常规的开发方式和代码架构就能满足我们的普通需求.但是有些特殊问题,常常引发我们进一步的沉思.我们从沉思中产生顿悟,从而产生新的技术形式. 如何开发一个可以自定义控件的Android应用?就像eclipse一样,可以动态加载插件:如何让Android应用执行服务器上的不可预知的代码?如何对Android应用加密,而只在执行时自解密,从而防

【Java基础】Java类的加载和对象创建流程的详细分析

相信我们在面试Java的时候总会有一些公司要做笔试题目的,而Java类的加载和对象创建流程的知识点也是常见的题目之一.接下来通过实例详细的分析一下. 实例问题 实例代码 Parent类 1 package mytest.javaBase; 2 3 public class Parent { 4 int a = 10; 5 static int b = 11; 6 // 静态代码块 7 static { 8 System.out.println("Parent静态代码块:b=" + b)

类的加载到反射reflect

类的加载: 当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载.连接.初始化这三个步骤来实现对这个类进行初始化. 加载: 就是指将class文件加载进入内存,并为之创建一个Class对象 任何类被使用时,系统都会创建一个Class对象 连接: 验证: 是否有正确的内部结构,并且和其他类协调一致 准备: 负责为类的静态成员分配内存,并设置默认初始化值 解析: 将类的二进制数据中的符号引用替换为直接引用 初始化:就是以前我们讲过的初始化步骤 类初始化的时机: 创建类的实例 访问类的静

java 类的加载、连接和初始化

JVM和类 调用Java命令运行Java程序时,该命令将会启动一条Java虚拟机进程,不管该Java程序启动了多少条线程,创建了多少个变量,它们都处于该Java虚拟机进程里,共享该JVM进程的内存区.当系统出现以下几种情况时,JVM进程将被终止: 程序运行到最后正常结束: 程序运行到使用System.exit()或Runtime.getRuntime.exit()代码结束程序: 程序运行过程中遇到未捕获的异常或错误而结束: 程序所在的平台强制结束了JVM进程. 类的加载 当程序主动使用某个类时,

java类的加载与初始化总结

1.触发类加载的原因(主动调用与被动调用): 六种主动调用: 1).创建类的实例(new操作.反射.cloning.反序列化) 2).调用类的静态方法 3).使用或对类/接口的static属性赋值(不包括static final的与在编译期确定的常量表达式(包括常量.字符串常量)) 4).调用API中的反射方法,Class.forName()等. 5).子类被初始化 6).被设定为JVM启动时的启动类(含main方法的主类) 其它都为被动引用:被动引用不会触发类的初始化操作(只会加载.链接),如

Java温故而知新(10)类的加载机制

类加载是Java程序运行的第一步,研究类的加载有助于了解JVM执行过程,并指导开发者采取更有效的措施配合程序执行. 研究类加载机制的第二个目的是让程序能动态的控制类加载,比如热部署等,提高程序的灵活性和适应性. 1.类加载机制 我们来了解一下虚拟机如何加载Class文件. 虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验,转换解析和初始化,最终形成可以被直接使用的java类型,这就是虚拟机的类加载机制. 类的生命周期包括加载(Loading).验证(Verification).准