精华内容
下载资源
问答
  • 静态代码块优先于构造方法,静态代码块不能存在任何方法体内包括静态方法和属性...静态代码块和静态方法都是启动载入唯一区别静态代码块自动执行的静态代码块调用才能执行 静态变量属于这个类他不属于任何对象的...

    静态代码块优先于构造方法,静态代码块不能存在任何方法体内包括静态方法和属性变量

    静态代码块和静态方法都是启动载入唯一区别静态代码块自动执行的静态代码块调用才能执行

    静态变量属于这个类他不属于任何对象的

    展开全文
  • 这篇来讨论下静态代码块和静态方法,静态方法我们已经知道了,就是这个方法的名称前有一个static修饰符。先来看看什么是静态代码块。一般情况下,如果有些代码必须在项目启动的时候就执行的时候,需要使用静态代码块,...

           这篇来讨论下静态代码块和静态方法,静态方法我们已经知道了,就是这个方法的名称前有一个static修饰符。先来看看什么是静态代码块。一般情况下,如果有些代码必须在项目启动的时候就执行的时候,需要使用静态代码块,这种代码是主动执行的,例如Java中程序执行入口的main()函数。在不创建对象的情况下,其他程序来调用的时候,需要使用静态方法。静态方法是直接通过类名.静态方法名来调用的。静态代码块和静态方法的唯一区别就是,静态代码块是自动执行的,而静态方法是被动执行,也就是说只有被调用,静态方法才会被执行。

    先看一段程序,证明几个知识点,一个Widget.java和一个StaticDemo.java

    package javademo;
    
    public class Widget {
    
        private int id;
        private static int numberOfWidgets = 0;
    
        public Widget(){
            // numberOfWidget先自增,然后复制给变量id
            System.out.println("类的实例在初始化的时候先执行构造方法");
            id = ++numberOfWidgets;
        }
    
        // 新建一个实例方法,返回实例变量id的值
        public int getID(){
            return id;
        }
    
        //新建一个静态方法
        public static int getAvailablWidgets(){
            return numberOfWidgets;
        }
    
    }
    

    测试类内容如下。

    package javademo;
    
    import java.nio.file.WatchService;
    
    public class StaticDemo {
    
        public static void main(String args[]){
    
            Widget w1 = new Widget();
            Widget w2 = new Widget();
    
            System.out.println(w1.getID());
            System.out.println(w2.getID());
            System.out.println("一共有多少个Widget?"+Widget.getAvailablWidgets());
    
        }
    
    }
    
    运行结果:

    类的实例在初始化的时候先执行构造方法
    类的实例在初始化的时候先执行构造方法
    1
    2
    一共有多少个Widget?2

    为什么是这个输出结果,我们要弄明白这个main函数里面代码的执行过程。

    1. 实例在初始化过程就会调用构造方法

    Widget w1 = new Widget();
           第一行执行这个代码,实例w1 通过new关键字开始初始化,在这个过程中,类的构造函数里面就执行,而我们构造函数写了numberOfWidgets是运行一次就自增1,这个时候调用w1.getID(),打印的结果就是1.

    2. 静态方法是不需要初始化,直接通过类名调用

          上面我们初始化了两个Widget实例,所以,执行了两个构造函数,numberOfWidgets和ID就变成了2. 直接通过类名来调用类的静态方法。

    3. 实例对象是不能调用静态方法

           实例对象是不能调用静态方法的,你可以在main方法中试试w1.getAvariableWidgets(),会提示错误。因为静态方法在使用前是不需要创建实例对象。

    4. 静态方法不能以任何方式引用this和super关键字

           因为静态方法在使用前不用创建任何实例对象,当静态方法调用时,this所引用的对象根本没有产生。this一般只实例对象本身,super只这个实例的父类。


    展开全文
  • Java静态代码块和静态方法

    千次阅读 2018-07-19 10:47:41
    1 静态代码块:有些代码必须在项目启动的时候就执行,这种代码是主动执行的(当类被载入时,静态代码块被执行,且只被执行一次,静态块常用来执行类属性的初始化) 2 静态方法:需要在项目启动的时候就初始化,在不...

    1 静态代码块:有些代码必须在项目启动的时候就执行,这种代码是主动执行的(当类被载入时,静态代码块被执行,且只被执行一次,静态块常用来执行类属性的初始化)

    2 静态方法:需要在项目启动的时候就初始化,在不创建对象的情况下,这种代码是被动执行的(静态方法在类加载的时候就已经加载 可以用类名直接调用)。

    两者的区别是:静态代码块是自动执行的,

    静态方法是被调用的时候才执行的.


    静态代码块,在虚拟机加载类的时候就会加载执行,而且只执行一次;
    
    非静态代码块,在创建对象的时候(即new一个对象的时候)执行,每次创建对象都会执行一次
    
    展开全文
  • (一)java 静态代码块 静态方法区别一般情况下,如果有些代码必须在项目启动的时候就执行的时候,需要使用静态代码块,这种代码是主动执行的;需要在项目启动的时候就初始化,在不创建对象的情况下,其他程序来调用的时候...

    (一)java 静态代码块 静态方法区别
    一般情况下,如果有些代码必须在项目启动的时候就执行的时候,需要使用静态代码块,这种代码是主动执行的;需要在项目启动的时候就初始化,在不创建对象的情况下,其他程序来调用的时候,需要使用静态方法,这种代码是被动执行的. 静态方法在类加载的时候 就已经加载 可以用类名直接调用
    比如main方法就必须是静态的 这是程序入口
    两者的区别就是:静态代码块是自动执行的;
    静态方法是被调用的时候才执行的.

    静态方法
    (1)在Java里,可以定义一个不需要创建对象的方法,这种方法就是静态方法。要实现这样的效果,只需要在类中定义的方法前加上static关键字。例如:

    public static int maximum(int n1,int n2)

    使用类的静态方法时,注意:

    a在静态方法里只能直接调用同类中其他的静态成员(包括变量和方法),而不能直接访问类中的非静态成员。这是因为,对于非静态的方法和变量,需要先创建类的实例对象后才可使用,而静态方法在使用前不用创建任何对象。

    b 静态方法不能以任何方式引用this和super关键字,因为静态方法在使用前不用创建任何实例对象,当静态方法调用时,this所引用的对象根本没有产生。

    (2)静态变量是属于整个类的变量而不是属于某个对象的。注意不能把任何方法体内的变量声明为静态,例如:
    fun()
    {
    static int i=0;//非法。
    }

    (3)一个类可以使用不包含在任何方法体中的静态代码块,当类被载入时,静态代码块被执行,且只被执行一次,静态块常用来执行类属性的初始化。例如:
    static
    {
    }

    类装载步骤
    在Java中,类装载器把一个类装入Java虚拟机中,要经过三个步骤来完成:装载、链接和初始化,其中链接又可以分成校验、准备和解析三步,除了解析外,其它步骤是严格按照顺序完成的,各个步骤的主要工作如下:

    装载:查找和导入类或接口的二进制数据;
    链接:执行下面的校验、准备和解析步骤,其中解析步骤是可以选择的;
    校验:检查导入类或接口的二进制数据的正确性;
    准备:给类的静态变量分配并初始化存储空间;
    解析:将符号引用转成直接引用;
    初始化:激活类的静态变量的初始化Java代码和静态Java代码块。
    初始化类中属性是静态代码块的常用用途,但只能使用一次。

    public class Father {
    	//静态代码块
    	static{
    		System.out.println("我是父类的静态代码块!");
    	}
    	
    	{
    		System.out.println("我是父亲的构造代码块!");
    	}
    	
    	//父类的构造方法
    	public Father(){
    		System.out.println("我是父类的构造方法!");
    	}
    
    }
    
    public class Children extends Father{
    	
    	//孩子构造方法
    	public Children(){
    		System.out.println("我是孩子的构造类器!");
    	}
    	
    	//静态代码块
    	static{
    		System.out.println("我是孩子静态代码块!");
    	}
    	
    	{
    		System.out.println("我是孩子的构造代码块!");
    	}
    
    	public static void main(String[] args) {
    		Children c = new Children();
    	}
    
    }
    
    执行结果:
    我是父类的静态代码块!
    我是孩子静态代码块!
    我是父亲的构造代码块!
    我是父类的构造方法!
    我是孩子的构造代码块!
    我是孩子的构造类器!


    分析:当执行new Child()时,它首先去看父类里面有没有静态代码块,如果有,它先去执行父类里面静态代码块里面的内容,当父类的静态代码块里面的内容执行完毕之后,接着去执行子类(自己这个类)里面的静态代码块,当子类的静态代码块执行完毕之后,它接着又去看父类有没有非静态代码块,如果有就执行父类的非静态代码块,父类的非静态代码块执行完毕,接着执行父类的构造方法;父类的构造方法执行完毕之后,它接着去看子类有没有非静态代码块,如果有就执行子类的非静态代码块。子类的非静态代码块执行完毕再去执行子类的构造方法,这个就是一个对象的初始化顺序。

    总结:
    对象的初始化顺序:首先执行父类静态的内容,父类静态的内容执行完毕后,接着去执行子类的静态的内容,当子类的静态内容执行完毕之后,再去看父类有没有非静态代码块,如果有就执行父类的非静态代码块,父类的非静态代码块执行完毕,接着执行父类的构造方法;父类的构造方法执行完毕之后,它接着去看子类有没有非静态代码块,如果有就执行子类的非静态代码块。子类的非静态代码块执行完毕再去执行子类的构造方法。总之一句话,静态代码块内容先执行,接着执行父类非静态代码块和构造方法,然后执行子类非静态代码块和构造方法。

    注意:子类的构造方法,不管这个构造方法带不带参数,默认的它都会先去寻找父类的不带参数的构造方法。如果父类没有不带参数的构造方法,那么子类必须用supper关键子来调用父类带参数的构造方法,否则编译不能通过。


    转载于:https://my.oschina.net/u/2543420/blog/646458

    展开全文
  • (1)Java静态方法 在Java里,可以定义一个不需要创建对象就可以调用的方法,这种方法就是...在静态方法里只能直接调用同类中其他的静态成员(包括变量方法),而不能直接访问类中的非静态成员。这是因为,对于非静...
  • (一)java 静态代码块 静态方法区别 一般情况下,如果有些代码必须在项目启动的时候就执行的时候,需要使用静态代码块,这种代码是主动执行的;需要在项目启动的时候就初始化,在不创建对象的情况下,其他程序来调用的...
  • 一般情况下,如果有些代码必须在项目启动的时候就执行的时候,需要使用静态代码块,这种代码是主动执行的;需要在项目启动的时候就初始化,在不创建对象的情况下,其他程序来调用的时候,需要使用静态方法,这种代码是被动...
  • 今天突然有疑问Java类中静态方法和static代码块哪个先执行,所以...静态代码块:有些代码必须在项目启动的时候就执行,这种代码是主动执行的(当类被载入时,静态代码块被执行,且只被执行一次,静态块常用来执行类属性
  • 静态代码块:有些代码必须在项目启动的时候就执行,这种代码是主动执行的(当类被载入时,静态代码块被执行,且只被执行一次,静态块常用来执行类属性的初始化) 静态方法:需要在项目启动的时候就初始化,在不创建...
  • (一)java 静态代码块 静态方法区别  一般情况下,如果有些代码必须在项目启动的时候就执行的时候,需要使用静态代码块,这种代码是主动执行的;需要在项目启动的时候就初始化,在不创建对象的情况下,其他程序来调用的...
  • 关于加载,其实,就是将源文件的class文件找到类的信息将其加载到方法区中,然后在堆区中实例化一个java.lang.Class对象,作为方法区中这个类的信息的入口。但是这一功能是在JVM之外实现的,主要的原因是方便让...
  • 是一个修饰符,修饰成员(成员变量成员方法) 当成员被static修饰后,成员就多了一种调用方法,除了可以被对象调用外,还可以被类名直接调用。格式:类名.成员名称 静态修饰内容被对象所共享。静态内容存放于方法...
  • 静态代码块 > 非静态代码块 > 构造方法 示例: public class Test { { System.out.println("not static run"); } static { System.out.println("static run"); } public Test() { System.out....
  • 代码块分为:静态代码块和非静态代码块。 1.静态代码块 静态代码块随着类的加载而执行,它只能执行一次,就是第一次创建实例或者是调用静态属性的时候,这里我们不难推断出它的作用就是初始化类的信息。 注意:静态...
  • 1 静态代码块:有些代码必须在项目启动的时候就执行,这种代码是主动执行的(当类被载入时,静态代码块被执行,且只被执行一次,静态块常用来执行类属性的初始化) 2 静态方法:需要在项目启动的时候就初始化,在不...
  • 静态方法和静态代码块

    千次阅读 2015-08-25 22:18:11
    1.静态代码块不能写this或者对象,因为静态代码块在对象初始化之前执行; 2.静态代码块在构造代码块之前执行; 3.静态代码块用于初始化类,只执行一次; 4.静态方法只能访问静态成员; 执行顺序:静态...
  • 静态方法在访问本类的成员时,只允许访问静态成员(即静态成员变量和静态方法),注意图一,调用静态方法时只执行了静态代码块和静态方法,而不允许访问实例成员变量和实例方法;实例方法则无此限制 static{}静态...
  • 静态代码块和非静态代码块的区别 静态代码块 内部可以有输出语句 随着类的加载而执行,而且只执行一次 作用:初始化类的信息 如果一个类中定义了多个静态代码块,则按照声明的先后顺序执行 静态代码块的执行要优先...
  • package note; public class Person { String name; static int age; public Person() { this.name="张三";... System.out.println("构造方法");... // 非静态代码块 ... System.out.println(... // 静态代码块
  • 静态代码块和实例初始化方法 类的成员: (1)属性 (2)方法 (3) 构造器 类的第四成员:代码块 作用:为属性初始化 一、非静态代码块 1、语法格式: 【修饰符】 class 类名 【extends 父类】{ { 非静态的代码块...
  • Java中的静态代码块、代码块、构造代码块和方法代码块的运行顺序
  • 静态代码块和构造方法 ** 静态代码块 1.在java中用static修饰的代码块 2.格式 public class Test { static { System.out.println("静态代码块!"); } } 3.执行时机:在类加载时就被运行了,而且只运行一次,...
  • Java中静态代码块、构造代码块、构造函数、普通代码块  在Java中,静态代码... 在java类中(方法中不能存在静态代码块)使用static关键字{}声明的代码块: 1 2 3 4 5 publicc...
  • 1. 静态属性:静态属性占用同一代码块,既以static声明的属性,不管声明多少过对象,static的值改变多少次,它的值永远是一次所赋的值。就像c语言中地址的概念类似,不管声明多少个对象,静态变量永远占用同一个...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,678
精华内容 2,671
关键字:

静态代码块和静态方法