【发布时间】:2011-08-17 14:28:49
【问题描述】:
为什么我需要一个需要实例的方法?为什么我不让我的所有方法都是静态的?
【问题讨论】:
-
鉴于问题的简洁性,我可以在一定程度上合理化总体否决投票。我无法合理化的是一个与新程序员非常相关的问题的否决票。诚然,这个问题本来可以问得更好一些,但我认为这最终不值得 5 票反对。
标签: static-methods
为什么我需要一个需要实例的方法?为什么我不让我的所有方法都是静态的?
【问题讨论】:
标签: static-methods
为什么您不想要程序中任何位置的任何状态?
如果没有 String 实例,并且 String 上的所有内容都是静态的,你能想象吗?你将如何表示两个不同的字符序列?现在将相同的逻辑应用于其他代码。
从根本上说,OO 语言是围绕具有状态的对象的概念构建的:Book 的一个实例与Book 的另一个实例不同——每个Book 实例都封装了它的名称、作者、发布日期等. 你将如何只使用静态方法而不是实例来建模?
当然,您可以将所有方法设为静态,并在需要使用状态的每个调用中将Book 作为第一个参数传递in。在幕后,类似的事情已经在发生……除了你失去了多态性,所以接口、抽象类等都是无用的。不好。
【讨论】:
因为对象是状态和行为一起,封装在一个组件中。
如果您有单独的实例,这意味着它们每个都可以拥有因实例而异的私有数据。
静态数据和方法在类级别共享。单个实例不能有不同的静态数据。
【讨论】:
静态方法不能直接访问对象中的成员变量——它们只能访问静态变量。
如果你有一个汽车类和一个像整数这样的静态数据成员,你就只能拥有一辆汽车,因为你不能创建多个汽车实例并获得该变量的多个实例 - 你只会拥有单个静态的。
每辆车不能有相同的车牌号,因此每辆车都需要自己的车牌变量。
类中使用该变量的方法需要是非静态的才能直接使用它。
【讨论】:
使用“Car”类的示例,您可能有一个名为“startCar()”的方法。显然,您希望此方法仅与汽车的特定“实例”交互,而不是对所有汽车都是全局的。 Java 中的示例:
public class Car {
public void startCar() {
// code to start car
}
}
public class MyProgram {
public static void main(String[] Args) {
Car myFord = new Car();
Car myOpel = new Car();
myCar.startCar; // starts the Car "myCar" and leaves "myOpel" alone
}
}
同样值得注意的是,静态方法可能不会使用定义它们的类的实例变量。
【讨论】: