在某些背景下,我目前在本书的第8章,我们已经完成了关于数组列表,数组,if语句,循环等的讨论。现在,本书的这一部分讨论按引用调用,值和其他一些看起来很整洁的东西。一开始对我来说很奇怪。我已经阅读了使用静态和其他一些SO问题的情况,并且学到了很多东西。

考虑我的书给的以下示例(许多示例中)

There is another reason why static methods are sometimes necessary. If

a method manipulates a class that you do not own, you cannot add it to

that class. Consider a method that computes the area of a rectangle.

The Rectangle class in the standard library has no such feature, and

we cannot modify that class. A static method solves this problem:

public class Geometry

{

public static double area(Rectangle rect)

{

return rect.getWidth() * rect.getHeight();

}

// More geometry methods can be added here.

}

Now we can tell you why the main method is static. When the program

starts, there aren’t any objects. Therefore, the first method in the

program must be a static method.

好的,那很酷,到目前为止,我只是一直盲目地将public放在我所有方法的前面,所以这很高兴。但是下一页的评论小问题引起了我的注意

The following method computes the average of an array list of numbers:

public static double average(ArrayList values)

Why must it be a static method?

在这里,我想等一下。我很确定我以前没有使用static来做到这一点。所以我再次尝试这样做,很容易想到以下内容

import java.util.ArrayList;

class ArrList

{

private double sum;

public ArrList()

{

sum = 0;

}

public double average(ArrayList values)

{

for(int i = 0; i < values.size() ; i++)

{

sum+=values.get(i);

}

return sum / values.size();

}

}

public class Average

{

public static void main(String [] args)

{

ArrList arrListObj = new ArrList();

ArrayList testArrList = new ArrayList();

testArrList.add(10.0);

testArrList.add(50.0);

testArrList.add(20.0);

testArrList.add(20.0);

System.out.println(arrListObj.average(testArrList));

}

}

TLDR

为什么我的书说public static double average(ArrayListvalues)必须是静态的?

尝试使用静态

public class Average

{

public static void main(String [] args)

{

ArrayList testArrList = new ArrayList();

ArrayList testArrListTwo = new ArrayList();

testArrList.add(10.0);

testArrList.add(50.0);

testArrList.add(20.0);

testArrList.add(20.0);

testArrListTwo.add(20.0);

testArrListTwo.add(20.0);

testArrListTwo.add(20.0);

System.out.println(ArrList.average(testArrList));

System.out.println(ArrList.average(testArrListTwo)); // we don't get 20, we get 53.3333!

}

}

您从未真正"需要" static。但是没有真正的理由不使用它,因为它避免了创建ArrList的实例。另外,如果尝试使用相同的ArrList实例来计算多个平均值,则实现将中断。

需求是一个很强的词,但我认为应该是

您的ArrList示例没有任何意义。它有一个仅在构造函数中初始化的实例变量,在同一实例上多次调用您的方法将导致垃圾回收。

@NathanHughes,你能扩大吗?不太确定你的意思对不起

@cresjoy:对两个不同的ArrayList使用两次您的average方法,然后看看会发生什么。

@cressjoy如果将列表(例如[10,15,20])添加到对象并计算平均值,则它会正确吐出15.使用相同的对象,如果添加另一个列表(例如[1,2,3]),则arrListObject.average([1,2,3])不会吐出由于先前的状态,预期值为2-相反,您将获得17。

那么静态如何解决这个问题@Kevin,我明白您的意思了吗?

@cresjoy:static本身并不能解决该问题。消除方法(实例变量)外部状态的依赖性解决了该问题。一旦方法外部没有任何状态,如果在语义上使其成为这样,则它可能是static方法的潜在候选者。

我懂了。我在新的编辑中将所有内容都更改为静态,但是新的平均值不是应该的,@ Kevin提示的问题是否相同?

您是否仍将总和存储为静态变量?您旧的实现的问题是sum从未被重置过

@cresjoy:听起来好像您撒在static关键字上并希望发生魔术,但实际上并没有解决在方法之外存储状态的问题。

是的,我忘记将总和重置为零。但是,如果我将总和重置为零,并删除静态值,则像您所说的那样,新的平均值仍会搞砸。!哇,没想到,现在我终于明白了你的意思

可以肯定地说,在这种情况下,static或多或少是技术问题和良好的编码实践的问题,而不是static的实际功能,而本身不是什么?

诸如area,average之类的静态方法通常是实用程序函数。您不需要任何对象即可使用实用程序功能。例如,考虑Math.pow,您无需实例化任何对象即可使用幂函数,只需使用Math.pow(10.0, 2.0)即可获取(10.0)^2

简而言之 :

静态方法表示类方法,不需要调用该对象的实例。

而average方法是实例方法,则需要一个对象来调用该方法。

没有。

唯一需要为static的方法是初始main()方法。程序员决定什么在您的设计中有意义,什么都取决于您。

static与public访问器无关(正如您所暗示),它与正在执行的技术操作无关。它与操作的语义以及保存该操作的类有关。

在类的特定实例上存在一个实例(非static)方法。从语义上讲,它应该执行与该特定实例相关的操作。 static方法通常存在于类中,并且更具概念性。它对特定实例不做任何事情(除非它当然提供了某个方法的实例作为方法参数)。

因此,您实际上只需要问自己有关操作语义的问题。您是否需要对象的new实例来执行操作?还是应该在没有实例的情况下进行该操作?这取决于操作,对象表示什么等等。

我想我的教科书的意思是"根据答案,强烈建议为什么这种方法是静态的"。我不太了解,在第一个示例中我们将其设置为静态是因为Rectangle库没有区域功能。这是同一主意吗?由于没有内置的平均值方法,我们将其设为静态吗?

@cresjoy:似乎是相同的概念原因,是的。这些操作可以通过多种方式进行组织,而不仅仅是static与实例。

嗯,我觉得我现在正在做的所有练习都涉及对数组列表执行一些操作(例如获取总和,然后执行某些操作等),这是否意味着我应该使我的所有方法从以前变为静态?

@cresjoy:我不知道,也许吗?最好的答案是,"如果有道理,那就是。"对于何时应该为static,没有通用的规则。您构建的内容的语义可能非常主观。有一堆static方法可能很有意义。拥有某种带有实例级状态并执行操作的对象可能是有意义的。等等。

好。这些东西肯定看起来很冗长和复杂:/谢谢

如果不是static,则任何其他想要使用此方法的类都必须首先创建此对象的实例。

从其他班级:

Average.average(new ArrayList()); // legal only if static

new Average().average(new ArrayList()); // necessary if not static

// and only makes sense if Average can be instantiated in the first place

使其成为实例变量(即非静态变量)是合法的,但是该方法实际上很难理解。如果它是static,则无论谁读取代码,都知道它不使用该类的任何成员变量。

// In the class body

int x = 0; // member variable

public static double average() {

x = x + 1; // illegal

}

某事可以做的越少,就越容易理解它的作用。

好像过去的香港专业教育学院使一切都公开了,因为我真的不知道static是做什么的。看起来一切都最好保持静态。那我应该把静态方法放在大多数方法上吗?似乎"更轻松"

java为什么是静态的_为什么此方法必须是静态的(Java)?相关推荐

  1. java编程控制电脑硬件_如何快速学习AP计算机中的Java编程?

    AP Computer Science A (APCSA)考试,需要掌握Java编程语言.对于刚学习Java的同学,都应该了解Java编程语言的知识体系结构. 多编程零基础的高中生,在自学一段时间内, ...

  2. java.线程池 线程数_如何在线程“ main”中修复异常java.lang.NoClassDefFoundError:Java中的org / slf4j / LoggerFactory...

    java.线程池 线程数 此错误表示您的代码或您在应用程序中使用的任何外部库都在使用SLF4J库 (一个开放源代码日志记录库),但无法找到所需的JAR文件,例如slf4j-api-1.7.2.jar因 ...

  3. java二级考试真题_计算机等级考试真题2(JAVA)

    1. D (A)类属于JAVA语言的引用数据类型. (B)接口属于JAVA语言的引用数据类型. (C)数组属于JAVA语言的引用数据类型. (D)double不属于JAVA语言的引用数据类型. 2. ...

  4. 64.多态性实现机制—静态分派与动态分派(方法解析、静态分派、动态分派、单分派和多分派)

    64.多态性实现机制-静态分派与动态分派 64.1.方法解析 64.2.静态分派 64.3.动态分派 64.4.单分派和多分派 64.多态性实现机制--静态分派与动态分派 64.1.方法解析 Clas ...

  5. java 修改 枚举类字段_枚举枚举和修改“最终静态”字段的方法

    java 修改 枚举类字段 在本新闻通讯中,该新闻通讯最初发表在Java专家的新闻通讯第161期中,我们研究了如何使用sun.reflect包中的反射类在Sun JDK中创建枚举实例. 显然,这仅适用 ...

  6. JAVA 判断简单密码算法_十道简单算法题二【Java实现】

    前言 清明不小心就拖了两天没更了-- 这是十道算法题的第二篇了-上一篇回顾:十道简单算法题 最近在回顾以前使用C写过的数据结构和算法的东西,发现自己的算法和数据结构是真的薄弱,现在用Java改写一下, ...

  7. java项目怎样提高性能_从代码的角度谈如何优化JAVA代码以提高性能【初、中级程序员必看】...

    最近复习Java基础感触颇深,同样是几行代码,别人写的运行效率就很大,自己写的就不是那么随意,这就牵扯到代码的性能优化问题,这个问题在初级阶段往往没有引起太多的重视,导致后来的工作中就没有往优化这个角 ...

  8. java 多态判断非空_跳槽涨薪季面试题之java基础(一)

    点击上方[全栈开发者社区]→右上角[...]→[设为星标⭐] 为迎接金九银十跳槽涨薪季,小编汇总了java精编版面试题,大概从java基础.java8特性.多线程.spring.springboot. ...

  9. 数据结构java实验 刘小晶_《数据结构实例解析与实验指导——Java语言描述》刘小晶著【摘要 书评 在线阅读】-苏宁易购图书...

    商品参数 作者: 刘小晶著 出版社:清华大学出版社 出版时间:2013-2-1 版次:1 印次:1 印刷时间:2013-2-1 字数:619000 页数:380 开本:16开 装帧:平装 ISBN:9 ...

  10. java判断ftp是否连接_校验FTP是否能正常连接的Java类

    展开全部 先写一个异常类,如果FTP的用户名或者密码不正确e68a8462616964757a686964616f31333337623465就通过这个异常类抛出异常,代码如下:FTPExceptio ...

最新文章

  1. (DBA之路【五】)关于锁的故事
  2. ParameterizedType应用,java反射,获取参数化类型的class实例
  3. vCloud Automation Center (vCAC) 6.0 (一)
  4. 码农人生——从未学过Android如何开发Android App 案例讲解-第002期案例
  5. graph 关系图 设置
  6. Android UI开发第二篇——多级列表(ExpandableListView)
  7. ​网络 IO 演变发展过程和模型介绍
  8. Linux-Android启动之Init进程前传
  9. html语义化有哪些优点,语义化的HTML结构到底有什么好处?
  10. 使用sqlyog创建数据库
  11. 杭电5620 KK's Steel
  12. MVC3基础嵌套总结
  13. Vue安装 devTool 时报错的解决办法
  14. Qt + 运动控制 (固高运动控制卡)【2】运动控制卡初始化和关闭
  15. 第四届“传智杯”全国大学生IT技能大赛(练习赛)【完结】
  16. 虚拟麦克风音频输入_收音和录音一次性解决了,这个机顶麦克风可以录音?
  17. 四大金融资产管理公司的起起伏伏
  18. LeetCode 1429. First Unique Number
  19. short java_java基本数据类型short的使用(23)
  20. 文化袁探索专栏——事件分发机制

热门文章

  1. java解方程_JAVA解N元一次方程组(矩阵) | 学步园
  2. Transformer最新综述
  3. 形容等待时间长的句子_形容等待很久的句子
  4. 淘宝返利微信公众号怎么使用微信返利机器人查淘宝优惠券及淘宝购物返利?
  5. 《站在巨人的肩膀上-英语交流会有感》
  6. ico在线制作,网站小图标Favicion.ico在线制作工具软件
  7. 小程序滑动窗口的实现,固定第一列和第一行
  8. Open Yale course:Listening to Music
  9. 计算机cpu架构是什么意思,「电脑小白必备」一分钟快速了解CPU
  10. 免费在线语音识别成文字