Java 中静态和非静态的区别2025年6月23日 | 阅读 9 分钟 在 Java 中,静态(static)和非静态(non-static)成员在它们的存储、访问和使用方式上有所不同。 Java 中的静态成员静态成员指的是类级别的变量或方法,这意味着它们属于类本身,而不是属于从类实例化的任何个别对象。这使得它们可以在类的所有实例之间共享资源。
静态成员示例示例编译并运行输出 解释 StaticInnerClass 是一个静态嵌套类,意味着无需 OuterClass 的实例即可访问它。staticVar 是一个静态变量,在所有实例之间共享。staticMethod() 是一个静态方法,可以使用类名调用。 Java 中的非静态成员非静态成员是类每个实例独有的,因为它们与从类创建的对象相关联。
非静态成员示例示例编译并运行输出 Non-Static Method Called. Variable: 10 解释 NonStaticExample 是一个常规类,意味着需要实例才能使用。nonStaticVar 是一个非静态变量,对每个实例都是唯一的。nonStaticMethod() 是一个非静态方法,必须使用对象调用。 示例:静态和非静态成员示例编译并运行输出 10 Static Method 20 Non-Static Method 静态成员和非静态成员之间的主要区别1. 关联性静态:静态成员(变量和方法)与类本身相关联,而不是与个别实例相关联。 非静态:非静态成员是类每个实例独有的,因为它们与从类创建的对象相关联。 2. 内存分配静态:静态成员仅在类加载时分配一次内存。 非静态:非静态成员为类的每个实例分别分配内存。每个对象都有自己的非静态成员副本。 3. 访问静态:静态成员可以直接使用类名后跟成员名(例如,ClassName.memberName)来访问。它们可以在程序中的任何位置访问。 System.out.println(Math.PI); // 访问 Math 类中的静态常量 非静态:非静态成员使用对象引用后跟成员名(例如,objectReference.memberName)来访问。它们是类特定实例的。 String s = new String("Java"); System.out.println(s.length()); // 使用对象访问非静态方法 4. 初始化静态:静态成员在类加载到内存时进行初始化,通常在程序启动时。初始化只发生一次。 非静态:非静态成员在每次创建类实例时进行初始化,通常使用 new 关键字。每个对象都独立进行初始化。 5. 作用域静态:静态成员具有全局作用域,可以在程序中的任何位置访问,即使没有创建类的实例。 非静态:非静态成员具有局部作用域,只能通过类的实例访问。没有对象就无法访问。 6. 访问成员静态:静态成员只能直接访问同一类中的其他静态成员。它们不能直接访问非静态成员。 非静态:非静态成员可以访问同一类中的静态和非静态成员。它们可以直接访问所有成员。 7. 用途静态:静态成员通常用于实用方法、常量或不属于特定实例的变量。例如,一个包含数学函数的 Math 类。 非静态:非静态成员用于实例特定的行为,因为它们保存每个对象的数据。例如,存储每个对象唯一值的实例变量。 8. 内存效率静态:无论创建多少个实例,静态成员都只占用一次内存。当必须在所有对象之间共享相同数据时,它们可以节省内存。 非静态:非静态成员会消耗更多内存,因为每个对象都带有自己的副本。 9. 对象依赖性静态:静态成员独立于对象;它们属于类,不与任何特定实例绑定。 非静态:非静态成员完全依赖于对象,并且它们的状态因对象而异。 10. 继承行为静态:静态成员会被子类继承,但不能以传统意义上被覆盖。 非静态:非静态成员可以被继承,也可以被覆盖,以便在子类中提供自定义行为。 11. 同步静态:静态方法可以在类级别进行同步,并且也会影响同时访问它们的所有线程。 非静态:非静态方法可以针对每个对象进行同步,从而对线程访问对象数据进行精细控制。 12. 覆盖和隐藏静态:静态方法是方法隐藏(hiding)而不是方法重写(overriding)的对象。这是因为它们是在编译时绑定的,而不是在运行时。 非静态:非静态方法通过方法重写支持真正的运行时多态。 13. 引用静态:可以直接通过类名引用静态成员,无需创建对象。 非静态:必须通过对象引用来引用非静态成员,否则会发生编译错误。 14. 序列化影响静态:序列化对象时不会序列化静态变量,因为它们属于类,而不是对象。 非静态:非静态变量会被序列化,因为它们是对象当前状态的一部分。 15. 最佳实践用法静态:当行为对于所有实例来说是通用且相同的,例如实用方法(Collections.sort())时,应使用静态成员。 非静态:当需要每个对象都有不同行为/数据时,应使用非静态成员,例如 Employee 的薪水或 Student 的分数。 16. 修改影响静态:更改静态成员的值会影响所有对象,因为它们共享相同的内存地址。 非静态:更改非静态成员的值只会影响该特定对象。 17. 执行顺序静态:静态块在类加载时首先执行,甚至在构造函数或任何对象创建之前。 非静态:非静态块和变量在创建每个新对象时进行初始化,位于静态块之后。 18. 现实生活中的例子静态:将静态成员视为国家法律——它们对每个人都通用,无论您住在哪个城市。 非静态:非静态成员就像当地的城市规定——它们根据地点(或对象)而变化。 19. 接口中的支持静态:Java 8 及更高版本允许在接口中使用静态方法,但实现类无法覆盖它们。 非静态:非静态方法(抽象方法)是接口中传统的需要类实现的方法。 20. 对设计模式的影响静态:静态方法常用于单例(Singleton)、工具类(Utility classes)和工厂方法(Factory methods)等模式,以实现全局访问。 非静态:非静态成员广泛用于面向对象设计模式,如策略模式(Strategy)、观察者模式(Observer)和装饰器模式(Decorator),这些模式中对象的状态很重要。 下表总结了上述主要区别。
Java 静态和非静态选择题1. 如果我们尝试从静态上下文访问非静态方法会发生什么?
答案:c) 解释:静态上下文(如 main 方法)不能直接访问非静态成员,因为非静态成员需要类的实例。 2. 以下哪些可以声明为 static?
答案:b) 解释:方法和变量可以声明为 static。构造函数和局部变量不能声明为 static。 3. 关于 Java 中的静态方法,以下哪项是正确的?
答案: d) 解释:静态方法属于类,而不是任何对象。因此,可以使用类名在不创建实例的情况下调用它们。它们不能使用 this,因为 this 指的是当前对象,而在静态上下文中不存在。 4. 关于静态变量,以下哪个陈述是正确的?
答案: a) 解释:静态变量是类级别的变量,意味着类的所有实例都共享该变量的相同内存位置。 5. 在静态上下文中不允许什么?
答案: d) 解释:this 指的是当前对象,在静态上下文中不存在。 |
问题陈述 编写一个 Java 程序,确定网格数字序列是否构成等比数列(GP)。等比数列定义为:除了第一个数之外,每个后续数都是通过将前一个数乘以一个常数得到的。程序应:...
阅读 6 分钟
在本节中,我们将了解矩阵中的鞍点是什么,以及如何通过 Java 程序找到矩阵的鞍点。矩阵中的鞍点是什么?在矩阵中,一个元素被称为鞍点,它是...
阅读 3 分钟
Java 是一种通用的编程语言,拥有一套丰富的特性,可满足各种编程需求。从简单的应用程序到复杂的系统,Java 提供了许多工具和技术来处理各种编程挑战。其中一些棘手的程序是...
阅读9分钟
? 我们可以使用带范围的下界和上界的条件语句来检查 Java 中是否存在范围内的整数。要检查整数是否存在于某个范围内,我们可以按照以下步骤进行:定义范围(开始和结束)值。比较整数...
阅读 6 分钟
在 Java 中,set 是 java.util 包中的一个接口。Set 接口扩展了 Collection 接口。一个无序的集合或列表,其中不允许重复,被称为 Collection 接口。Set 接口用于创建...
阅读 15 分钟
在上一节中,我们讨论了 Java 中的不同模式程序。在本节中,我们将创建用于锯齿星形和数字模式的 Java 程序。打印锯齿数字模式的步骤:先打印一个反斜杠,然后打印一个正斜杠,然后继续。输入总字符数...
7 分钟阅读
如何在 Java 中获取字符串输入 Java Line() 方法 Scanner 类的 Line() 方法用于从用户那里获取字符串。它定义在 java.util.Scanner 类中。Line() 方法读取文本直到行尾。读取该行后,...
阅读 2 分钟
Java 的多线程功能是一种有效的工具,可以通过允许多个线程同时运行来提高程序性能和资源利用率。线程层级的概念为管理并发工作提供了有组织的方法,是 Java 线程模型的基础。本节...
5 分钟阅读
查找最小后缀翻转的问题涉及处理两个二进制字符串:初始字符串 s 和目标字符串 target。在这里,两个字符串的长度都为 n,并且初始字符串 s 是一个全零字符串(即,s = "000....
阅读 12 分钟
在Java中,可以使用if-else语句与三元运算符这两种机制来处理决策逻辑。三元运算符(?:)作为一个简洁的表达式解决方案,可以降低代码中条件语句的复杂性。处理多个条件需要不同的解决方案...
5 分钟阅读
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India