共计 4498 个字符,预计需要花费 12 分钟才能阅读完成。
前言
在上一篇文章中给大家解说了 static 动态关键字,以及动态变量、动态常量和静态方法等内容。然而对于 static,还有其余的一些内容,比方动态类、动态代码块和动态导入等,接下来给大家持续剖析解说。咱们一起来看看这些内容都是怎么用吧。
全文大概【3300】字,不说废话,只讲能够让你学到技术、明确原理的纯干货!本文带有丰盛的案例及配图,能够让你更好地了解和使用文中的技术概念,并能够给你带来具备足够启迪的思考
一. 动态代码块
- 概念
由 static 润饰的代码块称为动态代码块,每个类中能够有多个动态代码块,每个动态代码块都只会在类加载时执行一次。对那些只须要进行一次操作的初始化代码,就能够放在动态代码块中执行。动态代码块具备如下个性:
● 动态代码块相似于是一个办法,但它不能够在办法中调用,也不能存在于任何办法体中;
● 动态代码块能够写在类中的任何中央,一个类中也能够有多个动态代码块;
● 动态代码块在类加载时执行;
● 动态代码块优先于动静代码块执行;
● 如果类中蕴含多个动态代码块,则 JVM 虚构机会按它们在类中呈现的先后顺序顺次执行,每个动态代码块只会被执行一次;
● 动态代码块与静态方法一样,不能间接拜访类的实例变量和实例办法,须要通过类的实例对象来拜访。
- 语法
动态代码块的语法格局如下:
static {
// 代码内容
}
动态代码块的语法格局比拟奇异,static 关键字前面间接跟一个 {} 花括号,这就是动态代码块。咱们能够在这个动态代码中编写若干代码,成果相似于是一个办法。
- 案例
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 对象,过程和上述一样。
二. 动态外部类
- 概念
在 Java 中,咱们能够在一个类的外部定义另一个类,也就是 A 类外面能够嵌套一个 B 类,这个外部的 B 类就叫做外部类。而外部类依据是否带有 static 关键词,能够分为动态外部类和非动态外部类。
其中,动态外部类应用 static 关键字润饰。对于动态外部类,咱们能够间接拜访,不须要创立外部类来拜访它。
留神,对于外部类,壹哥会在前面进行专门的解说,所以此处咱们大家先有个印象即可。
- 语法
动态外部类的语法格局如下:
public class 外部类 {
// 代码 …
static class 外部类{
// 代码 …
}
}
- 案例
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);
}
}
三. 动态导入
- 概念
JDK 1.5 之后,Java 中新增了一种动态导入的语法,用于导入指定类中的某个动态变量、静态方法或全副的动态变量和静态方法。如果一个类中的办法全都是应用 static 申明的静态方法,咱们就能够通过 import static 的形式进行导入,这种导包形式就叫做动态导入。 - 语法
咱们要应用 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 语句平级。
- 案例
在这里设计一个简略的案例,给大家演示一下动态导入的应用。咱们之前进行输入的时候,常常应用 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;
● 静态方法中能够拜访动态变量和其余静态方法;
● 静态方法个别是在工具类中定义;
● 把握动态代码块的写作形式;
● 把握动态外部类的调用形式;
● 把握动态导入的应用形式。