Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当我们有一个同名的对象时,引用一个类_Java_Oop_Object - Fatal编程技术网

Java 当我们有一个同名的对象时,引用一个类

Java 当我们有一个同名的对象时,引用一个类,java,oop,object,Java,Oop,Object,请注意:这是一个实验,不是真实的情况。我想了解更多,因此我提出了这个问题。 我有一个类ABC,带有一个静态方法method(): 我有一个类DEF,带有一个非静态方法method(): 最后,我有一个带有以下代码的类GHI: public class GHI { public static void main(String args[]) { ABC.method(); DEF ABC = new DEF(); ABC.met

请注意:这是一个实验,不是真实的情况。我想了解更多,因此我提出了这个问题。
我有一个类ABC,带有一个静态方法
method()


我有一个类
DEF
,带有一个非静态方法
method()


最后,我有一个带有以下代码的类
GHI

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

输出为:

ABC课程
DEF类


我知道输出的原因

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


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

在类
ABC
DEF
之间没有可见的继承关系,因此您将无法调用静态
ABC.method()
来自任何
DEF
实例引用(当分配
new DEF()
时,
ABC
成为该引用)

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

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

为了便于编写,Java变量名应该是
camelBack
,有关详细信息,请参阅

最后一个音符

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

您只能通过在
DEF
中声明
static
来隐藏
ABC
的static
方法

在这种情况下,如何调用
ABC
类的静态方法

您可以创建
ABC.method()
静态导入
(假设
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()
    }
}

通过这种方式,您可以区分
静态方法()
和实例
方法()
(在
DEF
中定义)。

我的简单答案是,如果遵循Java命名约定,就不会发生这种情况:-)

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

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


虽然拍得很有趣,但做得很好

首先关注
变量/对象
如何驻留在
内存
中,该内存位于
堆栈/池(文本)或堆中

所以在这里,ABC类和ABC实例变量作为一个相同的名称出现在我们面前,但实际上它所在的位置是不同的

所以,如果您在创建DEF实例之前调用ABC,它只是一个实例 这就是为什么要引用ABC类,但在创建实例之后,现在它是 比ABC班最近。因此,最接近的将首先到达/到达图片中 (根据实际所在的堆栈) 理论/实际应用

这将有助于以更明确的方式


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

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

但更好的方法是遵循命名惯例。

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

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

  • ABC.class
    指的是该类
  • getDeclaredMethod(“method”,null)
    获取名为
    method
    的方法,该方法不带任何参数
  • invoke(null,null)
    调用该方法,没有对象,因为它是静态的,没有传递任何参数,因为它不接受任何参数

可能是指完整的限定类名?e、 g.
com.example.ABC.method()如果完全限定名称不同,则使用完全限定名称的一种方法。@Dr.Pelocho Oh Yes。你说得对,但我这里没有包裹。我可以在这里这样做吗?显而易见的答案是,您会更改变量名,因为创建一个与您试图在同一方法中引用的类同名的变量只会编写糟糕的代码,让每个人都更加困难。它会引发一个错误:“找不到符号-类ABC”.你把进口声明放在哪里?定义这三个类的包是什么?我没有包,因此,我编写的程序的第一行是
import static ABC.method的概念是什么?这里:
concept.ABC.method()?哦,对不起,这是我的包裹名。哦!创建对象是一种很好的方法。谢谢
 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

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