(1)子类A继承父类B, A a = new A(); 则: 父类B静态代码块->子类A静态代码块->父类B非静态代码块->父类B构造函数->子类A非静态代码块->子类A构造函数 (2)若子类构造函数中显式的调用了父类的某构造函数...,则调用该构造函数 class C { C() { System.out.print("C"); } } class A { C c = new C();...执行父类的带参构造前要先对父类中的对象进行初始化,对父类中的c成员进行初始化,调用了C类的无参构造,所以调用顺序为: 先调用C类的无参构造 再调用A类的带参构造 最后调用调用子类的构造 (3...)在JVM调用mian方法之前先用进行静态内容的初始化。...顺序为:父类的静态变量, 父类的静态代码块 ,子类的静态变量,子类的静态代码块。
1s -> s.length() 在第二个测试中,我们使用的是静态方法引用来获取每个字符串的长度。 1String::length 在第三个测试中,我们使用的是实例方法引用。...总结 ① 使用方法 1类名::方法名 ② 方法可以是:静态方法,实例方法 构造函数引用 在上面我们讲了方法引用的基本使用方法,其实除了方法引用以外,还有构造函数引用,回想一下,以前我们创建对象是怎么做...② 第二个我们使用的是构造函数引用创建对象的 ClassMate::new 。...③ 我们发现构造函数引用:类名::new ,然后对于使用哪一个构造函数是由上下文决定的,比如有一个参数和两个参数和无参数的构造函数,会自动确定用哪一个。...函数式接口 什么是函数式接口呢? 这个名词在 Java 中以前是很少听到的,但是正是有了 Java 8 的横空出世,函数式编程也变得熟悉了。
我们把对某个对象的引用视为其基类型的引用的做法,称之为向上转型;把对某个对象的引用视为其导出类型的引用的做法,称之为向下转型。...之所以如此称呼,是因为我们习惯性在类的继承体系中把基类放在最上面,而把导出类放在下面,因此从导出类到基类的过程是一个向上看的过程,反之亦然。 ?...此外,只有普通的方法调用是多态的,如果某个方法是静态的,它的行为就是不具有多态性。静态方法是与类,而不是与单个的对象相关联的。任何域访问操作都是由编译器继解析,因此域也不是多态的。...以基类1 -> 基类2 -> 导出类的继承结构为例,初始化顺序大致如下: 从基类1开始,先进行静态初始化,然后依次向外扩散至基类2和导出类; 然后,依次进行基类1的非静态初始化和构造器初始化; 再依次进行基类...现在,我们已经知道了对象的初始化顺序,与之相反的,则是对象的销毁顺序。由于字段的初始化顺序是按照声明的顺序进行的,因此对于字段,销毁的顺序意味着与声明的顺序相反。
2、继承:值类型不可能派生出新的类型,所有的值类型均隐式派生自 System.ValueType。但与引用类型相同的是,结构也可以实现接口。...静态成员和非静态成员的区别? 静态变量使用 static 修饰符进行声明,静态成员在加类的时候就被加载(上一篇中提到过,静态字段是随类型对象存放在Load Heap上的),通过类进行访问。...不带有static 修饰符声明的变量称做非静态变量,在对象被实例化时创建,通过对象进行访问 。 一个类的所有实例的同一静态变量都是同一个值,同一个类的不同实例的同一非静态变量可以是不同的值 。...静态函数的实现里不能使用非静态成员,如非静态变量、非静态函数等。 4. 特性是什么?如何使用? 特性与属性是完全不相同的两个概念,只是在名称上比较相近。...比如: 不正确的使用静态字段,导致大量数据无法被GC释放; 没有正确执行Dispose(),非托管资源没有得到释放; 不正确的使用终结器Finalize(),导致无法正常释放资源; 其他不正确的引用,导致大量托管对象无法被
我们把对某个对象的引用视为其基类型的引用的做法,称之为向上转型;把对某个对象的引用视为其导出类型的引用的做法,称之为向下转型。...之所以如此称呼,是因为我们习惯性在类的继承体系中把基类放在最上面,而把导出类放在下面,因此从导出类到基类的过程是一个向上看的过程,反之亦然。...此外,只有普通的方法调用是多态的,如果某个方法是静态的,它的行为就是不具有多态性。静态方法是与类,而不是与单个的对象相关联的。任何域访问操作都是由编译器继解析,因此域也不是多态的。...以基类1 -> 基类2 -> 导出类的继承结构为例,初始化顺序大致如下: 从基类1开始,先进行静态初始化,然后依次向外扩散至基类2和导出类; 然后,依次进行基类1的非静态初始化和构造器初始化; 再依次进行基类...现在,我们已经知道了对象的初始化顺序,与之相反的,则是对象的销毁顺序。由于字段的初始化顺序是按照声明的顺序进行的,因此对于字段,销毁的顺序意味着与声明的顺序相反。
如果类型对象已经存在,则不会再次调用静态构造函数。 调用类型的实例初始化器,初始化类型的非静态成员。 例如下面的代码中,C#首先将a初始化为5,然后再修改成10。...1.6 类和结构的主要区别?结构对象可能分配在堆上吗?何时考虑使用结构体? 类和结构是C#两个最主要的研究对象: 结构是值类型,它继承自System.ValueType,而类是引用类型。...1.6.2 实例构造函数(类型) 类型的实例构造函数不能被继承。它负责将类型的实例字段初始化。对于静态字段,由静态构造函数负责。 如果类型没有定义任何构造函数,则编译器将定义一个没有参数的构造函数。...在程序中,用户无法控制何时执行静态构造函数。 静态构造函数不应该调用基类型的静态构造函数。这是因为类型不可能有静态字段是从基类型分享或继承的。...这是因为静态构造函数只负责初始化静态成员,只负责维护类型对象,它和类型的实例对象没有关系,所以你加入任何参数(你试图为非静态的字段或属性赋值?这是不可能的,因为根本就没有实例)都是没有意义的。
GetFieldId获得字段ID 使用对应的方法(例如GetIntField)获取字段下面的值 类似地,要调用一个方法,使用者首先得获得一个类对象的引用,然后是方法ID(method ID)。...传入NewStringUTF函数的数据必须是变形UTF-8格式。一种常见的错误情况是,从文件或者网络流中读取出的字符数据,没有过滤直接使用NewStringUTF处理。...设置到一个实例的字段(instance field)反之亦然,或者使用的一个类的jfieldID却来自另一个类的实例。...jmethodIDs:当调用Call*Method函数时时使用了类型错误的jmethodID:不正确的返回值,静态/非静态的不匹配,this的类型错误(对于非静态调用)或者错误的类(对于静态类调用)。...使用GetObjectRefType获得引用类型 在Android 4.0 (Ice Cream Sandwich)之前,使用直接指针(见上面)的后果就是正确地实现GetObjectRefType是不可能的
执行顺序:父类的静态构造函数,子类的静态构造函数,父类的静态字段初始化,子类的静态字段初始化,父类的实例构造函数,父类的非静态字段初始化,子类的实例构造函数,子类的非静态字段初始化,方法调用父类的静态构造函数...父类的实例构造函数:如果创建了父类的实例,执行父类的实例构造函数。实例构造函数用于初始化实例成员,每次创建实例时都会执行。父类的非静态字段初始化:执行父类的非静态字段初始化。...子类的非静态字段初始化:执行子类的非静态字段初始化。非静态字段按照声明的顺序初始化。方法调用:最后,可以调用类中的方法。方法是在实例被创建后才能被调用。...非静态成员包括非静态字段、非静态方法等,属于类的实例,需要通过实例访问。理解静态变量和静态成员的重要性在于它们提供了在类级别上共享数据和行为的机制,而不必依赖于类的实例。14. 属性能在接口中声明吗?...重载和重写分别应用于不同的场景,取决于你解决的问题是在类内提供多个版本的方法(重载)还是在继承体系中提供对基类虚方法的新实现(重写)。17. 静态方法可以访问非静态变量吗?如果不可以为什么?
如果有,就直接使用;如果没有,则把相关类的.class加载到方法区 2、 在.class加载到方法区时,会分为两部分加载:先加载非静态内容,再加载静态内容 3、 加载非静态内容:把.class中的所有非静态内容加载到方法区下的非静态区域内...实例的初始化过程: 1、在堆内存中开辟一块空间 2、 给开辟空间分配一个地址 3、 把对象的所有非静态成员加载到所开辟的空间下 4、 所有的非静态成员加载完成之后,对所有非静态成员变量进行默认初始化 5...、 所有非静态成员变量默认初始化完成之后,调用构造函数 6, 在构造函数入栈执行时,分为两部分:先执行构造函数中的隐式三步,再执行构造函数中书写的代码 6.1、隐式三步: 1,执行...super语句 2,对开辟空间下的所有非静态成员变量进行显式初始化 3,执行构造代码块 6.2、在隐式三步执行完之后,执行构造函数中书写的代码 7,在整个构造函数执行完并弹栈后...异常 字段解析 对字段的解析需要首先对其所属的类进行解析,因为字段是属于类的,只有在正确解析得到其类的正确的直接引用才能继续对字段的解析。
C++中通过引入this指针解决该问题,即:C++编译器给每个“非静态的成员函数“增加了一个隐藏的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有“成员变量”的操作,都是通过该指针去访问...面试题: 1、this指针存在哪里,是存在对象里面的吗 首先明确this指针不可能存在对象里面,我们上文讲过计算对象的大小时,是没有计算this指针大小的,所以反向思维this指针是不存在对象里。...类静态成员即可用 类名::静态成员 或者 对象.静态成员 来访问 4. 静态成员函数没有隐藏的this指针,不能访问任何非静态成员 5....问题: 1、静态成员函数能调用非静态成员函数吗? 答:不可以,因为静态成员函数没有this指针,同样也不能访问非静态成员变量 2、非静态成员函数能调用静态成员函数吗?...这里的引用是将临时变量引用给了r,具有常性,所以要加上const;而赋值是将临时变量直接赋值给d,不需要加上const!
其次,注意到类node中包含引用成员name,以及非静态的const型成员age,他们之中的任一个,都会导致系统拒绝生成默认的赋值操作符函数。...就是s1的别名),那么 x1 = x2 会让 x1.name 指向 s2 吗?...从C++基本语法得知这不可能!因为引用一旦指定了关联的目标就再也不能修改。那么, x1 = x2 会让 x1.name指向的s1的值变为"bb"吗?...这么一来,那其他跟x1无关的但使用了字符串s1的对象岂不是要平白无故地遭受牵连? 以上分析,针对类的非静态const型成员age而言,是一模一样的,因为age也不应该通过类对象的赋值操作而发生改变。...总而言之,以下情形发生时系统将拒绝生成默认赋值操作函数: 类中含有引用成员 类中含有非静态const型成员 类继承自含有private赋值操作符函数的基类 诡异的是,即便在上述条件下,系统依然会赞同生成默认的拷贝构造函数
字段与属性有什么异同? 4. 静态成员和非静态成员的区别? 5. 自动属性有什么风险? 6. 特性是什么?如何使用? 7. 下面的代码输出什么结果?为什么?...这个其实也很好解决,在非默认构造函数后加一个“:this()”就OK了,或者显示的在构造函数里初始化字段。...; 委托的本质——是一个类 .NET中没有函数指针,方法也不可能传递,委托之所可以像一个普通引用类型一样传递,那是因为她本质上就是一个类。...静态成员和非静态成员的区别? 静态变量使用 static 修饰符进行声明,静态成员在加类的时候就被加载(上一篇中提到过,静态字段是随类型对象存放在Load Heap上的),通过类进行访问。...静态函数的实现里不能使用非静态成员,如非静态变量、非静态函数等。 5. 自动属性有什么风险? 因为自动属性的私有字段是由编译器命名的,后期不宜随意修改,比如在序列化中会导致字段值丢失。 6.
字段与属性有什么异同? 4. 静态成员和非静态成员的区别? 5. 自动属性有什么风险? 6. 特性是什么?如何使用? 7. 下面的代码输出什么结果?为什么?...这个其实也很好解决,在非默认构造函数后加一个“:this()”就OK了,或者显示的在构造函数里初始化字段。...委托的本质——是一个类 .NET中没有函数指针,方法也不可能传递,委托之所可以像一个普通引用类型一样传递,那是因为她本质上就是一个类。...静态成员和非静态成员的区别? 静态变量使用 static 修饰符进行声明,静态成员在加类的时候就被加载(上一篇中提到过,静态字段是随类型对象存放在Load Heap上的),通过类进行访问。...静态函数的实现里不能使用非静态成员,如非静态变量、非静态函数等。 5. 自动属性有什么风险? 因为自动属性的私有字段是由编译器命名的,后期不宜随意修改,比如在序列化中会导致字段值丢失。 6.
解析 「将类,接口,字段和方法的符号引用(在常量池中)转为直接引用」符号引用:用一组符号来描述所引用的目标 直接引用;直接指向指向目标的指针 加入我写了一个如下的类 public class Student...从字节码的角度分析一波 「方法」 ? 从字节码可以看到方法的主要逻辑为 调用父类的方法 非静态成员变量赋值 执行构造代码块 执行构造函数 ?...从字节码可以看到方法的主要逻辑为 执行静态变量的赋值语句 执行静态代码块中的语句 需要注意的一点是,「Java虚拟机会保证子类的方法执行前,父类的方法已经执行完毕...构造函数 「有继承情况的执行顺序」 父类的静态(静态代码块,静态成员变量),子类的静态(静态代码块,静态成员变量)(只会执行一次哈) 父类的非静态(构造代码块,非静态成员变量),父类的构造函数 子类的非静态...(构造代码块,非静态成员变量),子类的构造函数 卸载 垃圾收集不仅发生在堆中,方法区上也会发生。
那必不可能,其实这个符号表是编译原理层面的内容,还是需要了解一下编译原理的这块内容才行,不过我之前也说过,关于编译原理这块自己真的是一概不知。...非必须,如果类或接口中没有静态变量或方法,编译器会省略生成()方法这步操作 () 方法在多线程环境会被正确同步 4....解析 解析阶段将类的符号引用替换为直接引用 符号引用(Symbolic References):还记得之前文章中提到的 Class 文件中存的内容吗,还记得那些表吗?这个符号引用就是那时的索引。...读取或设置一个类型的静态字段(被final修饰、已在编译期把结果放入常量池的静态字段除外)的时候 调动类的静态方法 对类型使用反射调用。...当使用JDK 7新加入的动态语言支持时,执行句柄为静态字段或方法,或构造函数时需要对目标进行初始化(此处需了解 JDK 7 新增的动态语言支持,后续有机会会对此出内容单独整理文章说明,欢迎关注)。
静态变量是在静态变量所属类初次使用时被初始化的,当静态字段被初始化后,之后每次调用获得的值都是初始化时赋给静态字段的值,除非在这个过程中显示地给静态字段赋值。...2)静态类不能包含实例构造函数,但仍可声明静态构造函数以分配初始值或设置某个静态状态。 3)静态方法和属性只能访问静态字段和静态事件。...l 在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数来初始化类。 l 无法直接调用静态构造函数。 l 在程序中,用户无法控制何时执行静态构造函数。...l 静态构造函数的典型用途是:当类使用日志文件时,将使用这种构造函数向日志文件中写入项。 l 静态构造函数在为非托管代码创建包装类时也很有用,此时该构造函数可以调用 LoadLibrary 方法。...3.9 可访问性 非嵌套类型:不嵌套在其他类型中的顶级类型的可访问性只能是 internal 或 public。 这些类型的默认可访问性是 internal。
, 参数的类型是外部类的类型, 在构造方法内部使用这个参数为1中添加的成员变量赋值; 3 在调用内部类的构造函数初始化内部类对象时, 会默认传入外部类的引用。...让他成为主类的实例一部分 然后又想在内部类声明和实例无关的静态的东西 你让JVM情何以堪啊 4 若想在内部类内声明静态字段 就必须将其内部类本身声明为静态 非静态内部类有一个很大的优点:可以自由使用外部类的所有变量和方法...3 对于非静态内部类是不能出现静态模块(包含静态块,静态属性,静态方法等) 4 非静态类的使用需要依赖于外部类的对象,详见上述对象innerClass 的初始化。...总结一下Java类代码加载的顺序,万变不离其宗。 规律一、初始化构造时,先父后子;只有在父类所有都构造完后子类才被初始化规律二、类加载先是静态、后非静态、最后是构造函数。...,进行替换,将无法确定的值放到了内部类的常量池中,并在构造函数中将其从常量池取出到字段中。
, 参数的类型是外部类的类型, 在构造方法内部使用这个参数为1中添加的成员变量赋值; 3 在调用内部类的构造函数初始化内部类对象时, 会默认传入外部类的引用。...让他成为主类的实例一部分 然后又想在内部类声明和实例无关的静态的东西 你让JVM情何以堪啊 4 若想在内部类内声明静态字段 就必须将其内部类本身声明为静态 非静态内部类有一个很大的优点:可以自由使用外部类的所有变量和方法...3 对于非静态内部类是不能出现静态模块(包含静态块,静态属性,静态方法等) 4 非静态类的使用需要依赖于外部类的对象,详见上述对象innerClass 的初始化。...总结一下Java类代码加载的顺序,万变不离其宗。 规律一、初始化构造时,先父后子;只有在父类所有都构造完后子类才被初始化 规律二、类加载先是静态、后非静态、最后是构造函数。...可以看到,java将编译时已经确定的值直接复制,进行替换,将无法确定的值放到了内部类的常量池中,并在构造函数中将其从常量池取出到字段中。
java技术允许使用finalize()方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。...,而不需要创建对象就可以访问 void:表示该方法没有返回值 main:主方法,程序的开始 (String[] args):参数,传递进来一个字符串数组的参数 sizeof 是Java 的关键字吗 不是...但非静态内部类需要持有对外部类的引用。 非静态内部类能够访问外部类的静态和非静态成员。静态类不能访问外部类的非静态成员。他只能访问外部类的静态成员。...因此main方法作为程序的入口方法,在这之前是不可能有任何对象被建立的,也就是在main之前包括main自身不可能是非静态方法。...所以main方法一定是静态的,有类就可以得到执行,进而有更多的静态方法或者非静态方法得到执行 是否可以从一个静态(static)方法内部发出对非静态(non-static)方法的调用 不可以,静态函数中不能访问非静态成员变量
如:通过子类引用父类的静态字段,不会导致子类初始化;通过数组定义来引用类,不会触发此类的初始化;引用类的静态扁郎不会触发定义常量类的初始化,因为常量在编译阶段已经被放入到常量池中了。...1.3、加载非静态内容:把.class中的所有非静态内容加载到方法区下的非静态区域内 1.4、加载静态内容: 1.4.1、把.class中的静态内容加载到方法区下的静态区域内 1.4.2、静态内容加载完成之后...2、对象创建过程 2.1、在堆内存中开辟一块空间 2.2、给开辟空间分配一个地址 2.3、把对象的所有非静态成员加载到所开辟的空间下 2.4、所有非静态成员变量默认初始化完成之后,调用构造函数 2.5...、所有非静态变量默认初始化完成之后,调用构造函数 2.6、在构造函数入栈时,分为两部分:先执行构造函数中的隐式三式,再执行构造函数中书写的代码 2.6.1、隐式三步 2.6.1、执行super语句...2.6.2、对开辟空间下的所有非静态成员变量进行显式初始化 2.6.3、执行构造代码块 2.6.2、在隐式三步执行完之后,执行构造函数中书写的代码 2.7、在整个构造函数执行完并弹栈后,把空间分配的地址赋值给一个引用对象
领取专属 10元无门槛券
手把手带您无忧上云