java调用同一个类中的方法为啥要将方法申明成静态?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java调用同一个类中的方法为啥要将方法申明成静态?相关的知识,希望对你有一定的参考价值。

那是因为你调用的“主方法”是静态的,那么“被调用的方法”也就需要时静态的,想要深入了解原因,你需要知道java的编译过程。静态方法的代码在项目启动的时候就被初始化,那么,你“主方法”是静态的,项目启动时需要初始化,“被调用的方法”当然也必须是静态的,因为在“主方法”初始化的时候需要调用到“被调用的方法”,否则就无法找到“被调用方法”而导致编译失败。
如果你在非静态的方法去调用其他的方法,那么”被调用的方法“就不需要是静态的了。
参考技术A 你好!
在静态方法中调用本类中的其他方法,则其他方法也必须申明成静态的。
估计你是在main方法中调用的其他方法吧?main方法是静态的
你可以简单的记成:静态方法是在类加载的时候加载到内存中的
,而普通的是在创建对象时才进入内存的,而程序运行时类加载是在创建对象前的,所以如果用静态方法去调用其他方法,则会出现其他方法还未被加载入内存的情况
希望对你有所帮助,望采纳。
参考技术B 静态static是使整个方法变成全局的方法,在任何地方都可以调用,而调用方式就是类名点方法。如果想调用普通的放法话,只需要将要调用的类创建实例,之后才可以调用该类中的方法。
不知道我这么说你懂不懂。
举个小例子吧
public
class
Test
public
void
go()

public
static
void
come()

public
static
void
main(String[]
args)
//想调用非静态go方法,必须实例化test类
Test
t
=
new
Test();
t.go();
//调用静态的come方法,可以直接类名点方法调用
Test.come();

C++ 静态方法(在不同的类中)(如 Java 的)

【中文标题】C++ 静态方法(在不同的类中)(如 Java 的)【英文标题】:C++ Static Methods (In different Classes) (Like Java's) 【发布时间】:2012-03-07 01:04:40 【问题描述】:

当我有多个 .cpp 文件时,我将如何制作像 java 中的静态方法一样使用的静态方法?

在 java 中,您可以使用 MyClass name = new MyClass(); 来引用另一个类。当在您拥有的任何其他文件中调用时,此类中的每个变量都将相同。

在你想在其中使用该类的每个函数中,必须能够通过引用 MyClass& 名称来传递我似乎很痛苦。

有没有办法在 .cpp 文件的顶部定义 MyClass 名称,而不会在内存中创建该对象的全新实例并擦除所有进度,例如,如果您尝试制作一个简单的计数器,主类会告诉计数类递增,可见性类会从计数类获取计数并将其打印到屏幕上。现在这很简单,因为您可以将计数类传递给可见性,但是如果您有 20 多个方法,那么很难跟踪。

我对静态或引用不太熟悉,我环顾四周并看到了“命名空间”,但我不确定我会在哪里定义它,或者它是否是我什至需要的。

提前致谢

示例 Java 代码:

public class Foo
private static int counter = 0;

public int getCounter()
    return counter;


public void incrCounter()
    counter+=1;



public class MainProg
public static void main(String[] args)
    Foo foo = new Foo();
    Display disp = new Display();
    foo.incrCounter();
    foo.incrCounter();
    disp.displayCounter();



public class Display
Foo foo = new Foo();
public void displayCounter()
    foo.incrCounter();
    System.out.println(foo.getCounter());


这应该打印出“3”

【问题讨论】:

the book you're learning C++ from 说什么? 我想你会使用一个头文件。默认情况下,所有方法在 C++ 中都是“静态的”,除非它们包含在对象中。每个类不代表一个对象,但可以包含多个对象或零个对象。 我的类已经在使用头文件和 .cpp 文件,但我试图避免不断地绕过对象。 你应该真正说明你要解决的问题是什么,而不是语言的问题。很难确定你在担心什么,你需要一个全局变量吗?类的静态成员?你想访问什么?另请注意,您提供的 Java 代码与描述毫无意义... 在 Java 中,您可以访问任意多个其他类中的类,只要变量是静态的,您访问的类中的值将始终相同。我正在寻找一种在 C++ 中执行此操作的方法。 【参考方案1】:

在 C++ 中,使用范围解析运算符 :: 代替 Java 中的 .。你可以像这样调用静态方法:

在标题中:

class MyClass 
public:
    static int myPrivateStaticVar;
    static void myStaticMethod();
;

在cpp文件中:

#include "myfile.h"
#include <iostream>

using namespace std;

int MyClass::myPrivateStaticVar = 123;

void MyClass::myStaticMethod() 
    cerr << "hello, world! " << myPrivateStaticVar  << endl;


int main() 
    MyClass::myStaticMethod();

您的静态方法 myStaticMethod 需要在 MyClass 类中公开。

【讨论】:

所以你不需要定义一个全新的对象,如果你在所有类的某个地方初始化了一个 MyClass,使用 MyClass:: 将能够使用更新的值? @Brink C++ 中的静态方法与 Java 中的静态方法具有相同的限制:它们只能访问静态变量,并且只能调用类的静态成员函数。您不能从静态方法访问类的实例方法实例变量,除非对象的实例静态可用(例如,在单例实现中)。跨度> 当我使用您提供的示例时,我得到“错误:无法在没有对象的情况下调用成员函数 'Myclass::myMethod(int)'”,我将方法更改为静态,但这也不起作用.我不想声明一个对象... 它有点工作,除了它说我正在使用的静态变量有一个未定义的引用。 这是说我有一个未定义的对 MyClass::(variable) 的引用,但我认为现在这是一个完全不同的问题。【参考方案2】:

在 Java 中,您可以访问任意多个其他类中的类,只要变量是静态的,您访问的类中的值将始终相同。

你的意思是,像一个全局变量?您可以像这样声明一个全局变量:

extern int foo;

你需要一个定义,它是这样的:

int foo = 42;

声明如果放在一个包含在任何需要的地方的头文件中将会很好地工作,并且定义应该放在一个源文件中。

【讨论】:

但是这不是声明了一个新的foo实例吗,它会回到类中已经设置好的默认变量吗?我希望声明一个 foo 对象,但它是否能够使用已从另一个类更改的变量。 什么课?我的示例中没有类。 如果您可以查看我在 Java 顶部的示例代码,那么您可能会看到我想要了解的内容。

以上是关于java调用同一个类中的方法为啥要将方法申明成静态?的主要内容,如果未能解决你的问题,请参考以下文章

java新手为啥java类中要有static静态方法?

Python学习之抽象类详解

如何调用内部类中的静态方法

android其他类怎么调用继承自activity的类(mainactivity)中的非静态方法?

java中,当实例化子类时会递归调用父类中的构造方法。这个说法对么?为啥

静态方法怎么调用