我已经重写过toString了,为什么直接get的时候获取到的是引用数据类型,输出测试过了输出的是重写过的toString,但是还是需要调用到具体类的get方法才能获取的是String类型的。

ublic class StudentTest {
public static void main(String[] args) {
Student student=new Student();
student.show();
System.out.println(student.getA().equals("Tom"));
System.out.println(student.getA().getName().equals("Tom"));
}
}

public class Student {
private Att a=Att.N;

public Att getA() {
    return a;
}
public void setStatus(Att status) {
    this.a = status;
}
public void show() {
    System.out.println(a);
    System.out.println(getA());        
}

}

public class Att{
private String name;

public Att(String name) {
    super();
    this.name = name;
}
public static final Att N=new Att("Tom");

public String getName() {
    return name;
}
public void setName(String name) {
    this.name = name;
}

@Override
public String toString() {
    return name;
}    

}

student.getA()和student.getA().getName()不应该都是String类型吗?

首先你的getA

public Att getA() {
    return a;
}

返回的是Att对象,肯定是类型的,如果你要获取字符串,需要自己去调用toString()方法

至于在show()中为什么会直接输出你重写的toString

public void show() {
    System.out.println(a);
    System.out.println(getA());        
}

这是因为在System.out.println中对于引用类型对象内部会调用toString方法

你看Sutdent类中getA方法签名,它是返回Att类型啊,怎么能是String类型呢?
getName()是String没毛病。实际上getA().getName相当于

Att a = student.getA();
String str = a.getName();

如果getA()返回的是String的话,你就点不出getName()了

你重写过toString,跟你getA和getName返回什么有一毛钱关系吗
你根本没有调用toString函数啊

private Att a=Att.N;

这是你的getA,返回的Att 这个对象

public Att getA() {
return a;
}

这是你的getName返回的是String

public String getName() {
return name;

你在外部直接打印System.out.println(Att);对象时他会默认调用toString。
但是你使用的是getA()方法,返回的是一个对象。是object类型。
如有帮助望采纳