超类中有一个toString,子类中有一个toString。我想在超类的ArrayList中显示东西,但使用子类的toString。例如:
public class SuperClass{
// field
String name;
// methods
public SuperClass(String name) {
this.name = name;
}
@override
public String toString() {
return "Name: " + name;
}
}那么我有一个子类
public class SubClass extends SuperClass {
// field
private int age;
// methods
public SubClass(String name, int age) {
super(name);
this.age = age;
}
@override
public String toString() {
return "Name: " + name +
"\nAge: " + age;
}
}我想用子类的MyList在类toString中显示这个超类。,这有可能吗?
import java.util.ArrayList;
public class MyList {
protected ArrayList<SuperClass> list = new ArrayList<>(); // display with Name and Age
public void userInput() {
// user inputting
SubClass sub1 = new SubClass("Joe Black", 21);
SubClass sub2 = new SubClass("Jane Black", 20);
SuperClass sup1 = new SuperClass("Adam");
list.add(sub1);
list.add(sub2);
list.add(sup1);
}
public void print() {
for (SuperClass e : list) {
System.out.println(e); // uses print methods of SuperClass or SubClass
}
}
public static void main(String args[]) {
MyList theList = new MyList();
theList.userInput();
theList.print();
}
}预期产出:
$ javac SubClass.java SuperClass.java MyList.java
$ java -cp . MyList
Name: Joe Black
Age: 21
Name: Jane Black
Age: 20
Name: Adam
$ 此外,我还有多个子类。
我现在遇到的问题是,它只打印实际输出的名称:
$ javac SubClass.java SuperClass.java MyList.java
$ java -cp . MyList
Name: Joe Black
Name: Jane Black
Name: Adam发布于 2022-07-02 08:38:32
为了方便起见,我将所有类放入一个文件中:
MyList.java
import java.util.ArrayList;
public class MyList {
protected ArrayList<SuperClass> list = new ArrayList<>(); // display with Name and Age
public void userInput() {
// user inputting
SubClass sub1 = new SubClass("Joe Black", 21);
SubClass sub2 = new SubClass("Jane Black", 20);
SuperClass sup1 = new SuperClass("Adam");
list.add(sub1);
list.add(sub2);
list.add(sup1);
}
public void print() {
for (SuperClass e : list) {
if (e.getClass() == SuperClass.class)
{
// SuperClass has no attribute age. Therefore, create temporary SubClass instance
SubClass s = new SubClass(e.name, 0);
e = s;
}
System.out.println(e); // uses .toString of corresponding class
}
}
public static void main(String args[]) {
MyList theList = new MyList();
theList.userInput();
theList.print();
}
}
class SuperClass {
// field
String name;
// methods
public SuperClass(String name) {
this.name = name;
}
@Override
public String toString() {
return "Name: " + name;
}
}
class SubClass extends SuperClass {
// field
private int age;
// methods
public SubClass(String name, int age) {
super(name);
this.age = age;
}
@Override
public String toString() {
return "Name: " + name +
" Age: " + age;
}
}SuperClass没有属性age。因此,print方法使用精确的类检查,并创建一个临时SubClass实例,以便使用其toString方法。
这将产生以下输出。
$ javac MyList.java
$ java MyList
Name: Joe Black Age: 21
Name: Jane Black Age: 20
Name: Adam Age: 0
$ 请注意,如果在SubClass中生成一个新的MyList.print实例,也可以通过其他方式修改输出,例如打印"Name: Adam:-“。MyList类可以随心所欲地处理SuperClass实例。
https://stackoverflow.com/questions/72680654
复制相似问题