【问题标题】:Refer to a class, when we have an object of the same name引用一个类,当我们有一个同名的对象时
【发布时间】:2016-03-31 13:18:41
【问题描述】:

请注意:这是一个实验,而不是真实情况。我想了解更多,因此我提出了这个问题。


我有一个类ABC,有一个静态方法method()
public class ABC
{
    public static void method(){
        System.out.println("ABC class");
    }
}


我有一个类DEF,带有一个非静态方法method()
public class DEF
{
    public void method(){
        System.out.println("DEF class");
    }
}


最后,我有一个类GHI,代码如下:
public class GHI
{
    public static void main(String args[])
    {
        ABC.method();
        DEF ABC = new DEF();
        ABC.method();
    }
}


输出是:

ABC类
DEF类


我知道输出的原因。

我的问题是:在这种情况下,如果我们有一个类的对象,名称与另一个类的名称相似,那么我们如何调用同名的类的方法作为对象的方法?

明确地说:在这种情况下,如何调用ABC类的静态方法method

【问题讨论】:

  • 可能是指完全限定的类名?例如com.example.ABC.method();
  • 如果完全限定名称不同,则使用完全限定名称的一种方法。
  • @Dr.Pelocho 哦,是的。你是对的,但我这里没有包裹。有什么办法可以在这里做到这一点?
  • 显而易见的答案是你会改变你的变量名,因为创建一个与你也试图在同一方法中引用的类同名的变量只是编写糟糕的代码对每个人来说,事情都会变得更加困难。

标签: java oop object


【解决方案1】:

这种情况下怎么调用ABC类的静态方法方法呢?

您可以创建ABC.method()static import(假设ABC 类在com.package 包中)并调用它。

import static com.package.ABC.method;

public class GHI {
    public static void main(String args[]) {
        method(); // calling the static ABC.method()
        DEF ABC = new DEF();
        method(); // calling the static ABC.method
        ABC.method(); //calling the instance method()
    }
}

这样您可以区分static method() 和实例method()(在DEF 中定义)。

【讨论】:

  • 它会引发错误:“找不到符号 - ABC 类”。
  • 导入语句放在哪里?定义这三个类的包是什么?
  • 我没有包,因此我编写的程序的第一行是import static ABC.method;,但它会引发错误。
  • 好吧,其实你有我的赞成票。当我将这些类放在一个包中,然后运行程序时,它就像你说的那样工作。感谢您的回答。我在等,如果其他人有其他方法,可以不用包也可以。
【解决方案2】:

您的类ABCDEF 之间没有可见的继承关系,因此您将无法从任何DEF 实例引用调用静态ABC.method()(分配@ 时ABC 变为987654327@)。

这里的混淆是ABC 既是ABC 类的名称,又是DEF 实例的名称。

换句话说,不要将变量名与类名引用混淆。

为便于编写,Java 变量名应为camelBack,详情参见here

最后说明

如果您继承关系,其中DEF 扩展ABC,您将无法将method 声明为DEF 中的实例方法,因为它不会编译。

你只能 隐藏 ABC 的静态 method,方法是在 DEF 中也声明 static

【讨论】:

  • 这就是为什么约定告诉你类名使用大写首写,变量使用小写驼峰式。
  • @Tokazio 是的。因此,OP 显然对变量名和类名之间的区别感到困惑。
  • 我知道这些约定。而且,我的问题的第一行说这是一个实验,而不是真实情况。我知道你所说的一切。但我想知道我是否可以在这里做到。你说不,但也许其他人知道怎么做。
【解决方案3】:

首先关注variables/objects 如何驻留在memory 中,即into stack/pool(literal) or into heap

所以这里 ABC-class 和 ABC-instance 变量同名出现在我们面前,但实际上它所在的位置不同。

所以,如果您在创建 DEF 实例之前调用 ABC,它只有一个 这就是为什么引用 ABC-class 但现在创建实例之后 比 ABC 级最近。所以,最近的将首先到达/进入图片 (就它实际所在的堆栈而言) 理论上/实际应用。

这将有助于以更多方式清除,

 public static void main(String args[])
    {
        ABC.method(); // output : ABC class
        DEF ABC = new DEF();
        pck1.pck1pck2.ABC.method(); // output : DEF class , this will actually refer ABC class's static method...
        ABC.method(); // output : ABC class , this will refer DEF class's instance ABC because of closest will reach/comes-in-picture first (in terms of stack where actually it's resides

        /*
         * if you have default package means no-name for distinuges classes then 
         * need to create instance of ABC-class
         * */

        ABC obj = new ABC();
        obj.method(); // output : ABC class

    }

【讨论】:

  • 嘿,concept 是什么?这里:concept.ABC.method();?
  • 哦,对不起,这是我的包名。
  • 哦!创建对象是一个不错的方法。谢谢!
【解决方案4】:

对我的简单回答是,如果遵循 Java 命名约定,这不会发生 :-)

类以大写字母开头,变量以小写字母开头。

话虽如此,我知道您提到这只是一个测试,更多的是关于如何访问与变量同名的类的变量。从技术上讲,如果我们正确地遵循约定,我们永远不会有这种情况。

有趣的拍摄,干得好!

【讨论】:

    【解决方案5】:

    声明变量后必须使用完全限定的类名

    public class GHI{
            public static void main(String args[])
            {
                ABC.method();
                DEF ABC = new DEF();
                ABC.method();
                packagename.ABC.method(); //Like this
            }
    }
    

    但更好的方法是遵循命名约定。

    【讨论】:

      【解决方案6】:

      除了 Konstantin YovkovVishal Gajera 发布的答案之外,我还找到了另一种使用反射的方法:

      ABC.class.getDeclaredMethod("method",null).invoke(null,null);
      

      这里,

      • ABC.class 指的是类。
      • getDeclaredMethod("method",null) 获取名为 method 的方法,该方法不接受任何参数。
      • invoke(null,null) 调用该方法,没有对象,因为它是 static,并且没有传递任何参数,因为它不接受任何参数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-05-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多