Java 如何从对象类引用访问对象?

Java 如何从对象类引用访问对象?,java,Java,请任何人在以下方面提供帮助: HelloWorld.java public class HelloWorld { public static void main(String []args) { System.out.println("Hello World"); HelloWorld he = new HelloWorld(); Newfile ne = new Newfile(); System.out.println

请任何人在以下方面提供帮助:

HelloWorld.java

public class HelloWorld {

    public static void main(String []args) {
        System.out.println("Hello World");
        HelloWorld he = new HelloWorld();
        Newfile ne = new Newfile();
        System.out.println(ne.a);
        he.puaa(new Newfile());
    }

    public String puaa(Object o) {
        System.out.println(">> " + o.a);
        return null;
    }
}
Newfile.java

public class Newfile {
    String a="paa";

    public static void main(String []args) {
        System.out.println("Hello World");
    }
}
我正在将
NewFile()
传递给
Object
类,并尝试使用对象的引用访问该对象的变量,我得到

HelloWorld.java:12: error: cannot find symbol
System.out.println(">> " +o.a);
^
symbol:   variable a 
location: variable o of type Object

更新:我想将任何对象传递给puaa(对象o)方法,该对象将始终具有变量。所以,解决方案应该是这样的,它应该适用于所有人,而不仅仅适用于NewFile。

您需要将其强制转换为
NewFile
对象。它正在查看基本
Java
对象
,查找不存在的方法
a

System.out.println(">> " + ((NewFile)o).a);

您可以尝试一个接一个地强制转换到每个类,以捕获
ClassCastException
,直到获得所需的类。

Object
是一个非常通用的类,它没有任何名为a的字段。您有一些解决方案:

  • 将参数设置为
    NewFile
    ,而不是任何对象。在我看来,这是一个更好的方法,因为显然,
    puaa
    只对
    NewFile
    对象进行操作

    public String puaa(NewFile o) {
    
  • o
    转换为
    NewFile
    。我不建议这样做,因为如果您传递的不是NewFile实例,它将抛出一个异常,因此第一个解决方案比这个更好

    System.out.println(">> " + ((NewFile) o).a);
    

    • 你不能那样做<代码>对象可以是任何东西:一个
      字符串
      、一个
      整数
      、一个
      哈希映射
      、一个
      执行服务
      。。。从这4个示例中,没有一个与您的
      NewFile
      类密切相关

      最好的替代方法是为类声明一个超级(可能是抽象)类或接口,并将此超级类型的参数传递给方法

      下面是一个小例子:

      public abstract class MyFile {
          protected String a;
      
          public MyFile(String a) {
              this.a = a;
          }
      
          public String getA() {
              return a;
          }
      }
      
      public class NewFile extends MyFile {
          public MyFile(String a) {
              super(a);
          }
      }
      
      public class OldFile extends MyFile {
          /* add your implementation... */
      }
      
      public class Main {
          public static void main(String[] args) {
              //you can replace here by using new OldFile
              MyFile myFile = new NewFile("foo");
              Main main = new Main();
              main.puaa(myFile);
          }
      
          public void puaa(MyFile myFile) {
              System.out.println(myFile.getA());
          }
      }
      
      创建接口

      public interface HasA { 
        String getA();
      }
      
      在要与puaa一起使用的所有类上添加此接口

      public void puaa(HasA o){
        System.out.println(">> " + o.getA());
      }
      

      @LuiggiMendoza然后处理抛出的
      ClassCastException
      。它不会编译,因为对象没有属性“a”@sunrise76,它是由于向下投射而编译的。@LuiggiMendoza就像我在处理抛出的
      异常之前所说的那样。这取决于OP试图做什么。@Emd4600从未说过这不是更好的。只是给了他一个简单的回答。如果你读了他的其他评论,这实际上就是他想要的。如果你不发送一个新文件对象引用,而是发送一个与OldFile()结构相同的其他对象引用,会怎么样。我想要一个能容纳任何类型并能转换成任何类型的引用type@fatherazrael这是不可能实现的。Java具有强大的类型功能。除非
      OldFile
      扩展
      Newfile
      ,否则不会发生这种情况,但您必须了解这将是一个非常奇怪的设计。然后,使
      OldFile
      继承
      Newfile
      或使两者都继承一个新类,我正在尝试使用另一个接口,该接口由Newfile和Oldfile实现。但仍然存在一个问题,即该接口中应该声明变量a,您必须在您正在创建的接口中声明
      a
      。另外请注意,参数类型现在必须是该接口。有一种方法可以做你想做的事情看看我的答案。如果抛出了
      ClassCastException
      ,您可以尝试逐个对每个类进行强制转换,如果抛出了,则尝试对下一个
      类进行强制转换。您可以这样做,直到找到合适的类。如果您不想创建父接口或
      ,那么我建议您尝试一下。。。