为什么我们不能让所有方法和变量保持静态,以避免制造对象的麻烦?
自从我很久以前开始学习Java以来,我确实遇到过这个问题,但从未问过它。我知道如果方法或变量不是静态的,您可以使用您创建的对象来调用它:
public class classwithmethodandvariable {
int i = 7;
public void hello() {
}
}
您可以这样称呼:
public class myMainClass {
classwithmethodandvariable obj = new classwithmethodandvariable();
classwithmethodandvariable.i++; // ACCESS INT I AND INCREMENT
classwithmethodandvariable.hello(); // CALLS METHOD HELLO
}
但是,如果我们使用方法hello()
和变量i
,我们可以用更少的代码行完成所有工作,对吗?
public class classwithmethodandvariable {
static int i = 7;
public static void hello() {
}
}
您可以这样称呼:
public class myMainClass {
classwithmethodandvariable.i++; // ACCESS INT I AND INCREMENT
classwithmethodandvariable.hello(); // CALLS METHOD HELLO
}
为什么我们不这样做?我已经看过这样的another question,但答案是“因为你无法从静态方法中访问实例变量”。但那么如果你将变量设为static
呢?
答案 0 :(得分:4)
面向对象编程旨在隐藏对象中的状态,然后提供修改状态的方法(也就是行为)。
这是一个非常简单的想法,但当与继承,接口和其他常见设计模式结合使用时,可以构建一个非常易于维护的系统。
仅使用静态方法可以防止许多这些设计模式工作,因此您将牺牲系统的可维护性和可扩展性。
答案 1 :(得分:2)
为什么我们不能让所有方法和变量都是静态的,以避免制造对象的麻烦?
你可以。如果你真的想要,没有什么可以阻止你 1,2 。
但是,这不是Java的设计方式。而且你会发现随着代码库变大,你的代码库越来越难以测试和维护(与OO代码相比)。而且,如果要求他们阅读您的代码,您还会发现其他Java开发人员可能会逃避尖叫。
如果你真的无法理解OO,和/或你不能接受OO的好处超过了“制作物品的麻烦”,那么你最好还是使用另一种语言。选择一个非OO(如C,老式BASIC)或更有利于非OO编程(C ++,如C,Python,Perl等)。
1 - “此外,一位坚定的真正的程序员可以用任何语言编写FORTRAN。”是“Real Programmers don't use Pascal。”
中最好的一行2 - 实际上,只有在创建和使用自定义类时,才能有效地使用某些Java API。
答案 2 :(得分:0)
将cookie(您烘焙的那种)想象成一个对象。现在把饼干切割器想成一个类。正如cookie切割器用于制作cookie一样,类也用于制作对象(通过实例化,通常由名为 new 的运算符)。对象是类的实例。"对象不是类。不要混淆两者。对象是类的实例。建筑物是蓝色印刷品的实例,饼干是曲奇饼干的实例。一个类是一组"指令"用于制作物品。您可以使用静态将自己的信息添加到类中。就像制作对象的说明一样,类中只有一个静态。如果你只需要一个类的一个实例,你可以使所有变量都是静态的(这是有效的,但不建议 - 有更好的方法)。如果你需要一个类的多个实例,比如一组相同的对象(一篮子小猫)或相关对象(一篮子哺乳动物,包括小猫和小狗),那么,一般来说,你不想要将变量定义为静态(例如,每个动物都有自己的出生日期,名称,描述,重量等)。您定义为static的任何内容只存在一次,并且对所有实例化的类都是通用的。如果该类的任何一个实例更改了静态值,则该类的所有实例都会看到该更改。
我建议你阅读一本关于面向对象编程的好书。这是一个很好的:
James Rumbaugh,Michael Blaha,William Premerlani,Frecerick Eddy和William Lorensen的面向对象建模与设计。