我有一个来自我所创建的类的对象数组,其中包括该类型的对象和扩展第一个对象的对象。我想要访问扩展对象具有的第一个对象没有的变量,一旦我知道我正在谈论的对象是扩展对象。一个简化的例子如下所示:
public class Parent {
public boolean isChild=false;
}
public class Child extends Parent {
public int i=5;
public Child() {
isChild=true;
}
}
public class main {
public static void main(String[] args) {
Parent x=new Child();
if (x.isChild) {
System.out.println(x.i); //this is what I want to do...
//... but I get an error because Parent doesn't have a variable called i.
}
}
}
那么,有什么方法可以解决这个问题吗? (我看过制作一个受保护的静态变量,但这似乎不是我想要的,因为我需要它的多个副本。)
好的,关于它是如何实际使用的(我第一次错误地没有包含),我正在制作自己的计算机编程语言以获得乐趣。我有一个已创建的对象的ArrayList,并允许这种语言的用户创建自己的对象,并使用我用我的语言编写的java代码和代码。
我在java中创建字符串(aka child)并让它们扩展我的wafl_object类(父级)。通过这种方式,它们可以在ArrayList中携带,而不必为每个对象使用不同的数组。但是,我想接受一个String作为另一个类的参数,我看不到它的值,因为它在一个对象数组中,我把它当作一个对象。我现在已经解决了这个问题,因为我知道它确实是一个,然后查看它的值。在这种情况下,投射它更容易,但在其他情况下,抽象可能更有用。
答案 0 :(得分:4)
使用多态:
,而不是测试对象的类型public abstract class Parent {
public abstract int getValue();
}
public class Child extends Parent {
@Override
public int getValue() {
return 5;
}
}
public static void main(String[] args) {
Parent x = new Child();
System.out.println(x.getValue());
}
答案 1 :(得分:2)
尝试类似:
if(x instanceof Child){
System.out.println(((Child)x).i);
}
答案 2 :(得分:2)
首先,isChild
可以替换为使用instanceof
:if (x instanceof Child)
。之后,您可以安全地将x
投射到Child
:Child childX = (Child)x
。 childX
然后您可以访问x
。
一般来说,检查类型是不受欢迎的。通常你应该设计你的函数,使它们接受一个足够通用的类型来完成他们需要做的所有事情而不必转换为派生类类型。
答案 3 :(得分:1)
您不需要isChild
变量。您可以使用if (x instanceof Child)
。但是,要访问i
,您必须将x
改为Child
。
此外,请勿直接访问会员。 i
等数据成员应为private
,您应该通过getter访问它们。
public class main {
public static void main(String[] args) {
Parent x=new Child();
if (x instanceof Child) {
System.out.println((Child)x.getI());
}
}
}
答案 4 :(得分:1)
您可以使用instanceof
和强制转换解决此问题,如其他答案中所述,但通常使用多态性更好,以定义子类可以覆盖的方法。确切的方法取决于您的计划的确切性质,但这是一种可能性,我Employee
使用Parent
和HourlyEmployee
Child
(构造函数和其他逻辑需要填写):
public class Employee {
private String name;
public String getDescription() {
return name;
}
}
public class HourlyEmployee {
private int wage;
@Override
public String getDescription() {
return super.getDescription() + " [at $" + wage + " per hour]";
}
}
然后,使用Employee
的班级不需要测试它是否为HourlyEmployee
;它只是调用getDescription
,该方法将会或者不会在结果中包含小时工资,具体取决于它是什么类。
答案 5 :(得分:0)
没有理由使用父母或使用孩子
public class main {
public static void main(String[] args) {
Parent x=new Child();
if (x.isChild) {
System.out.println(((Child)x).i); //this is what I want to do...
//... but I get an error because Parent doesn't have a variable called i.
}
}
}
答案 6 :(得分:-1)
首先,以前的答案是正确的并且大致相同。你必须让编译器知道你想要使用(x)作为子而不是父。
因此,坚持使用代码示例,答案是将System.out语句修改为以下内容:
System.out.println(((Child)x).getValue());