java调用静态函数时是否会调用构造函数

今天在看《think in java》时,有个问题没搞懂:在调用一个静态函数时,该类的构造函数是否会被调用。在网上并未找到相关内容,不如动手来试试结果。

 1 public class test {
 2     public test() {
 3         System.out.println("constructor");
 4     }
 5     public static void print() {
 6         System.out.println("static");
 7     }
 8     public static void main(String[] args) {
 9         test.print();
10     }
11 }

结果:

1 static

可以看到,结果仅仅是现实了static,也即是说并没有执行构造函数。

初此问题外,还有就是,初始化顺序呢,是否在执行静态方法前还进行了初始化呢?

 1 package test;
 2
 3 public class test {
 4     static int i=1;
 5     public test() {
 6         System.out.println("constructor");
 7     }
 8     public static void print() {
 9         System.out.println(i+"static");
10     }
11     public static void main(String[] args) {
12         test.print();
13     }
14 }

结果:

1 1static

可以看到,静态变量已经被初始化过了。

通过翻书,初始化的顺序:

静态变量、静态初始化块>变量、初始化块>构造器

要注意的是静态函数不能调用非静态变量,上述顺序是对于实例来说的。通过第一段代码也可以看出,在调用静态函数后也没有调用构造函数。

时间: 2024-10-14 08:04:33

java调用静态函数时是否会调用构造函数的相关文章

原!! java直接打印一个对象时,并不是直接调用该类的toString方法 ,而是会先判断是否为null,非null才会调用toString方法

网上看了好多java直接打印一个对象时,直接调用该类的toString方法 . 但是: Object obj=null; System.out.println(obj);//没有报错 System.out.println(obj.toString());//报空指针异常 System.out.println(obj);既然也是直接调用toString方法,为什么不报错??? 原因总结如下: 1.调用Object类的toString方法,必须保证object不是null值,否则将抛出NullPoi

java中c#中statc 静态调用不同之处、c#的静态构造函数和java中的构造代码块、静态代码块

1.java和c#静态成员调用的不同之处 static 表示静态的,也就是共享资源,它是在类加载的时候就创建了 java中   可以通过实例来调用,也可以通过类名.成员名来调用,但是一般最好使用类名.成员这个方式,因为静态成员是属于类的,并不是属于具体的对象 c#中     只能通过类名.成员调用,并不能 用实例来进行调用 2.c#的静态构造函数和java中的构造代码块.静态代码块 c# 静态构造函数的特点:        1)静态构造函数不需要手动调用,系统自动调用        2)静态构造

关于Java中基类构造器的调用问题

在<Java编程思想>第7章复用类中有这样一段话,值得深思.当子类继承了父类时,就涉及到了基类和导出类(子类)这两个类.从外部来看,导出类就像是一个与基类具有相同接口的新类,或许还会有一些额外的方法和域.但继承并不只是复制基类的接口.当创建一个导出类对象时,该对象包含了一个基类的子对象,这个子对象与你用基类直接创建的对象是一样的,二者区别在于,后者来自于外部,而基类的子对象是被包裹在导出类对象内部. 这就引发出了一个很重要的问题,对基类子对象的正确初始化也是至关重要的(我们可能在子类的使用基类

实例详解Java中如何对方法进行调用

原文源自http://www.jb51.net/article/73827.htm 方法调用Java支持两种调用方法的方式,根据方法是否返回值来选择. 当程序调用一个方法时,程序的控制权交给了被调用的方法.当被调用方法的返回语句执行或者到达方法体闭括号时候交还控制权给程序. 当方法返回一个值的时候,方法调用通常被当做一个值.例如: int larger = max(30, 40); 如果方法返回值是void,方法调用一定是一条语句.例如,方法println返回void.下面的调用是个语句: Sy

绑定服务时什么时候调用onRebind

Serivce中onRebind被调用的时机很特别,想知道什么时候onRebind被调用,可以接下面的次序来学习,最后自然就明白了! 1. 首先要知道,同一个服务既可能被启动也可以被绑定; 2. Service中onRebind方法被调用,只要符合两个必要条件就行 (1)服务中onUnBind方法返回值为true (2)服务对象被解绑后没有被销毁,之后再次被绑定 .下面举例说明: 例1:同一个Activity对象 先自启动服务(onCreate, onStartCommand):再绑定服务(on

Java方法的嵌套与递归调用

Java方法的嵌套与递归调用 本文关键字:方法.嵌套.递归.经典问题 一.方法的嵌套 1. 概念解读 方法嵌套的概念其实比较好理解,就是在调用方法的过程中又遇到了方法的调用,在刚开始接触的时候虽然在逻辑上能够理解为什么运行结果是这样的,但是对于代码执行的过程还是感觉有些绕. 2. 方法嵌套 在编程中最常见的就是方法与方法之间的调用嵌套,因为通常情况下,我们解决一个问题不会只靠一个方法.而且如果一个方法所提供的功能十分强大,那势必其中的代码逻辑和参数列表也会变的相对复杂,不利于修改和使用,所以我们

调用函数时传递的实参个数arguments.length; ,函数定义时的形参个数sum.length

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <head> <title>范例6-4</title>

水晶报表 Crystal Report 调用存储过程时出错 找不到表 ,解决方法。

用 CrystalReportViewer1 控件在asp.net的网页上显示报表,如果做报表时调用数据表数据的方式调用是可以成功的,但报表是用存储过程获取数据方式会出现以下错误: 找不到表'RptOpenCheck;1' . 文件 G:\TEMP\FO-OpenCheck {6D191F06-DECF-4A25-88FC-8553E3D435AA}.rpt 内出错: 找不到表. Error: 未将对象引用设置到对象的实例. The table 'RptOpenCheck;1' could no

java mysql自定义函数UDF之调用c函数

正如sqlite可以定义自定义函数,它是通过API定义c函数的,不像其他,如这里的mysql.sqlite提供原生接口就可以方便的调用其他语言的方法,同样的mysql也支持调用其它语言的方法. google "mysql call c function"发现一片文章 MySQL User Defined Functions  This tutorial explains what an User Defined Function (UDF) is, what it does and w