java的Object类理解和接口的定义

一、Object类简单理解

我们刚开始接触到java时,最常做的是如何使用class关键字定义一个类,在这其中就应用到了继承的原理,因为所有的类都直接或者间接继承了java.lang.Object类。Object类是一个很特殊的类,它是所有类的父类,是java类层中的最高层类。当创建一个类时,总是在继承,除非某个类已经要从其他类继承,可见java中的每个类都源于java.lang.Object类。

例如String、Integer、Random等等都是继承于Object类,除此之外,自己定义的类也都是继承Object类。因为所有的类都是Object类的子类,所有通常会把extends Object关键字给省略。

class Son{ //自定义的一个类,名字为Son

    //代码

}

其实上面的类等价于下面的形式


class Son extends Object{//上下两中形式等价,其实就是一个类
    //代码
}

二.Object类的常用方法

在Object类中主要包括了clone()、finalize()、equals()、toString()等方法,其中最常用的两个方法为equals()和toString()方法。由于所有类都继承Object类,所以任何类都可以重写Object类的方法;

注意:Object类中的getClass()、notify()、notifyAll()、wait()等方法不能被重写,因为这些方法为final类型。

*getclass()方法

getClass()方法是Object类定义的方法,他会返回对象执行时实例的Class实例,然后使用此实例调用getName()方法可以得到类的名称

语法如下:

getClass().getname();

可以将getclass()方法与toString()方法联合使用。

*toString()方法

toString()方法的功能是将一个对象返回为字符串形式,它会返回一个String实例对象。在实际应用中通常重写toString()方法,为提供一个特定的输出模式。当这个类转换为字符串或与字符串连接时,将自动调用重写的toString()方法。

在项目中创建一个ObjectTest类,在类中重写Object类的toString()方法,并在主方法中输出该类的实例对象。

package Demo;

public class ObjectTest {
	public String toString(){
		return "在"+getClass().getName()+"类重写toString()方法";
	}
	public static void main(String []args){
//		ObjectTest obj=new ObjectTest();
//		String s=obj.toString();
//		System.out.println(s);
		System.out.println(new ObjectTest()); //这一句代码将此类对象转换成字符串,与上述三行代码的执行结果一样
	}
}

输出效果图:

在本类的事例中重写了Object的toString()方法,在子类的toString()方法中使用Object类中的getClass()方法获取当前运行的类名,定义一段输出字符串,当用户打印ObjectInstace类对象时,将自动调用toString()方法;

*equals()方法

据我所知好友一种比较的方法就是使用“==”运算符,“==”运算符比较的是两个对象的引用是否相等,而equals()方法比较的是两个对象的实际内容。

下面我举一个实例,调用equals()方法来判断两个对象或者字符串是否相等。

public class Equals {//自定义类

}

public class TestEquals {
public static void main(String []args){
	String s1="hello";		//实例化两个对象
	String s2="hello";
	System.out.println(s1.equals(s2));//使用equals()方法调用,比较的是内容,返回true
	System.out.println(s1==s2);//两个变量s1、s2指向的是统一个地址,并没有new一个新的对象;比较的是地址,返回true
	
	String s3=new String("abc");
	String s4="abc";
	System.out.println(s3==s4);//此时它们的地址不同返回的是false
	
	Object o1 =new Object();
	Object o2 =new Object();
	System.out.println(o1.equals(o2));//Object类中的equals方法比较的是两个对象的引用,返回false

    Equals e1 = new Equals();
	Equals e2 = new Equals();
	System.out.println(e1.equals(e2));//两个自定义类使用equals()方法进行比较,比较的是地址,返回false
}
}

在上述实例的结果中可以看出,两个自定义类的对象进行比较,比较的是它们的地址,调用equals()方法,返回值是false。要想比较的是内容,必须重写equals()方法;

三.接口的定义

接口是抽象类的延伸,可以将它看做是纯粹的抽象类,接口中的所有方法,都没有方法体。

接口使用interface关键字进行定义,其如法如下所示:

public interface Shape{
    public static final int a=3;定义一个常量
    public abstract void work();//接口内的方法,public、abstract关键字都可以省略
}

注意: ,在借口中定义的方法必须是public或者abstract形式,其他修饰权限不被编译器认可,即使不将方法声明为public形式,它也是public形式,在接口中定义任何字段自动是static和final的;

一个类要实现接口可以使用implements关键字:

public class Equals implements InterfaceTest{
public void work(){
	System.out.println("方法重写成功");
}
}

可以在继承一个类的同时还能实现接口:

public class Equals extends Demo implements InterfaceTest{
    public void work(){
	    System.out.println("方法重写成功");
    }
}

也可以定义一个接口继承另一个接口:

interface in1{

}

interface in2 extends in1{

}

一个类可以实现多个接口:接口与继承

class 类名 implements 接口1,接口2,....{

}

猜你喜欢

转载自blog.csdn.net/coder150806/article/details/84589390