Java的基类与对象的比较和final关键字

17 阅读3分钟

基类

  • 我们发现每个类中对toString方法都有@Override注解,可以我们发现在一些子类的父类中并没有toString方法,但是ide却没有报错,这是因为所有类中都有一个父类Object,我们称这个Object类为基类,在object基类中就有toString方法,我们写的toString方法就是重写了Object.toString方法

    • 实际上当我们在一个类中没有使用Object而输出对象的时候,输出的@对象名称+对象地址就是在基类中的toSring要求输出的内容,每次打印对象就相当于跳转到基类开始找toString方法,而我们自己的类中的toString就相当于时对toString方法的重写,不同的类有不同的toString方法,这也是java多态的体现。
  • 我们可以使用:Object o = new Object();来创建一个基类对象,使用o对象来访问基类中的方法

比较两个对象内容是否相同

  • 判断两个对象内容是否相等使用==自然是不行的,因为==是判断两个变量的值是否全等,而对象是引用数据类型,对象的变量保存的是指向对象的引用的地址(类似于C语言的指针),用来判断两个不同的对象内容是否相等显然是不行的,因为这样就相当于在比较两个对象的地址是否相等了。
  • 在之前学习字符串的时候,我们说比较两个字符串是否相等,需要使用str.equals(),我们发现这个函数来重写于基类object,在object.equals中的源代码时传入两个对象并进行比较,那么是不是说明也可以用它来比较两个对象是否相同,答案时不行的,因为在基类中equals方法是将两个对象直接传入(传入的时对象名和地址),而不是对象内容。
//使用这段代码创建一个基础类,并使用euqals,按住ctrl键点击equals可以查看到在基类中equals的源代码
Object o = new Object();  
o.equals();
-------------------------------Object 中equals方法源码内容-----------------------------------
//查询到基类中equala原代码
public boolean equals(Object obj) {  
   return (this == obj);  
}//发现java给我们的基础思路是传入一个对象,并和调用equals方法的对象进行比较
//有了基础模板下面我们就可以对其进行重写了

image.png

  • 这时候我们就可以在子类中对equals()函数进行重写满足我们要求
public class Student extends People{
        @Override  
	public boolean equals(Object obj) {  
	    if (obj instanceof Student){  
	        Student stu = (Student) obj;// 向下转型
	        return number == stu.number && getName().equals(stu.getName()); 
	        //比较各个字段是否相等,如果相等返回True  
	//这里因为getName()为String类型是str类的实例化对象,所以我们用到了str.equals()  
	    }else{  
	        return false;  
	    }  
	}
}
  • 写个测试用例
Student laosun = new Student(10, 18, "老孙", 1);
Student laosun1 = new Student(10, 18, "老孙", 1);
System.out.println("是否相等:"+laosun1.equals(laosun)); //是否相等:true

final关键字

  • final 关键字是最终的意思,可以修饰(方法,类,变量)

  • final 修饰的特点

    • 修饰方法:表明该方法是最终方法,不能被重写
    • 修饰类:表明该类是最终类,不能被继承
    • 修饰变量:表明该变量是常量,不能再次被赋值