&和&&的区别
&和&&都是Java中的逻辑运算符,用于判断两个布尔表达式的逻辑关系(&和&&的优先级不同,&&的优先级比&高),它们的区别如下:
1. &是逻辑与运算符,它的两个操作数都会被求值,只有当两个操作数都为true时,结果才为true;即使第一个操作数为false,第二个操作数也会被求值
2. &&也是逻辑与运算符,它的两个操作数都会被求值,但是当第一个操作数为false时,第二个操作数不会被求值,直接返回false;只有当第一个操作数为true时,才会继续求值第二个操作数
final 有什么用?
用于修饰类、属性和方法;
- 被final修饰的类不可以被继承
- 被final修饰的方法不可以被重写
- 被final修饰的变量不可以被改变
this、super关键字的用法
this | super | |
含义 | this是自身的一个对象,代表当前对象本身 | super相当于是指向当前对象的父类的引用 |
用法 |
|
|
区别 |
|
|
相同点 |
|
构造器(constructor)是否可被重写(override) ?
构造器(constructor)不是普通的方法,因此不能像方法一样被重写(override);构造器是用来创建对象的特殊方法,它在创建对象时被调用,用来初始化对象的成员变量。每个类都有自己的构造器,如果没有显式地定义构造器,Java会自动生成一个默认的构造器
虽然构造器不能被重写,但是可以通过继承来实现构造器的复用;子类可以使用super关键字调用父类的构造器,从而实现对父类构造器的重用。如果子类没有显式地调用父类的构造器,Java会默认调用父类的无参构造器。如果父类没有无参构造器,子类必须显式地调用父类的带参构造器
需要注意的是,子类的构造器必须先调用父类的构造器,然后再进行自己的初始化操作。如果子类没有显式地调用父类的构造器,Java会默认调用父类的无参构造器,如果父类没有无参构造器,编译会出错。因此,在使用继承时需要注意构造器的调用顺序和参数传递问题
重载(Overload)和重写(Override)的区别?
重载(Overload)和重写(Override)是Java中两个重要的概念,它们的区别如下:
定义 | 重载指在同一个类中定义多个同名但参数类型或个数不同的方法;重写指在子类中重新定义父类中已有的方法 |
---|---|
参数 | 重载方法的参数类型或个数必须不同,否则会出现编译错误;重写方法的参数类型和个数必须与父类中被重写的方法相同 |
返回值 | 重载方法的返回值类型可以相同也可以不同,但是不能只有返回类型不同;重写方法的返回值类型必须与父类中被重写的方法相同或是其子类 |
访问修饰符 | 重载方法可以具有不同的访问修饰符,但是不能比父类中被重载的方法的访问修饰符更严格;重写方法的访问修饰符必须比父类中被重写的方法的访问修饰符更宽松 |
静态方法 | 重载可以包括静态方法,但是不能只有静态性质不同;重写方法不能是静态方法 |
父类和子类 | 重载方法必须在同一个类中定义;重写方法必须在子类中定义 |
重载的方法能否根据返回类型进行区分?
在Java中,重载的方法不能仅根据返回类型进行区分;这是因为Java编译器在重载方法时,只会考虑方法名和参数列表,而不会考虑返回类型;如果两个方法的方法名和参数列表相同,但是返回类型不同,那么编译器会认为这是两个相同的方法,从而导致编译错误
== 和 equals 的区别是什么
== : 它的作用是判断两个对象的地址是不是相等;即判断两个对象是不是同一个对象(基本数据类型 == 比较的是值,引用数据类型 == 比较的是内存地址)
equals() : 它的作用也是判断两个对象是否相等;但它一般有两种使用情况:
- 情况1:如果一个类没有重写“equals”方法,那么它将继承Object类的“equals”方法,该方法比较的是两个对象的内存地址是否相同,即与“==”比较的结果相同
- 情况2:如果重写了equals方法,那么就是比较内容是否相同,例如String类的equals方法就是重写了的
String中的equals方法是被重写过的,所以String的equals方法比较的是对象的内容是否相同
hashCode 与 equals
两个对象的 hashCode() 相同,则 equals() 也一定为 true,对吗?
1、如果两个对象相等,则hashcode一定也是相同的
2、两个对象相等,对两个对象调用equals方法返回true
3、两个对象有相同的hashcode值,它们也不一定是相等的
为什么重写equals时必须重写hashCode方法?
如果只重写了 equals 方法,那么默认情况下,假设存了两个自定义的内容相同的对象到Set中,Set 进行去重操作时,会先判断两个对象的 hashCode 是否相同,此时因为没有重写 hashCode 方法,所以会直接执行 Object 中的 hashCode 方法,而 Object 中的 hashCode 方法对比的是两个不同引用地址的对象,那么得到的两个Hash值是不一样的,那么 equals 方法就不会执行了,这两个对象就会被判断为不是相等的,于是就在 Set 集合中插入了两个相同的对象(这里的相同是指的内容相同)
但是,如果在重写 equals 方法时,也重写了 hashCode 方法,那么在执行判断时会去执行重写的 hashCode 方法,此时对比的是两个对象的所有属性的 hashCode 是否相同,于是调用 hashCode 返回的结果就是 true,再去调用 equals 方法,发现两个对象确实是相等的,于是就返回 true 了,因此 Set 集合就不会存储两个一模一样的数据了,于是整个程序的执行就正常了
总结
hashCode 和 equals 两个方法是用来协同判断两个对象是否相等的,采用这种方式的原因是可以提高程序插入和查询的速度,如果在重写 equals 时,不重写 hashCode,就会导致在某些场景下,例如将两个相等的自定义对象存储在 Set 集合时,就会出现程序执行的异常,为了保证程序的正常执行,所以我们就需要在重写 equals 时,也一并重写 hashCode 方法才行。
标签:java,对象,重写,equals,基础知识,面试,父类,方法,hashCode From: https://blog.csdn.net/weixin_63164764/article/details/139858020