1、Object介绍
1、Object是所有类的父类,一个类如果没有使用extends关键字明确表示继承关机,则默认继承Object类,包括数组
2、继承了Object,那么在Object中方法就能使用了。
3、Object中有很多方法,比如说equal方法是比较两者的引用是否指向同一个空间,有很多继承者可以对equal进行重写,典型的就是String中的equal,可以去看看下面的代码;
Animal one=new Animal("huahua",2);
Animal two=new Animal("huahua",2);
boolean flag=one.equal(two);
String st1=new String("hello");
String st2=new String("hello");
boolean flag1=st1.equal(st2);
上面这段代码中的flag很明显是false,因为Object是比较两个对象的引用是否相同,很明显one和two指向的在堆中两个不同的内存空间。但是flag1的就是true,以为String中是重写了equal方法,只比较内存中的内容值是否相等。
4、假如我们要比较Animal类的对象值是否相等,我们就要在Animal类中重写自己的equal方法:
public boolean equals(Object obj){
if(obj==null)
return false;
Animal temp=(Animal)obj;
if(this.getName().equal(temp.getName())&&this.getMonth().equal(obj.getMonth()))
return true;
else
return false;
}
public boolean equals(Animal obj){
if(obj==null)
return false;
if(this.getName().equal(temp.getName())&&this.getMonth().equal(obj.getMonth()))
return true;
else
return false;
}
所以这就是我们自己的逻辑,当Animal的实例化的两个对象的名字和年龄是一样的,我们就认为两者相等。
5、总结:
(1)继承Object中的equals方法时,比较的两个引用是否指向同一个对象
(2)子类可以通过重写equals方法,改变比较的内容。
(3)继承Object中的toString方法,输出对象的字符串的标识形式:在官网上是这样:
getClass().getName() + '@' + Integer.toHexString(hashCode());
在真正打印一个对象的时候:com.imooc.animal.Cat@7852e922,这就是官网上的形式;
2、final关键字
1、当我们不希望和这个类被继承,不允许这个方法被重写等等时,我们就可以使用final去修饰。
2、final修饰类:在官网上我们可以去看看:比如说String这个类,官网上写的是:
public final class String
那就很明显,这个类不能被继承,你无法写它的子类。在书写的过程中。final和public的位置可以互换。
3、final修饰方法:不允许被子类重写,但是子类可以正常使用。
4、final修饰变量:final修饰变量分为两种情况,一个是修饰成员变量,一个是修饰方法中的成员变量:
(1)final修饰局部变量,只要在使用之前被赋值就行,一旦赋值就不允许被修改;
(2)final修饰成员方法:要么在声明处就去赋值;要么在构造函数和构造代码块去对final修饰的成员变量赋值;
5、final修饰引用数据类型,引用地址是否可以发生改变?里面的属性值是否能发生改变?
final修饰引用数据类型,引用地址不能发生改变,但是里面的属性可以进行修改;
final Cat one=new Cat(1,"fanafn");
one=new Cat(1,"huahu"); //也就是说用final修饰的类对象,这个对象在堆中的内存空间地址就不能改了,但是堆中内的数据内容可以修改
6、如果想让一个变量不被修改并能全局使用,可以将static和final一起使用。
7、final不能修饰构造方法前面。