Java面向对象--03
工具类 静态代码块
----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------
1. 工具类
静态方法的重要应用场景 工具类
(1). 工具类出现的背景
[1]. 许多不同的类都具有功能相同的方法,如下图。这样会造成代码冗余。
需求:想统一不同类中功能相同的方法,做法就是将功能相同的方法封装到一个新的类中。
[2]. 如果使用这样的不同类中相同的功能的函数,十分麻烦。
class Demo1{
//查找给定数组的最大元素
int getMax(int[] arr){
return 0;//内部没有实现,仅仅示例一下
}
}
class Demo2{
//查找给定数组的最大元素
int getMax(int[] arr){
return 0;//内部没有实现,仅仅示例一下
}
}
class Demo3{
//查找给定数组的最大元素
int getMax(int[] arr){
return 0;//内部没有实现,仅仅示例一下
}
}
public class Test {
public static void main(String[] args) {
int[] arr ={12, 3, 4, 456, 7, 567};
new Demo1().getMax(arr);
new Demo2().getMax(arr);
new Demo3().getMax(arr);
}
}
(2). 工具类-----静态重要的应用
[1]. 将多个类中相同功能的函数抽取到一个新定义的类中,独立封装,以便复用。这个新定义的类就称为工具类。
示例:将上面的例子
class ArrayToolDemo{
//查找给定数组的最大元素
int getMax(int[] arr){
return 0;//内部没有实现,仅仅示例一下
}
}
class Demo1{}
class Demo2{}
class Demo3{}
public class Test {
public static void main(String[] args) {
int[] arr ={12, 3, 4, 456, 7, 567};
new ArrayToolDemo().getMax(arr);
}
}
[2]. 从静态化的角度来看,由于工具类中的方法都没有使用到当前方法所属对象的特有数据,所以,应该把工具类中的方法静态化。
举例:
class ArrayToolDemo{
//查找给定数组的最大元素
static int getMax(int[] arr){
return 0;//内部没有实现,仅仅示例一下
}
}
[3]. 方法静态化以后的工具类,构造方法还是能够被调用以建立工具类对象。为了严谨,工具类不应该有对象产生。工具类中的构造方法要私有化。
举例1.
class ArrayToolDemo{
private ArrayToolDemo(){}
//查找给定数组的最大元素
static int getMax(int[] arr){
return 0;//内部没有实现,仅仅示例一下
}
}
public class Test {
public static void main(String[] args) {
int[] arr ={12, 3, 4, 456, 7, 567};
ArrayToolDemo.getMax(arr);
}
}
举例:java.util包中的Collections和Arrays是两个工具类,查看源码发现,两个类的构造方法都已经私有化。
【工具类总结】:方法全部静态化,构造方法全部私有化。
2. 静态代码块
1). 静态代码块概述
(1). 静态代码块的格式
在构造代码块的原有格式之前加上static关键字就把构造代码块变成了静态代码块。
static{
//静态代码块中的执行语句
}
(2). 静态代码块的特点
[1]. 随着类加载而执行。
并且静态代码块仅仅执行一次。用来为类进行初始化。
优先于本类的main执行。
{1}. 为类初始化的含义是什么?
*类被加载进内存的时候,在没有对象的情况下,很有可能需要执行一些动作。这些随着类加载就执行的动作就可以写在静态代码块中。
*如果这些动作写在一个静态方法中,那么只有这个静态方法被调用,相对应的动作才会被执行!!!无法实现随着类加载就执行的功能。
{2}. 为什么优先于本类的main执行?
静态代码块优先于main执行的原因就是:静态代码块没有名字,如果不马上执行就无法再找到。而main方法具有名字,可以被JVM调用。
e.g. 分析输出结果
分析下执行顺序:
>javaStaticDemo之后,这个命令是要运行StaticDemo这个类的main方法。一旦在命令行中调用了这个命令之后,StaticDemo就立刻被加载到内存中。
由于静态代码块优先于本类中的main方法执行,所以再执行main方法之前,先执行StaticDemo中的第一个静态代码块,输出b。
紧接着执行第二个静态代码块,输出c。
这时候执行到main方法,执行main方法中的第一条语句new StaticCode();
此时StaticCode这个类首次使用,立刻被加载到内存中。这个时候,先执行StaticCode类中的静态代码块。输出a
之后,回到StaticDemo中的main方法中输出语句,输出over
**e.g.2 如果将上面的new StaticCode();改为StaticCode s =null; 会执行StaticCode中的静态代码块么?
不会,没有使用到这个类中的成员,是不会被加载到内存的!!!
输出结果 b c over
【类加载到内存的方式】
大原则:只要是提及到这个类名,这个类就立马被加载到内存中。
{1}. Java源文件中,第一次用到了这个类中某个成员的时候,才会将这个类加载到内存!!
***这条规则一定要注意如果没有使用到这个类中的内容,就一定不会加载这个类
StaticCode s =null; 由于这条语句中没有使用到StaticCode这个类中的内容,所以这个类不会被加载到内存中。
new StaticCode(); 这句话使用到了StaticCode中的构造方法,所以会立刻加载到内存中。!!!!
{2}. ****在cmd命令行中,使用“>java类名”或者点击myeclipse中的运行按钮运行源文件的时候,java命令后面跟的类名一定是要立刻进入内存的 -------这种方式最容易被忽略。
[2]. 静态代码块没有名字,不能被调用。
(3). 静态代码块和构造代码块的关系
[1]. 静态代码块:给类初始化,仅执行一次,优先于main执行。
[2]. 构造代码块:给对象进行公有初始化,仅执行一次,优先于指定的构造方法执行。
----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------