一、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,....{
}