黑马程序员--03.Java面向对象--03.【工具类】【静态代码块】

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学习型技术博客、期待与您交流! ------------

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值