《仅以此博文纪念2017/03/21 PM 我们的聊天讨论》
最近我们经常会讨论一些你目前在学习的知识,虽然我总是觉得不屑一顾但是不得不承认有些细节我自己也未曾思考过,细想也不见得自己理解的很透彻
Ta的问题:非静态代码块怎么写呀?
静态代码块,非静态代码块,构造函数 的 优先级是怎样的?
以下就这个问题展开说一说
一 学习[非静态代码块],[静态代码块],构造函数]
1 非静态代码块(普通代码块)--->在方法或语句中出现的{}就称为普通代码块即非静态代码块。
2 静态代码块--->在Java中,静态代码块就是使用static关键字声明的代码块。
静态块用于初始化类,为类的属性初始化。每个静态代码块只会执行一次。
由于JVM*(Java虚拟机)在加载类时会执行静态代码块,所以静态代码块先于主方法执行。
如果类中包含多个静态代码块,那么将按照"先定义的代码先执行,后定义的代码后执行"。
3 构造函数--->每一个对象都有自己的构造方法,默认的构造方法是无参数的,构造方法就是与类同名的那个方法,它的作用就是用来初始化成员变量。
了解了概念之后我们举例说明一下这些代码都是什么时候执行的
这个是类A
package study;
public class A{
// 静态代码块
static {
System.out.println("我是A的第1个静态代码块");
}
static {
System.out.println("我是A的第2个静态代码块");
}
// 构造函数
public A() {
System.out.println("我是A的构造函数");
}
// 非静态代码块
{
System.out.println("我是A的非静态代码块");
}
}
这个是类B ,主方法*(main)在B类中
package study;
public class B {
// 静态代码块
static {
System.out.println("我是B的静态代码块");
}
// 非静态代码块
{
System.out.println("我是B的非静态代码块");
}
// 构造函数
public B() {
System.out.println("我是B的构造函数");
}
public static void main(String[] args) {
System.out.println("我是B的主方法");
new A();
new A();
new B();
new B();
}
}
执行结果如下图
可见 执行顺序:(优先级从高到低)静态代码块>main方法>构造代码块>构造函数。
综上所述 静态代码块是在类加载时自动执行的,非静态代码块是在创建对象时自动执行的代码,不创建对象不执行该类的非静态代码块。
※注意:1 静态代码块不能存在于任何方法体内。2 静态代码块不能直接访问静态实例变量和实例方法,需要通过类的实例对象来访问。
二 解析[静态代码块] / [静态方法]/ [非静态方法]
1 静态代码块 --->一般情况下,如果有些代码必须在项目启动的时候就执行那么需要使用静态代码块,这种代码是主动执行的,通常格式为static{}
2 静态方法--->在类加载的时候 就已经加载 可以用类名直接调用 (类名.静态方法)来调用,通常用static修饰方法 ,比如main方法就是静态方法
3 非静态方法也就是普通的方法 ,有返回值、方法名称、方法体组成,这种方法就是实例化该类的对象之后才可以调用的。
综上 静态代码块是自动执行的; 静态方法是被调用的时候才执行的,直接通过类名调用;非静态方法是通过实例化对象调用的。
举例
package study;
public class C {
// 静态代码块
static {
System.out.println("我是C的静态代码块");
}
// 静态方法
public static String testStatic() {
System.out.println("我是C的静态方法");
// 返回类型是String 所以需要返回一个是String 类型的值
return "hello";
}
// 非静态方法
public String test() {
System.out.println("我是C的非静态方法");
// 返回类型是String 所以需要返回一个是String 类型的值
return "world";
}
// 主方法
public static void main(String[] args) {
System.out.println("我是C的主方法");
// 调用静态方法
C.testStatic();
// 调用非静态方法
C c = new C();
c.test();
}
}
以上,希望我们一起从点滴开始进步!