演示:
Object是Java/C#中所有类型的父类,可以说它是万物之祖(万物皆对象)。
因此,任何类默认自动的继承自Object,不需要显式声明。所有类都可以通过继承获得Object的方法属性等。
@想一想@:这样写法OK么?为什么?
Object lang = new Student();
这一章节我们学习以下几个方法:
hashCode()/GetHashCode():获取对象的哈希(复习)值:
所以,我们可以用GetHashCode()确定两个对象不相同,但不能用于确定他们相同。
@想一想@:当我们说“相同”的时候,我们在说什么“相同”?
Student lang = new Student(); Student atai = lang;
Student lang = new Student(); lang.Name = "浪神"; Student atai = new Student(); atai.Name = "浪神";
@想一想@:为什么需要对象的hashCode呢?
PS:native标记的方法,不是由Java语言实现的。object还提供了equals()/Equals()方法,用于比较作为参数传入的两个对象是否相等,即两个变量是否指向同一个对象。
演示:转到定义
public boolean equals(Object obj) { return (this == obj); }和==的区别,就是当出现null值时:
Student lang = null; Student atai = null; System.out.println(lang == atai); //true System.out.println(lang.equals(atai)); //报异常,@想一想@:为什么?
你可能会觉得:有==不是就够用了么?干嘛要用equals()方法?
因为方法才可以override呀!有时候我们可能需要建立自己的规则来比较两个对象:比如两个Student,姓名(+生日+班级,或者身份证号)相同,就是同一个人。
public boolean equals(Object obj) { return Name == ((Student)obj).Name; }
但是注意:equals和hashCode()要同时override,确保两者的值一样。(为什么后面详述)
F3演示:Integer类override了equals()和hashCode()
System.out.println(new Integer(100).equals(new Integer(100))); System.out.println(new Integer(100).hashCode() == (new Integer(100)).hashCode());
将对象转换成字符串:Java:toString() / C#:ToString()
@猜一猜@:
System.out.println(new Student());
结果是什么?(演示:转到定义)
为什么需要toString()?原因和hashCode()/equals()一样:
System.out.println(3.14F); System.out.println(new Float(3.14).toString());
我们来看这样几行代码:
Object wx = new Student(); //把new Student()的堆地址存到wx变量中 int i = 888; //把值888直接存放到变量i中 Object o = 986; //把986存到哪里?
注意最后一行代码,986能不能直接放到变量o里面?
这是不行的,因为o是Object引用类型的,o里面只能存放一个堆地址。但是Object o =986;又是符合语法的,这种把值类型数据直接赋值给Object变量的行为,被称之为装箱(box)。具体来说,这一行代码做了两件事:
写成伪代码就是:
Object o = new Object(); o.inbox = 986; //inbox是我随手写的,代指“箱子内部”
C#中可以用&运算符查看
既然能够装箱,当然也能够拆箱(unbox)
int i = (int)o;
#常见面试题#
装箱拆箱和
int i = 10; float f = i; int fi = (int)f;
Person plang = new Student(); Student slang = (Student)plang;
正面回答:
另外两种转换都没有这种过程的。
多快好省!前端后端,线上线下,名师精讲
更多了解 加: