前言
在上一篇文章中给大家解说了 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;
● 静态方法中能够拜访动态变量和其余静态方法;
● 静态方法个别是在工具类中定义;
● 把握动态代码块的写作形式;
● 把握动态外部类的调用形式;
● 把握动态导入的应用形式。
发表回复