我正在清除我对Java的概念。我对Java的了解远远不够,所以请耐心等待。
我试图理解静态方法和非静态方法的间接调用。我知道 -
我的问题是关于非静态方法调用同一类的另一个非staic方法。在类声明中,当我们声明所有方法时,我们可以从非静态类中调用同一类的另一个非静态方法吗? 请举例说明。谢谢。
答案 0 :(得分:7)
你的#3是正确的,你可以使用classname.methodname从非静态方法调用静态方法。
您的问题似乎在于询问您是否可以使用其他非静态方法调用类中的非静态方法,这也是可能的(也是最常见的)。
例如:
public class Foo {
public Foo() {
firstMethod();
Foo.staticMethod(); //this is valid
staticMethod(); //this is also valid, you don't need to declare the class name because it's already in this class. If you were calling "staticMethod" from another class, you would have to prefix it with this class name, Foo
}
public void firstMethod() {
System.out.println("This is a non-static method being called from the constructor.");
secondMethod();
}
public void secondMethod() {
System.out.println("This is another non-static method being called from a non-static method");
}
public static void staticMethod() {
System.out.println("This is the static method, staticMethod");
}
}
答案 1 :(得分:2)
方法是并且应该首先在语义上绑定到类或实例。
某个东西的列表有一个长度或大小,所以你要求特殊列表的大小。您需要该类的对象来调用.size ()
。
一个典型的,众所周知的静态方法示例是Integer.parseInt ("123");
。您当时没有Integer实例,但想要创建一个。
如果我们将该方法绑定到一个实例,我们会将它绑定到一个String实例 - 这是有道理的:
int a = "123".parseInt ();
这本来是一个合理的选择,但这意味着float,double,long,short,Boolean以及每个具有对称“toString”方法的类的类似方法都必须放入String中。这意味着对String类进行了大量扩展。
相反String是final,所以放置这样一个方法的合理位置是目标类,如Integer,Float等。
答案 2 :(得分:0)
不确定我是否正确理解了这个问题,但非静态方法是在OO中设计类的标准方法。也许这个样本将有助于引发讨论:
public class MySampleClass{
private void methodA(){
System.out.println('a called');
}
public void methodB(){
this.methodA();
staticMethod(this);
}
private static void staticMethod( MySampleClass inst ){
inst.methodA();
}
}
答案 3 :(得分:0)
public class TestClass{
public static void testStatic(){
System.out.println("test1");
}
public void testNonStatic(){
System.out.println("test2");
}
public void test1(){
// both is valid
testStatic();
TestClass.testStatic();
// this is valid, cause it can call the method of the same instance of that class
testNonStatic();
this.testNonStatic();
// this is not valid, cause without a concrete instance of a class you cannot call
// non static methods
TestClass.testNonStatic();
}
public static void test2(){
// again these are both correct
testStatic();
TestClass.testStatic();
// this doesn't work, cause you cannot call non static methods out of static methods
testNonStatic();
this.testNonStatic();
// this instead does work cause you have a concrete instance of the object
TestClass myTestClass = new TestClass();
myTestClass.testNonStatic();
// this still doesn't work
TestClass.testNonStatic();
}
}
答案 4 :(得分:0)
您可以使用非静态方法调用非静态方法,使用显式引用要调用该方法someObject.method
的对象,或者不指定该对象someMethod()
(在这种情况下,它将会在您调用当前非静态方法的同一对象上调用。)
也许这会更好地显示
class Demo {
private String name;
public Demo(String n) {
name = n;
}
public String getName() {// non static method
return name;
}
public void test(Demo d) {// non-static method
System.out.println("this object name is: "+getName());// invoking method on this object
System.out.println("some other object name is: "+d.getName());// invoking method on some other object
}
//test
public static void main(String[] args) {
Demo d=new Demo("A");
Demo d2=new Demo("B");
d.test(d2);
}
}
输出:
this object name is: A
some other object name is: B