Java基础15-final、static关键字和Object类
一、final关键字
1.什么是final关键字
继承的出现提高了代码的复用性,并方便开发。但随之也有问题,有些类在描述完之后,不想被继承,或者有些类中的部分方法功能是固定的,不想让子类重写。可是当子类继承了这些特殊类之后,就可以对其中的方法进行重写,那怎么解决呢?
要解决上述的这些问题,需要使用到一个关键字final,final的意思为最终,不可变。final是个修饰符,它可以用来修饰类,类的成员,以及局部变量。
2.final的特点
①修饰类不可以被继承,但可以继承其他类
②final修饰的方法不可以被覆盖,但父类中没有被final修饰方法,子类覆盖后可以加final。
③修饰的变量称为常量,这些变量只能赋值一次。
④引用类型的变量值为对象地址值,地址值不能更改,但是地址内的对象属性值可以修改。
⑤ 修饰成员变量,需要在创建对象前赋值,否则报错。(当没有显式赋值时,多个构造方法的均需要为其赋值。)
二、static关键字
1.什么是static
当在定义类的时候,类中都会有相应的属性和方法。而属性和方法都是通过创建本类对象调用的。当在调用对象的某个方法时,这个方法没有访问到对象的特有数据时,方法创建这个对象有些多余。可是不创建对象,方法又调用不了,这时就会想,那么我们能不能不创建对象,就可以调用方法呢?
以上问题就可以通过static关键字来实现。static它是静态修饰符,一般用来修饰类中的成员。
2.static的特点
①被static修饰的成员变量属于类,不属于这个类的某个对象。
②被static修饰的成员可以并且建议通过类名直接访问。
访问静态成员的格式:
类名.静态成员变量名
类名.静态成员方法名(参数)
注意:
静态内容是优先于对象存在,只能访问静态,不能使用this/super。静态修饰的内容存于静态区。
同一个类中,静态成员只能访问静态成员
这是因为,static修饰的方法和变量,属于类,先进方法区,非静态的变量在他们进方法区时还没有产生。
main方法为静态方法仅仅为程序执行入口,它不属于任何一个对象,可以定义在任意类中。
3.静态常量
上边我们知道,final修饰的变量是常量
那final和static共同修饰的就是静态常量了
定义格式:
public static final 数据类型 变量名 = 值;
当我们想使用类的静态成员时,不需要创建对象,直接使用类名来访问即可。
注意:
接口中的每个成员变量都默认使用public static final修饰。
所有接口中的成员变量已是静态常量,由于接口没有构造方法,所以必须显示赋值。可以直接用接口名访问。
interface Inter { public static final int COUNT = 100; }
三、Object类
Object是java中所有类的根类,是祖宗级的。
1.Object为什么是所有类的根类,到底什么是Object类?
* object本身指对象的意思。我们发现所有的对象都具有某一些共同的行为,所以,我们抽象出一个类object对象类,其他都会继承于object类,也拥有object类中的方法
* 引用数据类型:类/接口/数组,引用类型又称为对象类,所谓数组的数组变量名称,应该指数组对象。
2.Object类常见方法
* 1.protected void finalize():垃圾回收器再回首某一个对象之前,会调用该方法,做扫尾操作,该方法我们不要去调用
* 2.getclass(),返回当前对象的真实类型。在反射中用的多。
* 3.hashcode(),返回对象的哈希码值,hashcode决定了对象在哈希表中的存储位置。不同对象的hashcode是不一样的
* 4.equals(),拿当前对象(this)和参数obj作比较,
* 在object类中的equals方法,本身和==符号相同,都是比较对象的内存地址
* 官方建议:每个类都应该覆盖equals方法,不要比较内存地址,而失去比较我们关心的数据
* 5.toString():把一个对象转换为字符串。
* 默认情况下打印对象,打印的是对象的十六进制的hashCode值
* 官方建议我们:应该每个类都应该覆盖toString返回我们关心的数据