Java控制输出对象原理

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());           
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值