关于java:Java静态代码块和静态类静态导入

3次阅读

共计 4498 个字符,预计需要花费 12 分钟才能阅读完成。

前言
在上一篇文章中给大家解说了 static 动态关键字,以及动态变量、动态常量和静态方法等内容。然而对于 static,还有其余的一些内容,比方动态类、动态代码块和动态导入等,接下来给大家持续剖析解说。咱们一起来看看这些内容都是怎么用吧。

全文大概【3300】字,不说废话,只讲能够让你学到技术、明确原理的纯干货!本文带有丰盛的案例及配图,能够让你更好地了解和使用文中的技术概念,并能够给你带来具备足够启迪的思考

一. 动态代码块

  1. 概念
    由 static 润饰的代码块称为动态代码块,每个类中能够有多个动态代码块,每个动态代码块都只会在类加载时执行一次。对那些只须要进行一次操作的初始化代码,就能够放在动态代码块中执行。动态代码块具备如下个性:

● 动态代码块相似于是一个办法,但它不能够在办法中调用,也不能存在于任何办法体中;

● 动态代码块能够写在类中的任何中央,一个类中也能够有多个动态代码块;

● 动态代码块在类加载时执行;

● 动态代码块优先于动静代码块执行;

● 如果类中蕴含多个动态代码块,则 JVM 虚构机会按它们在类中呈现的先后顺序顺次执行,每个动态代码块只会被执行一次;

● 动态代码块与静态方法一样,不能间接拜访类的实例变量和实例办法,须要通过类的实例对象来拜访。

  1. 语法
    动态代码块的语法格局如下:

static {

// 代码内容

}

动态代码块的语法格局比拟奇异,static 关键字前面间接跟一个 {} 花括号,这就是动态代码块。咱们能够在这个动态代码中编写若干代码,成果相似于是一个办法。

  1. 案例
    3.1 定义 User 类
    咱们先来定义一个 User 类,在该类中定义一个动态代码块,一个非动态代码块,还有一个构造方法。在 Java 中,依照代码执行工夫的早晚:

动态代码块 > 非动态代码块 > 构造方法 > 一般办法

咱们要记住以下几点:

● 动态代码块,在类被加载时就会主动调用,且只会被调用一次。

● 非动态代码块,在对象被创立时主动调用,每次创建对象时都会执行。

● 而构造方法,每创立一个对象就会执行一次。

public class User {

// 动态属性,属于整个类,被整个类的所有对象共享!

static int num = 10;

// 一般属性,属于某个对象,是对象公有的!

private int age=20;

// 动态代码块,在类被加载时主动调用,且只会被调用一次。比一般代码块先执行!

static {

// 无论创立几个 User 对象,本动态代码块都只会执行一次,num++ 变成 11

System.out.println(“ 这是动态代码块,num=”+(num++));

}

// 非动态代码块,在对象被创立时主动调用,每次创建对象时都会执行,比构造方法先执行!

{

// 每创立一个 User 对象,就会执行一次本代码块,num++ 变成 12,age=20.

System.out.println(“ 这是非动态代码块,num=”+(num++)+”,age=”+(age++));

}

// 构造方法

public User(){

// 每创立一个 User 对象,就会执行一次构造方法,num++ 变成 13,age=21.

System.out.println(“ 这是无参构造方法,num”+(num++)+”,age=”+(age++));

}

}

3.2 定义测试类
接下来咱们再定义一个测试类,在这里创立 3 个 User 对象。

public class UserTest {

public static void main(String[] args) {

// 创立第一个 User 对象

User user1=new User();

// 创立第 2 个 User 对象

User user2=new User();

// 创立第 3 个 User 对象

User user3=new User();

}

}

3.3 执行后果剖析
下面的代码执行后果如下图所示:

在上述代码中,咱们创立了 3 个 User 对象。其中,无论结构几次对象,一个类中的一个 static 动态代码块都只会执行一次,所以在结构第一个 User 对象时 num 是 10。而后执行非动态代码块,num 变成 11,age 等于 20。接着执行构造方法。num=12,age=21。

之后开始结构第 2 个对象,此时只执行非动态代码块和构造方法,不会再执行动态代码块。因为 num 是动态属性,所以第 2 个 user 对象持续共享 num 变量,num=13;而因为 age 是成员变量,所以 age 是一个新的成员变量,age 依然是 20。接着执行构造方法,num=14,age=21。

最初创立第 3 个 User 对象,过程和上述一样。

二. 动态外部类

  1. 概念
    在 Java 中,咱们能够在一个类的外部定义另一个类,也就是 A 类外面能够嵌套一个 B 类,这个外部的 B 类就叫做外部类。而外部类依据是否带有 static 关键词,能够分为动态外部类和非动态外部类。

其中,动态外部类应用 static 关键字润饰。对于动态外部类,咱们能够间接拜访,不须要创立外部类来拜访它。

留神,对于外部类,壹哥会在前面进行专门的解说,所以此处咱们大家先有个印象即可。

  1. 语法
    动态外部类的语法格局如下:

public class 外部类 {

// 代码 …

static class 外部类{

// 代码 …

}

}

  1. 案例
    3.1 定义动态外部类
    这里咱们先简略定义一个动态外部类,前面咱们在学习外部类时再专门解说。在这个动态外部类中,咱们定义了一个办法,来拜访外部类中的一般属性和动态属性。要记住以下几点:

● 动态外部类拜访外部类的成员变量时,须要先创立外部类对象;

● 非动态外部类能够间接拜访应用外部类的成员变量,如同应用本类中的变量;

● 所有的外部类拜访外部类的动态变量时,能够间接通过 ” 外部类. 动态变量 ” 的模式拜访。

/**

*

  • 外部类和外部类

*/

public class OuterClass {

// 一般属性,属于外部类

static int outerNum=10;

// 定义一个动态的外部类,如果不带 static,就是一个一般的外部类。

// 外部类的应用,和一般类一样,外面能够失常定义属性、办法、构造方法等。

static class InnerClass{

// 公有属性无奈在类的内部间接拜访

//private int innerNum=20;

int innerNum=20;

public void printNum() {

// 定义外部类对象

OuterClass outer=new OuterClass();

// 这里的 this 是指 InnerClass 外部类对象!

System.out.println(“innerNum=”+this.innerNum+”,outerAge=”+outer.outerAge+”,outerNum=”+OuterClass.outerNum);

}

}

}

3.2 定义测试类
咱们再定义一个测试类,看看外部类对象是怎么调用的。

/**

*

  • 测试拜访外部类

*/

public class InnerClassTest {

public static void main(String[] args) {

// 创立外部类对象,格局为“外部类. 外部类 对象名 = new 外部类. 外部类的构造方法”

OuterClass.InnerClass inner = new OuterClass.InnerClass();

// 调用外部类的办法

inner.printNum();

// 拜访外部类属性

System.out.println(“outerNum=”+OuterClass.outerNum);

// 拜访外部类属性

System.out.println(“innerNum=”+inner.innerNum);

}

}

三. 动态导入

  1. 概念
    JDK 1.5 之后,Java 中新增了一种动态导入的语法,用于导入指定类中的某个动态变量、静态方法或全副的动态变量和静态方法。如果一个类中的办法全都是应用 static 申明的静态方法,咱们就能够通过 import static 的形式进行导入,这种导包形式就叫做动态导入。
  2. 语法
    咱们要应用 import static 语句进行动态导入,依据导入数量的多少,会有两种状况:

● 局部导入:导入局部动态变量或静态方法;

● 全副导入:导入全副动态变量或静态方法。

2.1 局部导入
局部导入是指利用动态导入的语法,导入指定类中单个的动态变量或静态方法。语法格局如下:

import static package.ClassName.fieldName|methodName;

package 要导入的包名,ClassName 类名,fieldName 是动态变量名或 methodName 静态方法名。

2.2 全副导入
全副导入是指利用动态导入的语法,导入指定类中全副的动态变量或静态方法。语法格局如下:

import static package.ClassName.*;

下面的星号是 java 中的一种通配符,代表所有导入的动态变量或静态方法名。

咱们要留神,import static 语句要放在 Java 代码的 package 语句之后、类定义之前,与一般的 import 语句平级。

  1. 案例
    在这里设计一个简略的案例,给大家演示一下动态导入的应用。咱们之前进行输入的时候,常常应用 System.out.println(“”); 语句,其实这样就挺麻烦,每次都要写 System.out,实际上咱们只须要调用 println()办法就能够了。而 println()就是一个静态方法,所以咱们就能够应用动态导包来简化操作了。

package com.yyg.staticdemo;

// 动态导入 System 类中的所有动态成员

import static java.lang.System.*;

// 动态导入 Math 类中的所有动态成员

import static java.lang.Math.*;

/**

  • @author 一一哥 Sun
  • QQ:2312119590
  • CSDN、掘金、知乎找我哦

*

  • 动态导包案例

*/

public class StaticImportDemo {

public static void main(String[] args) {

//System.out.println(“ 动态导包 ”);

//out 其实是 java.lang.System 类的动态变量,示意规范输入;

//PI 是 java.lang.Math 类中的动态变量,示意数学里的 π 常量;

//java.lang.Math.PI

out.println(PI);

// 咱们能够间接调用 Math 类的 sqrt 静态方法,返回 64 的正平方根

//java.lang.Math.sqrt(E)

out.println(sqrt(64));

}

}

四. 结语
至此就把 static 动态变量、动态常量、动态代码块、动态类、动态导入等相干的内容给大家全副介绍结束了。这些都是咱们开发时很罕用的内容,所以壹哥心愿各位初学者,要把 static 相干的内容牢牢把握。最初再来给大家简略总结一下本文要点:

● 动态成员属于所有实例对象都“共享”的字段,是类中的“公共财产”;

● 调用静态方法不须要实例对象,静态方法中不能应用 this 和 super;

● 静态方法中能够拜访动态变量和其余静态方法;

● 静态方法个别是在工具类中定义;

● 把握动态代码块的写作形式;

● 把握动态外部类的调用形式;

● 把握动态导入的应用形式。

正文完
 0