final
final关键字代表最终、不可改变的。(最终类、不能继承)
**含义:**当前类不能有任何子类,一定有父类
public final class 类名称{
//……
}
常用的四种方法:
1.可以用来修饰一个类
如果一个类是final的,那么其中所有的成员都无法进行、覆盖重写(因为没有子类)。
2.可以用来修饰一个方法
当final关键字修饰方法的时候,这个方法就是最终方法,也就是不能覆盖重写。
final 返回值类型 方法名称(参数列表){
//……
}
对于类、方法来说abstract(必须覆盖重写)和final不能同时使用,因为矛盾。
3.可以用来修饰一个局部变量
一旦使用final用来修饰局部变量,那么这个变量不能进行更改。
“一次赋值,终生不变。”
只要保证一次复制即可。
(final int num=30;)=(final int num;num=30;)
i. 对于基本类型来说,不可变说的是变量当中的数据不可变。
ii.对于引用变量来说,不可变说的是变量当中的地址值不可变。
4.可以用来修饰成员变量
对于成员变量,如果使用final关键字修饰,也不可变。
i. 由于成员有默认值,所有用了final之后必须手动赋值,不会再给默认值。
ii. 对于final的成员变量,要么使用直接赋值,要么通过构造方法赋值。(二选一)
iii.必须保证类当中所有重载的构造方法,最终都会对final的成员变量进行赋值。
Object
java.lang.Object类是Java语言中的根类,即所有的父类。它中描述的所有方法子类都可以使用。在对象实例化的时候,最终的父类就是Object。
如果一个类没有特别指定父类,那么就默认则继承自Object类。例如:
public class MyClass/*extend Object*/{
//……
}
1.public String toString:返回该对象的字符串表示
2.public boolean equals(Object obj):指定其他某个对象是否与此对象“相等”
Person p=new Person(name:"张三",age:18);
String s=p toString;
System.out.println(s);
//直接打印出来的是name的地址值(调用的toString)
//重写
public String toString(){
return"a b c";
}//a b c
//看一个类是否重写了toString,直接打印这个对象即可
3.equals方法源代码:
public boolen equals (Object obj){
return (this==obj);
}//哪个对象调用equals方法,this就是那个对象
/*
参数:Object;
obj:可以传递任意对象
==比较运算符:返回一个布尔值
基本数据值:比较的值
引用数据类型:比较两个对象的地址值
*/
Person p1=new Person(name:"张三",age:18);
Person p2=new Person(name:"李四",age:19);
p1=p2//把p2的地址值赋给p1
boolean b=p1.equals(p2);
System.out.println(b);//true
重写Object类的equals方法,比较两个对象的属性。隐含这一个多态→
弊端:无法使用子类特有的内容。
解决方法:可以使用向下转型(强转)把obj类型转为Person。
getClass()!=o.getClass;//反射技术,判断o是否是Person类型
//等效于
(obj instanceof Person)
3.Objects类(java.util.objects类)
它由一些静态的实用方法组成,这些方法是null-save(空指针安全的)或null-tolerant(容忍空指针的),用于计算机对象的hashcode、返回对象的字符串表示形式、比较两个对象。
在比较两个对象的时候,Object的equals方法容易抛出空指针异常,而Objects类中的equals方法就优化了这个问题。方法如下,源代码:
public static boolean equals(object a,object b){//判断两个对象是否相等
return(a==b)|(a!=null&&a.equals(b));
}