Java控制输出对象原理
//创造了Child类,实际上间接继承了extends Object类
public class Child (extends Object){
//成员变量
private int age;
private String name;
//提供获取成员变量的get和set方法
public int getAge() {
return age;
}
public String getName() {
return name;
}
public void setAge(int age) {
this.age = age;
}
public void setName(String name) {
this.name = name;
}
}
//main方法测试类
public class Demo1 {
public static void main(String[] args) {
Child ch = new Child();
System.out.println(ch);
}
这时我们用System.out.println(ch);此时会输出什么呢?
/*
* 实验结果:
* forth.Child@1b6d3586
* */
为什末会返回以上的结果呢?
我用的是idea,此时按(ctrl+鼠标的左键)便可看到源码,以下进行了分析:
public class Demo1 {
public static void main(String[] args) {
Child ch = new Child();
System.out.println(ch);
System.out.println(ch.getClass().getName() + "@" + Integer.toHexString(ch.hashCode()));
/*
* 实验结果:
* forth.Child@1b6d3586
* */
这时你想过为什末会返回以上的结果吗?
/*
*--------------------------------------------------------------------------------
*System.out.println(ch);这一行的底层实现方法 //println 按ctrl+鼠标左键
*--------------------------------------------------------------------------------
* 1:public void println(Object x) {
* String s = String.valueOf(x); //valueOf按ctrl+鼠标左键
* synchronized (this) {
* print(s);
* newLine();
* }
* }
* ---------------------------------------------------------------------------------
* 2:public static String valueOf(Object obj) {
* return (obj == null) ? "null" : obj.toString(); //toString按ctrl+鼠标左键
* }
* //判断对象是否为空
* ---------------------------------------------------------------------------------
* 3:public String toString() {
* return getClass().getName() + "@" + Integer.toHexString(hashCode());
* }
* getClass().getName()---->获取该类的完整路径地址forth.Child
* Integer.toHexString(hashCode())----》将hashCode()值转化成字符串
* 整体进行了拼接
* ----------------------------------------------------------------------------------
* */
}
}
System.out.println(ch);
System.out.println(ch.getClass().getName() + "@" + Integer.toHexString(ch.hashCode()));
因此以上两条语句是等价的,底层进行了封装,因此我们使用起来便非常地便捷。
接下来我们思考下面这条语句,此时会输出什末呢?
System.out.println(ch.toString());
是不是也会输出
/*
* 实验结果:
* forth.Child@1b6d3586
* */
因为Child类间接继承了Object类,Object类中有toString()方法,而Child类没有,因此会调用父类Object的toString()方法,观察返回值你便不难发现,因此和上面是等价的。
------------------------------------------------------------------------------------------------------------------
Object类中的toString方法
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
-------------------------------------------------------------------------------------------------------------------
没有继承其他类时一般默认继承了Object类,可以省略不写,这就是间接继承
public class Child (extends Object){
//成员变量
private int age;
private String name;
//提供获取成员变量的get和set方法
public int getAge() {
return age;
}
public String getName() {
return name;
}
public void setAge(int age) {
this.age = age;
}
public void setName(String name) {
this.name = name;
}
//以下是新添加的方法toString()方法,相当于重写了父类中的方法
// -------------------------------------------------------------------
public String toString(){
return "name:"+name+",age:"+age;
}
//--------------------------------------------------------------------
}
//main方法测试类
public class Demo1 {
public static void main(String[] args) {
Child ch = new Child();
System.out.println(ch); //第一条语句
//System.out.println(ch.getClass().getName() + "@" + Integer.toHexString(ch.hashCode())); //第二条语句
System.out.println(ch.toString()); //第三条语句
}
}
思考下:那末此时这三条语句还会是forth.Child@1b6d3586吗?
因为子类重写了父类中的toString()方法,如果子类有,那就先调用子类的,否则再去调 用父类的,那么结果应该是
输出结果:
name:null,age:0
name:null,age:0
-------------------------------------------------------------------------------------------------------------------
1:toString()总结:
toString()就是给我们的对象重写的,输出对象中所有成员的值。
2:同时我们也要理解这三条语句的工作原理:
System.out.println(ch);
System.out.println(ch.getClass().getName() + "@" + Integer.toHexString(ch.hashCode()));
System.out.println(ch.toString());