3.15、Object类
在Java中一切都是继承关系,那么既然一切都是继承关系。
class Person{}
如果一个类没有明确的指定哪个父类,则默认情况下就是继承Object类,实际以上的语法应该写成如下形式:
class Person extends Object{}
那么,证明,任何类对象都可以使用Object进行接收。
class Person extends Object{
}
public class Demo{
public static void main(String args[]){
Object obj1 = new Person();
Object obj2 = "hellow";
}
}
那么,对于Object接收来讲,不光可以接收类的引用,只要是引用数据类型都可以使用Object类接收。
interface National{
}
class Person extends Object implements National{
}
public class Demo{
public static void main(String args[]){
National na = new Person(); //子类为接口实例化
Object obj = na; //使用Object接收接口实例
National temp = (National)obj;
}
}
观察使用Object接收数组类型的数据:
public class Demo{
public static void main(String args[]){
int i[] ={1,2,3,4,5,6,7,8}; //数组
Object obj = i; //使用Object接收数组
int x[] = (int[])obj; //向下转型
for(int j=0;j<x.length;j++){
System.out.print(x[i] + "、 ");
}
}
}
Object类的主要功能不止于此,对于一个完整的类来讲,应该覆写Objcet类中的以下三个方法:
toString():对象打印时候调用:public String toString()
equals():对象比较时调用,实际上String类就已经覆写好了此方法。
public boolean equals(Object obj)
hashCode(),暂时不看
先来看toString方法:
class Person{
public String toString(){ //覆写了toString()方法
return "Hello";
}
}
public class Demo{
public static void main(String args[]){
System.out.println(new Person());
}
}
发现此时直接输出对象时,实际上就是调用了类中的toString()方法,那么因为此方法被子类覆写了,所以最终调用的是被覆写过的方法。
也就是说toString()是表示对象信息的。
class Person{
private String name;
private int age;
public Person(String name;int age){
this.name = name;
this.age = age;
}
public String toString(){
return "姓名:" + this.name + ",年龄:" + this.age;
}
}
public class Demo{
public static void main(String args[]){
System.out.println(new Person("张三",30));
}
}
在Object类中标准的对象比较方法就是equals,那么如果要进行对象的比较的话,在系统中找的也是equals方法。
class Person{
private String name;
private int age;
public boolean equals(Object obj){ //是完成对象的比较操作
if(this==obj){ //两个地址相等
return true;
}
if (!(obj instanceof Person)){ //不是同一个类型
return false;
}
Person per = (Person)obj;
if (this.name.equals(per.name)&&this.age==per.age){
return true;
}else {
return false;
}
}
public Person(String name,int age){
this.name = name;
this.age = age;
}
public String toString(){ //覆写了toString()方法
return "姓名:" + this.name + ",年龄:" + this.age;
}
}
public class Demo00 {
public static void main(String args[]) {
System.out.println(new Person("张三",30).equals("hello"));
}
}
Object可以接收任意类型的对象引用。
abstract class A{
public A(){
this.print();
}
public abstract void print();
}
class B extends A{
private int x = 100;
public B(int x){
this.x = x;
}
public void print(){
System.out.println("x=" +x);
}
}
public class Demo02 {
public static void main(String args[]) {
A a = new B(10);
}
}
子类对象的实例化过程:先去调用父类中的构造方法,之后在执行子类自己的构造方法
父类的构造方法执行完之后实际上是为了父类中的属性初始化了,但是未执行完的话,子类的构造方法就永远不可能调用,那么,子类中的所有属性都无法初始化,无法初始化,那么默认值就是0
转载请注明来源