当前位置: 首页 > 知识库问答 >
问题:

在Java中,当类的非静态方法调用该类的另一个方法时,为什么不需要创建对象?

何宏博
2023-03-14

这是一个非常基本的OOP问题。但我对全班的行为不太清楚。所以假设我有a类:

class Ideone {
    
    private static String str = new String();
    private String str2 = new String();

    public String getStr() {
        return str;
    }

    public String getStr2() {
        return str2;
    }

    public void setString (String str) {
        this.str = str;
    }

    public void setString2 (String str) {
        this.str2 = str;
    }    

    public boolean empty (String str) {
        return (str.isEmpty());
    }     

    public void output() {
        String str2 = getStr2();
        if (!empty(str2))
            System.out.println(getStr2());
        str2 = "Hello";
        System.out.println(getStr());
    }
    
}

现在,当我调用类A的方法输出:

    public static void main (String[] args) throws java.lang.Exception
    {
        // your code goes here
            Ideone obj = new Ideone();
            obj.setString2("Bye");
            obj.setString("Bye");
            obj.output();
        
            Ideone obj2 = new Ideone(); 
            str = "Hello";
            obj2.output();
    }

产出将是:

Bye
Bye
Hello
empty(str2)

附注。希望我洗清了自己的罪名。

共有1个答案

洪逸清
2023-03-14

当使用它时,您将引用对象的当前实例。所以你在做什么

this.str2 = str

是引用当前对象实例的变量str2并赋值str,并不总是需要用这个来引用变量。通常只有当有两个同名但作用域不同的变量时才会使用它。在这种情况下,编译器将无法知道哪一个是哪一个,所以您将不得不使用

private String str;

private void setString(String str) {
    this.str = str;
}

正如您在本例中所看到的,str既是setter方法传递的参数的名称,也是class变量的名称,因此这是必需的;

public class A {
   
   private String var1 = "defaultValue1";
   private String var2 = "defaultValue2";


   public void output() {
        System.out.println(var1);
        System.out.println(var2);
   }
}
A test = new A();
test.output
defaultValue1
defaultValue2

在按照指示声明所有变量之后,将调用所谓的Contructor。这是一种init方法,用于实际构建和初始化对象。

您可以使用OOP的基本属性:多态性来声明多个构造函数。

方法根据参数类型和参数数量进行操作的一种方式是方法重载。当您有两个同名但签名(或参数)不同的方法时,就会发生重载。

public class A {
   
   private String var1 = "defaultValue1";
   private String var2 = "defaultValue2";

   public A(String var1) {
     this.var1 = var1;
   }

   public A(String var1, String var2) {
     this.var1 = var1;
     this.var2 = var2;
   }

   ...
}
A test1 = new A("Hello");
test1.output();
Hello
defaultValue2

A test2 = new A("Hello", "World");
test2.output();

现在将打印

Hello
World

静态场则完全不同。静态字段是需要对该类型的所有对象实例通用的字段。每次创建新的对象实例时,都会创建其中的所有变量。静态变量是另一回事。这些变量不属于对象实例,而是属于类本身。

public class Person {

   public static int POPULATION = 7000000000;

   private String name;
   private String lastName;
}
 类似资料:
  • 我创建了两个类:和。下面是进行计算的方法: 这里是一个调用并显示结果的函数,不幸的是,我无法根据这本书要求它运行的方式来运行它。 任何提示都会帮助我在我的再教育过程中。

  • 问题内容: 我最近从使用PHP切换到Java,并进行了查询。想强调一下我是Java的初学者。 本质上,我正在使用文件A(具有类A),并且想要引用保存在文件B(类B)中的静态方法。使用A类时是否需要参考文件B?(我正在考虑使用PHP中的require_once)我在A类中的代码如下: Eclipse无法将B识别为类。我是否需要创建B的实例才能访问静态方法。觉得我真的忽略了某些东西,希望您能提出任何建

  • 问题内容: 如果我用Java创建类的实例,为什么最好静态地调用同一类的静态方法,而不是使用this.method()? 当我尝试通过this.staticMethod()从自定义类的构造函数中调用静态方法staticMethod()时,我收到Eclipse的警告。 与 谁能解释为什么这是一件坏事?在我看来,编译器应该已经分配了对象的实例,因此静态分配内存将是不必要的开销。 编辑: 我听到的要点是,

  • 本文向大家介绍在一个静态方法内调用一个非静态成员为什么是非法的?相关面试题,主要包含被问及在一个静态方法内调用一个非静态成员为什么是非法的?时的应答技巧和注意事项,需要的朋友参考一下 由于静态方法可以不通过对象进行调用,因此在静态方法里,不能调用其他非静态变量,也不可以访问非静态变量成员。

  • 问题内容: 为什么我们不能在非静态内部类中使用静态方法? 如果我将内部类设为静态,则可以工作。为什么呢 问题答案: 因为内部类的实例与外部类的实例隐式关联,所以它本身不能定义任何静态方法。由于静态嵌套类无法直接引用其封闭类中定义的实例变量或方法,因此只能通过对象引用使用它们,因此在静态嵌套类中声明静态方法是安全的。

  • 问题内容: 尝试在静态类中调用非静态方法时遇到错误。 无法从类型播放中静态引用非静态方法methodName() 我不能使该方法静态,因为这也给我一个错误。 此静态方法无法从xInterface隐藏实例方法 有什么办法可以在另一个静态方法中轮回调用非静态方法?(这两种方法位于单独的包和单独的类中)。 问题答案: 从静态方法中调用非静态方法的唯一方法是使类的实例包含非静态方法。根据定义,非静态方法是