为什么这里调用的时toString方法?

class A{}
class B extends A{
public B(int i){
}
public String toString(){
return "q";
}
}
class C extends A{
public C(String w){
}
public String toString(){
return"w";
}
}
public class testtest{
private A a;
public void setA(A a){
this.a=a;
}
public A getA(){
return a;
}
public static void main(String args[]){
testtest q=new testtest();
q.setA(new B(8));
System.out.println(q.getA());
q.setA(new C("hello"));
System.out.println(q.getA());
}
}
我想输出的是,8和hello该怎么改这个代码

在java中,System.out.println();输出到控制台,当里面的参数不是字符串是,默认将参数转换成字符串。如果参数是一个对象,默认调用对象的toString()方法。

class A{
protected int i;
protected String w;
public int getI(){
return i;
}
public String getW(){
return w;
}

}
class B extends A{
public B(int i){
this.i = i;
}
public String toString(){
return "q";
}
}
class C extends A{
public C(String w){
this.w = w;
}
public String toString(){
return"w";
}
}
class testtest{
private A a;
public void setA(A a){
this.a=a;
}
public A getA(){
return a;
}
}

main方法下面这样调用

    testtest q=new testtest();
    q.setA(new B(8));
    System.out.println(q.getA().i);
    //或者
    System.out.println(q.getA().getW());
    q.setA(new C("hello"));
    System.out.println(q.getA().w);
    //或者
    System.out.println(q.getA().getW());