美文网首页软件测试程序员
Selenium Web Driver自动化测试(java版)系

Selenium Web Driver自动化测试(java版)系

作者: 马可吃菠萝 | 来源:发表于2018-08-02 21:05 被阅读0次

上两篇讨论方法的时候我们说了两个例子:一个是咪蒙要去写篇文章,再一个就是王思聪要去计算他打了多少怪,俩人都在干自己的活。那如果他俩要合作做点什么事呢?比如现在王思聪给咪蒙打了个电话,说咪蒙咱俩合作干点什么吧,我开个联合账户,咱俩同时往里注资行不行?咪蒙说没问题呀。于是这个联合账户里有王思聪和咪蒙俩人的钱,并且双方都能看到。很明显,联合账户是一个方法,只不过里面的结果需要被两个对象共享。演示一下,新建一个叫Test.java的文件,把下面代码拷进去:

jointAccount(int money)这个方法就是设置共同账户的函数,里面有个整型参数接收打入的钱。变量total指的是总共的余额,按理说每次打入多少钱就在总额上加多少钱。执行程序:

打印出来一看,哟,不对啊。这是个共同账户,咪蒙把钱打进去后就应该变成900了,对不对?现在出来的结果跟他俩单独的账户没什么差别呀?更可怕的是,单独的账号也不对。如果现在我写wsc.jointAccount(1000), 我会发现打印出来是1000。诶?之前王思聪打进去的600块钱去哪儿了呢?莫名其妙不见了?那王思聪还不骂人?换我我也骂。那怎么解决这个问题呢?这就需要引入一个新的概念 – 静态变量和静态方法。现在我在int total前面加上一个关键字static,static的英文是“静态的”:

然后咱们再运行一下程序,发现打印出了600和900:

证明什么呢?第一次调用total没什么疑问,total变成了600。而当咪蒙这个对象调用的时候呢?是不是用300加上原来的600得到这个900的?也就是说是不是第一次王思聪的对象调用后,总金额total被存住了?这就得益于这个static关键字。因为这个关键字,total变成了一个静态变量。再看一遍它的声明格式:

前面加上static关键字就变成了静态变量。我们知道,假如total不是静态变量的话,王思聪和咪蒙各自有一个total成员变量。内存图是这样的:

可一旦total变成了静态的,这个变量就被两个对象共享了,每一次对它进行的访问和修改都是根据之前修改的基础上得来的,所以对于每个对象来说这个值随时都一样。这就好像每个对象的total字段之间有一个无形的绳子把它们连起来了,一个改变,全都改变:

与total不同,name、age、hobby都没有static关键字。为了区分,我们管它们叫作实例变量。这么一来就清楚了,我们一开始介绍了成员变量,成员变量又分为实例变量和静态变量。实例变量不能被所有对象共享,每个对象都有一个拷贝;而静态变量被所有对象共享。

除了静态变量,还有静态方法。静态方法的格式是

同样,在返回类型前加一个static关键字。我们的程序入口函数public static void main(String[] args)就是个典型的例子。注意,刚才那个例子里代表联名账户的那个方法jointAccount不是静态的,但它却访问了静态变量total对吧?所以一般方法,也就是非静态方法可以同时访问静态变量和实例变量。那静态方法说我也想这样,对不起,不行,静态方法只能访问静态变量。我们把jointAccount方法改成静态的,然后随便访问一下非静态变量,比如王思聪不想奔三,把他年龄改成29吧。发现还真改不了:

静态方法只能访问静态变量。那有人问了,既然一般方法啥都可以做,干嘛还设计个静态方法呀?咱们再往下看。我再把程序改回来,还让jointAccount负责联合账户。然后把wsc.jointAccount(600)改成Wanghong.jointAccount(600),你没看错,我让类名调用静态方法:

执行结果:

诶,还是能通过!很神奇,我不用对象调用方法,而是直接用类名调用方法就可以,这是静态方法的一个优点。对于非静态方法不行,你必须实例化对象。同样,咪蒙这个也可以改成Wanghong.jointAcount(300)。明白了么?方法是静态的就可以用类名调用。所以,大概猜到程序入口函数main是怎样开始执行程序的了吧?就是用类名.main(String[] args)同时传参数的方式,参数就从命令行里取。

同样,静态变量也可以用类名直接访问。方法就是Wanghong.total:

为什么可以这么做呢?因为刚才我说过,静态变量是被所有对象共享的,所有对象又都属于同一个类,所以java设计者就给了大家一个捷径,直接用类名来访问。有些人问了,我们的程序中有Wanghong和Test两个类,你不是说用类名调用就可以吗?Test也是类名,还是主类呢。那不行,total和jointAccount都是Wanghong类的成员,是谁的成员才能被谁直接调用。

以上就是静态变量和静态方法,最后再完善一下类的成员图:

这篇文章的源代码是Static项目

本篇知识点及注意事项:
1. 一个类中的成员变量可分为实例变量和静态变量。实例变量不能被所有对象共享,每个对象都有一个拷贝;而静态变量被所有对象共享。
2. 非静态方法可以同时访问静态变量和实例变量;静态方法只能访问静态变量。
3. 静态方法或变量可以用类名直接调用,非静态方法或实例变量需要实例化。

相关文章

网友评论

    本文标题:Selenium Web Driver自动化测试(java版)系

    本文链接:https://www.haomeiwen.com/subject/ynzsvftx.html