就个人的一些看法简单的 谈谈static。
就java 工程师来说,static非常容易在面试的时候被问到。
言归正传,书面上说static是静态的。其实我把它理解为“全局的”。什么叫全局的?全局的属性,全局的方法,全局的代码块。
全局属性,全局方法,比较好理解就是这个类所有的对象都共有的属性和方法。因为是整个类共有的,所以可以通过声明直接调用。我把它理解为“单例模式”的属性和方法。所谓单例模式就是指这个类声明的所有对象共享这些属性和方法。一个对象对这个属性进行了修改,所有对象再调这个属性都是修改后的值了。
下面主要说一下static修饰的代码块,面试的一大考点就是static代码块是什么时候被加载的。
首先我们需要了解一下java虚拟机对类的加载过程。首先JVM会通过classloader将类的字节码转换成相应的Class对象。其中classloader是双亲委托的方法来查找类文件的。
就是首先委托父类的classloader查找(父类也有父类就交由父类的父类查找以此类推,直到不再继承别的classloader的类),如果查找不到再由自己来查找。如果自己也找不到就抛出异常。以上是准备工作,当这个类抽次被使用,我们会显出石化这个类(如果有父类就先初始化他的父类),在初始化的过程中我们会处理static修饰的代码。就是我们这里要说的static代码块。每个类知会初始化1次。(我们可以通过改变方法 Class.forName()中的第二个参数来控制是否初始化一个类)。
一下为网上找的一个经典的例子。
面试题目如下:请写出程序执行完成之后的结果。
package extend;
public class X {
Y y=new Y();
static{
System.out.println("tttt");
}
X(){
System.out.println("X");
}
public static void main(String[] args) {
new Z();
}
}
class Y{
Y(){
System.out.println("Y");
}
}
class Z extends X{
Y y=new Y();
static{
System.out.println("tt");
}
Z(){
System.out.println("Z");
}
}
先不告诉最后结果,我们先来分析下。一步一步推出结果。
1.首先分析一段程序的执行后的结果,我们得先找到程序的入口,然后才能着手分析。
也就是main()方法。
2.我们发现main()方法在X类中,要执行main()方法,还得先将X类加载到内存中。
3.X类加载完成后,会做什么事情呢?别急,先来看看static的作用,不知道吧。告诉你:static就是在类被第一次加载的时候执行,以后就不再执行。
4.知道了static的作用,那么X类被加载,那么就会先执行X类的静态属性和静态语句块(static),执行先后顺序看谁在前面就先执行谁。只在此时执行,以后都不会。
5.所以一个输出结果为tttt,没问题了吧。
6.X类的static语句块执行完了,就该执行main()方法啦。
7.new Z();此方法被执行。
8.既然new Z();那么Z类就要被加载。因为Z类继承X类。所以必须先加载X类才行。因为X类已经被加载。所以此时不用再加载X类了。Z类加载好了就要执行Z类的static语句块
9.那么就会打印出tt了吧。
10.都加在完后就要实例化对象了。
11.实例化Z之前,还得先实例化X对吧。因为子类的构造方法都会调用父类的构造方法。
12.那就先实例化X类吧。
13.执行X方法前还得先初始化对不。也就是获取所有属性。那么X类的属性Y就会获取。
14.即X类的Y y=new Y();要被执行。也就是会打印Y。
15.接着执行System.out.println("X");
16.然后就是执行Z的构造方法
17.同样先获取Z的属性Y y=new Y();打印Y。
18.再执行System.out.println("Z");
整个过程就是这样了。现在知道结果了吧:
tttt
tt
Y
X
Y
Z
记住,面试有可能会标出一些语句的,让你选择这些语句的执行顺序。不过只要知道原理,就没什么难的了。
分享到:
相关推荐
在Java编程语言中,类与对象是核心概念,它们构成了面向对象编程的基础。这篇博文将深入探讨这两个概念,以及它们如何...通过阅读“浅谈Java的类与对象”这篇文档,你将能更深入地了解这些核心概念,提升你的编程技能。
Java 中 static 关键字的作用 Java 中的 static 关键字是一个非常重要的概念,它有多种用途,本文将详细介绍 static 关键字在 Java 中的作用。 成员变量 在 Java 中,static 关键字可以修饰成员变量。静态变量...
### 浅谈Java包的使用 #### 一、引言 在Java开发过程中,随着项目的逐渐庞大和复杂,良好的组织结构对于代码管理至关重要。而Java包(Package)就是用来实现这种逻辑分组的一种机制。通过将相关的类放入同一个包中...
### 浅谈Java代理机制 #### 一、引言 在深入探讨Java代理机制之前,我们首先需要了解代理模式的基本概念及其应用场景。代理模式是一种结构型设计模式,它为其他对象提供了一种代理以控制对这个对象的访问。在Java...
Java中static和非static的区别 static和非static是Java中两个非常重要的概念,它们之间的区别是Java开发中一个非常重要的知识点。本文将对Java中static和非static的区别进行详细的介绍,并对其在编程中的应用进行...
public static synchronized void add(int value) { count += value; } ``` 总之,Java多线程编程是复杂而强大的,理解和掌握好同步机制,能够帮助我们编写出高效、安全的并发程序。通过合理使用线程,可以提升...
根据给定的信息,本文将对Java IO的基本概念及其在实际应用中的使用进行深入解析。文章主要探讨了Java中处理输入/输出(IO)的操作方法,包括流的基本分类、常用流的具体实现,以及如何通过缓冲技术提高IO操作效率等...
public static void main(String[] args) throws IOException { Server server = new Server(); server.initServer(8080); server.serve(); } } ``` 在这个例子中,服务器监听特定端口的连接,当有新的连接...
### Java输入输出流基础知识 #### 一、引言 Java作为一种广泛应用的编程语言,其强大的输入输出(IO)处理能力是其重要的特性之一。通过Java IO库,开发者能够轻松地处理各种类型的输入输出操作,包括但不限于文件...
### 浅谈Java内部类的四个应用场景 #### 一、引言 在Java语言中,内部类(Inner Class)作为一种特殊的存在,为开发者提供了更为灵活的面向对象编程方式。通过本文,我们将深入探讨Java内部类的四个典型应用场景,...
在Java语言中,main方法的原型是`public static void main(String[] args)`,其中`args`是字符串数组参数,称为命令行参数列表。在命令行方式下运行程序时,位于程序后面的参数列表可以作为输入数据。例如,以下程序...
Java 递归算法浅谈 Java 递归算法是 Java 编程中的一种常见算法,通过自调用函数实现复杂问题的解决。下面是 Java 递归算法的相关知识点。 一、递归函数的定义 递归函数是指在函数体内直接或间接地调用自己,即...
在Java编程语言中,声明常量通常会使用`static`关键字进行修饰,这是为了实现特定的目的和优化。本文将深入探讨为什么在Java中声明常量时需要使用`static`修饰符,以及它带来的益处。 首先,理解`static`关键字的...
Java 程序中的构造方法调用 Java 程序设计语言中的构造方法是一个特殊的成员方法,它专门用于创建对象和对所创建的对象进行初始化。正确调用构造方法是我们设计程序的关键所在。构造方法的调用方式有三种:一是在...
在Java编程中,线程是程序执行的最小单元,它们允许并发处理多个任务,提高程序的效率。本文将深入探讨Java线程的生命周期,包括创建、启动、结束以及线程的协作和调度。 首先,创建Java线程有两种主要方式:直接...
### Java同步机制浅谈 #### synchronized关键字的作用及应用 在Java多线程环境中,`synchronized`关键字扮演着至关重要的角色。它可以帮助开发者确保多线程环境下的数据一致性,防止因并发访问导致的数据错误。本...
"浅谈Java多线程处理中Future的妙用" 在Java多线程处理中,Future是一个非常重要的概念,它可以帮助我们更好地处理并发任务。Future是一个未来对象,里面保存着线程处理结果,它像一个提货凭证,拿着它你可以随时去...
在本资料"浅谈为什么java命令运行class文件出现异常共7页.pdf"中,可能详细讨论了这些常见问题及其解决方法。由于提供的压缩包中仅有一个名为"赚钱项目"的文件,这似乎与Java编程无关,因此可能不是解决上述问题的...
在《浅谈Java String内幕(1)》 中,字符串变量(非final修饰)通过 “+” 进行拼接,在编译过程中会转化为StringBuilder对象的append操作,注意是编译过程,而不是在JVM中。 public class StringTest { ...
今天我们将深入探讨Java中类的实例化步骤,特别是与`static`关键字相关的部分。 首先,`static`关键字在Java中有着特殊的意义,它标识着类级别的变量、方法或代码块,这些元素不受类实例的影响,而是直接属于类本身...