Final、Super这两个关键字以及Object的解释

1.final关键字

 使用final关键字做标识有“最终的”含义。

  1. final 修饰类,则该类不允许被继承。

  2. final 修饰方法,则该方法不允许被覆盖(重写)

  3. final 修饰属性,则该类的该属性不会进行隐式的初始化,所以 该final 属性的初始化属性必须有值,或在构造方法中赋值(但             只能选其一,且必须选其一,因为没有默认值!),且初始化之后就不能改了,只能赋值一次

  4. final 修饰变量,则该变量的值只能赋一次值,在声明变量的时候才能赋值,即变为常量

2.super关键字

 在对象的内部使用,可以代表父类对象。

  1、访问父类的属性:super.age

   2、访问父类的方法:super.eat()

 super的应用:

 首先我们知道子类的构造的过程当中必须调用父类的构造方法。其实这个过程已经隐式地使用了我们的super关键字。

 这是因为如果子类的构造方法中没有显示调用父类的构造方法,则系统默认调用父类无参的构造方法。

 那么如果自己用super关键字在子类里调用父类的构造方法,则必须在子类的构造方法中的第一行

 要注意的是:如果子类构造方法中既没有显示调用父类的构造方法,而父类没有无参的构造方法,则编译出错。

(补充说明,虽然没有显示声明父类的无参的构造方法,系统会自动默认生成一个无参构造方法,但是,如果你声明了一个有参的构造方法,而没有声明无参的构造方法,这时系统不会动默认生成一个无参构造方法,此时称为父类有没有无参的构造方法。)

3.Object类

 Object类是所有类的父类,如果一个类没有使用extends关键字明确标识继承另一个类,那么这个类默认继承Object类。

 Object类中的方法,适合所有子类!!!

 那么Object类中有什么主要的方法呢?

 1、toString()

  a. 在Object类里面定义toString()方法的时候返回的对象的哈希code码(对象地址字符串)。

  我们可以发现,如果我们直接用System.out.print(对象)输出一个对象,则运行结果输出的是对象的对象地址字符串,也称为哈希code码。如:

  哈希码是通过哈希算法生成的一个字符串,它是用来唯一区分我们对象的地址码,就像我们的身份证一样。  

  b. 可以通过重写toString()方法表示出对象的属性。

   如果我们希望输出一个对象的时候,不是它的哈希码,而是它的各个属性值,那我们可以通过重写toString()方法表示出对象的属性。

  2、equals()

  a、equals()----返回值是布尔类型。

  b、默认的情况下,比较的是对象的引用是否指向同一块内存地址-------对象实例化时,即给对象分配内存空间,该内存空间的地址就是内存地址。使用方法如:dog.equals(dog2);

  c、 如果是两个对象,但想判断两个对象的属性是否相同,则重写equals()方法。

 以Dog类为例,重写后的equals()方法如下(当然你可以根据自己想比较的属性来重写,这里我以age属性是否相同来重写equals()方法):

 

 上面有四个判断,它们的含义分别是:

  1.判断地址是否相同----if (this == obj),相同则返回true

  2.判断对象是否为空----if (obj == null),为空则返回false

  3.getClass()可以得到类对象,判断类型是否一样-----if (getClass() != obj.getClass()),不一样则返回false

  4.判断属性值是否一样----if (age != other.age),不一样返回false

  5.如果地址相同,对象不为空,类型一样,属性值一样则返回true

 这里要注意的是,理解obj.getClass()得到的类对象和类的对象的区别,以下用图形表示:
      

 可以看到,对于类对象我们关心它属于哪个类,拥有什么属性和方法,比如我和你都是属于“人”这个类对象;而类的对象则是一个类的实例化的具体的一个对象。比如我和你是两个不同的人。

猜你喜欢

转载自blog.csdn.net/Hope_lee/article/details/82085701