1、final关键字
参考链接:https://www.cnblogs.com/dolphin0520/p/3736238.html
个人总结:
1)修饰类、变量和方法,防止类被继承,防止继承类重写方法,防止变量被修改。
2)当用final作用于类的成员变量时,成员变量(注意是类的成员变量,局部变量只需要保证在使用之前被初始化赋值即可)必须在定义时或者构造器中进行初始化赋值,而且final变量一旦被初始化赋值之后,就不能再被赋值了
3)引用上面参考链接的部分原文:
1.类的final变量和普通变量有什么区别?
当用final作用于类的成员变量时,成员变量(注意是类的成员变量,局部变量只需要保证在使用之前被初始化赋值即可)必须在定义时或者构造器中进行初始化赋值,而且final变量一旦被初始化赋值之后,就不能再被赋值了。
那么final变量和普通变量到底有何区别呢?下面请看一个例子:
1
2
3
4
5
6
7
8
9
10
11
|
public
class
Test {
public
static
void
main(String[] args) {
String a =
"hello2"
;
final
String b =
"hello"
;
String d =
"hello"
;
String c = b +
2
;
String e = d +
2
;
System.out.println((a == c));
System.out.println((a == e));
}
}
|
![](https://i-blog.csdnimg.cn/blog_migrate/81178cc93a2a3bb5048d90d76e7ec935.gif)
true false
大家可以先想一下这道题的输出结果。为什么第一个比较结果为true,而第二个比较结果为fasle。这里面就是final变量和普通变量的区别了,当final变量是基本数据类型以及String类型时,如果在编译期间能知道它的确切值,则编译器会把它当做编译期常量(目前本人的理解就是看成固定的内存地址)使用。也就是说在用到该final变量的地方,相当于直接访问的这个常量,不需要在运行时确定。这种和C语言中的宏替换有点像。因此在上面的一段代码中,由于变量b被final修饰,因此会被当做编译器常量,所以在使用到b的地方会直接将变量b 替换为它的值。而对于变量d的访问却需要在运行时通过链接(动态的内存地址)来进行。
若有理解偏差,望大神不吝赐教。
4) 引用变量被final修饰之后,虽然不能再指向其他对象,但是它指向的对象的内容是可变的。5)很多时候会容易把static和final关键字混淆,static作用于成员变量用来表示只保存一份副本,而final的作用是用来保证变量不可变。
2、== 和 equals的区分
参考链接:https://www.zhihu.com/question/26872848
个人总结:
1)Java 语言里的 equals方法其实是交给开发者去覆写的,让开发者自己去定义满足什么条件的两个Object是equal的。
2)
equals的含义:equals()方法定义在Object类里面,根据具体的业务逻辑来定义该方法,用于检查两个对象的相等性。
== 的含义:“==”或等号操作在Java编程语言中是一个二元操作符,用于比较原生类型和对象。
3)区分:
==常用于比较原生类型,而equals()方法用于检查对象的相等性。
如果==和equals()用于比较对象,当两个引用地址相同,==返回true。
4)equals的默认实现还是使用的 == 操作符,但是业务中还是需要开发者去自定义。
public boolean equals(Object obj) {
return (this == obj);
}