服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Java教程 - java中静态代码块与构造方法的执行顺序判断

java中静态代码块与构造方法的执行顺序判断

2021-03-01 14:09尚学堂明辉 Java教程

对静态代码块以及构造函数的执行先后顺序,一直很迷惑,直到最近看到一段代码,发现终于弄懂了,所以这篇文章主要给大家介绍了关于如何判断java中静态代码块与构造方法的执行顺序的相关资料,需要的朋友可以参考下。

前言

静态代码优先于非静态的代码,是因为被static修饰的成员都是类成员,会随着JVM加载类的时候加载而执行,而没有被static修饰的成员也被称为实例成员,需要创建对象才会随之加载到堆内存。所以静态的会优先非静态的。

执行构造器(构造方法)的时候,在执行方法体之前存在隐式三步:

1,super语句,可能出现以下三种情况:

      1)构造方法体的第一行是this语句,则不会执行隐式三步,

      2)构造方法体的第一行是super语句,则调用相应的父类的构造方法,

      3)构造方法体的第一行既不是this语句也不是super语句,则隐式调用super(),即其父类的默认构造方法,这也是为什么一个父类通常要提供默认构造方法的原因;

2,初始化非静态变量;

3,构造代码块。

由此可知,构造代码块优先于构造方法的方法体,但是this关键字跟super关键字不能同时出现,而且只能在代码的第一行。如果出现了this关键字,隐式三步就不会执行。

先看看下面几个类,然后判断它们的输出:

java" id="highlighter_187959">
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public class A {
 
 static{
  System.out.print(1);
 }
 public A(){
  System.out.print(2);
 }
 }
 
 public class B extends A{
 
 static{
  System.out.print("a");
 }
 public B(){
  System.out.print("b");
 }
 }
 
 public class C {
 
 public static void main(String[] args){
  A a = new B();
  a = new B();
 }
 }

父类与子类执行的先后顺序

静态变量的执行特性

方法重写(override)的注意事项

1.当父类与子类都有静态代码块和构造函数的时候,执行顺序如下:

父类静态代码块 > 子类静态代码块

父类构造函数 > 子类构造函数(先有父亲,后有孩子)

如果是多级继承关系的话,最高层的父类首先执行,然后依次递减

总结:静态优先执行,父类优先执行

注意:静态代码块是在JVM加载类的时候执行的,而且静态代码块执行且仅执行一次

2.在调用类中的方法时,在方法体执行之前,首先要对类中的成员变量进行赋值,如果代码中没有赋具体的值,也有默认值。成员变量的赋值顺序按照前后顺序进行。

如果有既有直接赋值,也有构造方法赋值,那么根据先后顺序执行

3.重写(Override) 重载(Overload)

重载是方法名字,返回类型一致,唯一不同的是方法的参数不同(参数类型不同,或者参数类型不同)

重写:

  • 发生方法重写的两个方法返回值,方法名,参数列表必须完全一致
  • 子类抛出的异常不能超过父类相应的方法抛出的异常
  • 子类方法的访问级别不能低于父类相应方法的访问级别(public,package,protected, private)

多态:

父类的引用指向了子类的对象,调用时执行的方法也是子类的方法,父类的方法并不会被执行,

所谓多态就是父类或者接口类型的引用可以指向子类或者实现该接口的类的实例(对象),

看了上面的说明,大家也应该知道上面的程序输出结果了。

输出结果为:1a2b2b

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对服务器之家的支持。

原文链接:https://segmentfault.com/a/1190000012323629

延伸 · 阅读

精彩推荐