51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 1071|回复: 0
打印 上一主题 下一主题

[资料] Static 方法在Java中如何更好的使用?

[复制链接]
  • TA的每日心情
    擦汗
    昨天 09:04
  • 签到天数: 1047 天

    连续签到: 5 天

    [LV.10]测试总司令

    跳转到指定楼层
    1#
    发表于 2022-8-11 10:41:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    前阵子在知乎上看到这个问题,一开始觉得还挺无厘头的,但细细一想却发觉这里面很考验对语言的理解。于是写下了我的理解,今天把回答搬运到这里,与大家一起分享。
      这个问题看起来有点无厘头,但仔细想想却非常考验答主对 Java 这门语言的理解。如果没有什么 Java 开发经验,那估计是想不出所以然来的。作为一个工作了 8 年,写了 12 年 Java 代码的研发老兵,我来简单聊聊这个问题。
      题目说的是为什么不全部使用 static 方法?
      我们尝试着想想:如果全部用 static 方法,世界会是怎样?
      举个简单的例子,我们有一个汽车相关的程序,每种不同的汽车的喇叭声音不一样。那如果全部用 static 方法来实现,那么结果是这样的:
    1. public class Car {
    2.       public static String benzBee(){
    3.           //奔驰的喇叭声
    4.       }
    5.       public static String bydBee(){
    6.           //比亚迪的喇叭声
    7.       }
    8.       // 其他汽车的喇叭声
    9.   }
    复制代码
    如上面所示,每当有一个汽车的时候,我们都需要新增一个方法,来表示这种汽车的喇叭声。如果我们要实现启动汽车这个逻辑,在所有方法都用 static 来实现的情况下,其整体逻辑为:

    1.  public class StartCar {
    2.       // 1. 插入钥匙
    3.       public static void enterKey(){
    4.           
    5.       }
    6.      // 2. 通电启动
    7.       public static void start(){
    8.           
    9.       }
    10.      // 3. 放刹车
    11.       public static void releaseBrake(){
    12.           
    13.       }
    14.       // 4. 踩油门
    15.       public static void stepGas(){
    16.           
    17.       }
    18.       public static void main(){
    19.           enterKey();
    20.           start();
    21.           releaseBrake();
    22.           stepGas();
    23.       }
    24.   }
    复制代码
    这样貌似也是可以实现的,但不知道你有没有发现,这样其实就是一种「面向过程」的编程方式了。所谓面向过程的编程方式,指的是以事件为中心的编程方式,编程的时候把解决问题的步骤分析出来,然后用函数把这些步骤实现,在一步一步的具体步骤中再按顺序调用函数。


    如果你有使用过其他脚本语言的话,你会发现我们在写脚本的时候,都是用这种「面向过程」的编程方式写的。首先,我们做啥,接着做啥,最后做啥。
      「面向过程」这种编程方式,有两个优点:
      ·流程化使得编程任务明确,在开发之前基本考虑了实现方式和最终结果,具体步骤清楚,便于节点分析。
      · 效率高,面向过程强调代码的短小精悍,善于结合数据结构来开发高效率的程序。
      但是它也有缺点:需要深入的思考,耗费精力,代码重用性低,扩展能力差,后期维护难度比较大。但 Java 是面向对象的语言,其设计之初就是用来以「面相对象」的编程方式写代码的。
      所以如果你要问:Java 中的方法是否可以全部使用 static 方法?答案是:可以,但是没必要,或者说不合适。因为 Java 就是为面向对象而生,全部用 static 方法写不符合「面向对象」的编程方式。
      那么什么是面向对象呢?
      世界上有很多人和事物,每一个都可以看做一个对象,而每个对象都有自己的属性和行为,对象与对象之间通过方法来交互。面向对象是一种以「对象」为中心的编程思想,把要解决的问题分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个对象在整个解决问题的步骤中的属性和行为。

    例如对于启动汽车这件事情,以面向对象的方式去编写,那么就会有汽车、轮胎、发动机、钥匙等对象,然后对象之间有对应的属性,然后有对应的动作。
      面向对象的优点是:
      · 结构清晰,程序是模块化和结构化,更加符合人类的思维方式。
      · 易扩展,代码重用率高,可继承,可覆盖,可以设计出低耦合的系统。
      · 易维护,系统低耦合的特点有利于减少程序的后期维护工作量。
      面向对象的缺点是:
      · 开销大,当要修改对象内部时,对象的属性不允许外部直接存取,所以要增加许多没有其他意义、只负责读或写的行为。这会为编程工作增加负担,增加运行开销,并且使程序显得臃肿。
      · 性能低,由于面向更高的逻辑抽象层,使得面向对象在实现的时候,不得不做出性能上面的牺牲,计算时间和空间存储大小都开销很大。
      那么什么时候用面向对象,什么时候用面向过程呢?
      在日常生活或编程中,简单的问题可以用面向过程的思路来解决,直接有效。但是当问题的规模变得更大时,用面向过程的思想是远远不够的。所以慢慢就出现了面向对象的编程思想。
      最后我们总结一下:在 Java 中不全部用 static 方法,主要原因是这种编程方式,不符合「面向对象」的编程思路,而是一种「面向过程」的编程思路,而 Java 是为面向对象而生的语言。因此,在 Java 语言中这么做,就像去用铁铲子去舀汤 —— 可以是可以,但就是费劲。
      而面向对象,在非常复杂的系统面前,还是非常有价值的。大家都知道,很多电商系统基本都用 Java 开发,这也体现出了面向对象思维的重要性。



    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有帐号?(注-册)加入51Testing

    x
    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-11-16 10:14 , Processed in 0.067870 second(s), 24 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表