A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© hg3093483 中级黑马   /  2013-4-7 21:06  /  1842 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 hg3093483 于 2013-4-8 22:04 编辑

请问下面的代码,为什么直接打印Person类的对象p,就可以出现age=10,name=ton    这里是继承了Object类的一个什么概念??内部循环是怎样的?最好有代码解释一下。谢谢了

class Test6 {
        public static void main(String[] args) {
                Person p = new Person();
                p.age = 10;
                p.name = "tom";
                System.out.println(p);
        }
}

class Person {
        int age;
        String name;
        public String toString() {
                return "age="+age+",name="+name;
        }
}

9 个回复

倒序浏览
Object是一个没有父类的类,是一切类的父类(除了本身)。
为什么会打印出age=10,name=ton   
是因为你对p.age h和p.name 进行赋值操作了。所以才会打印age=10,name=ton 。
   System.out.println(p); 这个地放是因为你复写了Object类的toStriing()方法。//我是这么认为的不知道对不对
如果是基本类型的数组会打印内存地址的。
否则会打印出其里面的所有元素。应该是 用foreach()遍历的,但是foreach是java5还是版本6出来的忘了。。
希望对你有帮助。。。。
还是等大师来给你解答吧
回复 使用道具 举报
1,Java中每个类都是继承于Object类;
2,toString()方法时Object类的成员方法;
3,Person类继承Object类,就有了toString方法,Person类重写了toString方法;
4,println方法会隐式的调用tostring方法,将传进去的内容转换成字符串形式,再输出,相当于System.out.println(p.toString());
5,p是Person的实例,将用到是Person类已经重写过的toString方法,相等于return "age="+this.age+",name="+this.name;this就代表p;
6, System.out.println(p);就是 System.out.println("age="+this.age+",name="+this.name);this可省略;
7,输出的结果是age=10,name=tom;
回复 使用道具 举报
本帖最后由 李凯 于 2013-4-7 21:41 编辑

不知道该如何回答你这个问题,就给你写注释,让你分析吧。这里没什么循环。很简单的一段。
class Test6 {
        public static void main(String[] args) {
                Person p = new Person();//创建一个对象,p
                p.age = 10;//为对象p的age赋值10
                p.name = "tom";//为对象p的name赋值tom
                System.out.println(p);
        }
}

class Person {
        int age;
        String name;
        public String toString() {//因为有toString
                return "age="+age+",name="+name;
        }
}

你可以查阅一下api,然后将这个程序拿到Eclipse中进行调试来观察它的执行过程。多看看就能明白了.

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1 鼓励鼓励

查看全部评分

回复 使用道具 举报
HM李超 发表于 2013-4-7 21:33
1,Java中每个类都是继承于Object类;
2,toString()方法时Object类的成员方法;
3,Person类继承Object类, ...

支持你的说法,如果刚才看到你的回答我就不回答了。
回复 使用道具 举报
既然Object是java中所有类的父类,那Person类就默认继承了Object类。而toString函数是Object类中已经存在的函数,所以子类Person复写了它。这个toString的作用就是返回该对象的字符串表现形式。所以当你打印这个对象的引用P时,就调用toString使得引用强制的显示引用的内容了。  不知道这样解释对不对,呵呵。
回复 使用道具 举报
Object类的toString方法返回该对象的字符串表示。
通常,toString 方法会返回一个“以文本方式表示”此对象的字符串。结果应是一个简明但易于读懂的信息表达式。建议所有子类都重写此方法

Object 类的 toString 方法返回一个字符串,该字符串由类名(对象是该类的一个实例)、at 标记符“@”和此对象哈希码的无符号十六进制表示组成。换句话说,该方法返回一个字符串,它的值等于:

getClass().getName() + '@' + Integer.toHexString(hashCode())

你这里覆盖了Object的toString方法,就按照你自己定义的通俗形式表示了Person对象
回复 使用道具 举报
是个对象类型
Object 数据类型

保存引用对象的 32 位(4 字节)地址。可以为 Object 的变量分配任何引用类型(字符串、数组、类或接口)。Object 变量还可以引用任何值类型(数值、Boolean、Char、Date、结构或枚举)的数据。

备注  
Object 数据类型可以指向任意数据类型的数据,包括您的应用程序识别的任意对象实例。当您在编译时不知道变量可能指向哪种数据类型时,请使用 Object。

Object 的默认值为 Nothing(空引用)。

数据类型
可以将任何数据类型的变量、常数或表达式赋给 Object 变量。若要确定 Object 变量当前引用的数据类型,您可以使用 System.Type 类的 GetTypeCode 方法。下面的示例阐释这一点。

复制代码
Dim myObject As Object
' Suppose myObject has now had something assigned to it.
Dim datTyp As Integer
datTyp = Type.GetTypeCode(myObject.GetType())

Object 数据类型为引用类型。但是,当 Object 变量引用值类型的数据时,Visual Basic 将此变量视为一个值类型。

存储
无论它引用什么数据类型,Object 变量都不包含数据值本身,而是指向该值的一个指针。它总是在计算机内存中使用四个字节,但这不包括表示变量值的数据的存储。由于使用指针定位数据的代码的缘故,访问持有值类型的 Object 变量比访问显式声明类型的变量速度稍慢。

编程提示
互操作注意事项。 如果您正连接到不是为 .NET Framework 编写的组件,例如 Automation 或 COM 对象,请记住其他环境中的指针类型与 Visual Basic Object 类型不兼容。

性能。 用 Object 类型声明的变量足够灵活,可以包含对任何对象的引用。但是,在这样一个变量上调用方法或属性时,总是会遇到后期绑定(在运行时)。若要强制前期绑定(在编译时)和提高性能,请用特定的类名称声明变量,或将它强制转换为特定数据类型。

当您声明一个对象变量时,请尝试使用特定的类类型,例如 OperatingSystem,而不是普通的 Object 类型。还应使用可用的最具体的类,例如 TextBox 而不是 Control,这样就可以访问其属性和方法。通常可以使用“对象浏览器”中的“类”列表来查找可用的类名。

扩大。 所有数据类型和所有引用类型均扩大至 Object 数据类型。这意味着您可以将任意类型转换为 Object,而不会遇到 System.OverflowException 错误。

但是,如果您在值类型和 Object 之间转换,Visual Basic 会执行称为装箱和取消装箱的操作,这将减慢执行速度。

类型字符。 Object 不包含文本类型字符或标识符类型字符。

Framework 类型。 .NET Framework 中的对应类型是 System.Object 类。

示例  
下面的示例演示一个 Object 变量,它指向一个对象实例。

复制代码
Dim objDb As Object
Dim myCollection As New Collection()
' Suppose myCollection has now been populated.
objDb = myCollection.Item(1)

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
package test;
//请问下面的代码,为什么直接打印Person类的对象p,就可以出现age=10,name=ton    这里是继承了Object类的一个什么概念??内部循环是怎样的?最好有代码解释一下。谢谢了
class Test6 {
    public static void main(String[] args) {
            Person p = new Person();//创建一个Person的对象p,说明在内存中开辟了一片空间,这片空间的可以说是Person类的映射
            p.age = 10;//将10赋值给这片映射中的age
            p.name = "tom";//将字符串"tom"赋值给name
            System.out.println(p);//这句话能打印age与name的原因看下面的注释
    }
}

class Person {
    int age;
    String name;
    public String toString() {
            return "age="+age+",name="+name;//这里是将age与name的值进行返回,因为对象p已经赋值,所以可以输出age与name
    }
}
/*
return的常用作用有以下两种
一种是返回参数所用的关键字,假如一个有返回值的方法执行完了之后需要返回一个参数
示例:public string functionTest(){
         String a = "abc";
         return a;
}
那么这个方法被调用之后就会返回一个值为abc的字符串,string result = functionTest();
第二种用法是,代码执行到此处终止。
比如当代码执行到某个地方会出现几种结果,然后其中一种结果就不能执行后续代码,这时候在那里加上一个return就可以终止后面的代码执行。

*/
//回答的不好,还请见谅

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
如果问题未解决,请继续追问,如果没有问题了,请将帖子分类 改为“已解决”,谢谢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马