Java基础(八)——面向对象基础(三)
一、继承
1、extends——继承
比如猫或者狗,都是动物,他们都有共同特征,所以可以统称一些有这些特征的生物为动物。它们都有四条腿,都会吃,会睡觉。但彼此都有不同。
如果创建猫类和狗类,会发现有很多相同的属性和方法。所以可以把共同的方法抽取出来,为动物类,让猫类和狗类去继承这个类,有自己独特的属性或者方法可以再独立创建。
多个类存在相同的属性或者方法,,把相同的属性或者方法抽取到父类中然后子类继承。
先创建一个动物类:
然后,子类可以去继承父类(关键字,extends),且子类空空如也:
然后,因为子类继承了父类,所以父类的方法和属性,子类也可以调用:
2、父类的私有属性/方法无法访问
如果父类的属性或者方法私有化,则子类无法访问。
3、子类无法继承父类的构造方法
子类无法继承父类的构造方法。无论是有参还是无参。
猫类就继承,类里面什么都没有。如果子类可以继承父类的构造方法,那么这里不应该标红。所以子类是无法继承父类的构造方法。
4、super关键字
a、子类的构造方法中默认存在super()
但是,运行后,还是会出现无参构造方法的输出:
这里就要引入 super关键字。跟this关键字一样。这个是指向当前对象的父类。
- super.属性 ————调用父类的属性
- super.方法()——调用父类的方法
- super()————调用父类的无参构造方法
之所以子类不能继承的情况下还能输出这个语句,是因为子类的构造方法中默认存在super()。
b、super和this调用构造方法只能存在一个
看上图可以知道,谁在第一行,谁不会报错,因此,this和super只能存在一个,且,this和super调用构造方法必须在第一行。
5、方法的重写
a、方法重写
当父类跟子类有一模一样的方法,方法里面的功能不同时,会执行子类的方法,这就叫方法的重写:
运行结果:
b、方法重写的要求
为什么要重写方法?
因为父类方法满足不了子类需求
- 必须发生在继承关系中
- 方法名相同
- 参数列表一致
- 子类重写的方法返回值必须跟父类方法的返回值一致
- 子类重写的方法访问修饰符必须跟父类的访问修饰符权限一样或者更大
6、重写VS重载
1、重载是方法的扩展,重写是方法的覆盖。
2、重载的参数列表必须不一致,重写的参数列表必须一致。
3、重载不一定要发生在继承关系中,重写一定要在继承关系中
4、重载与返回值类型没关系,重写的返回值必须一致
5、重载跟访问修饰符无关,重写必须和父类的一致或者比父类的更大(作用范围更广)。
二、访问修饰符
1、四个目前学过的访问修饰符
目前位置接触过的访问修饰符有两个:public和private。
还有另外两个:
protected 和 default。
- public—————公开的
- protected———受保护的,同包下都可以使用,不同包需要子类才可以使用
- defalut————默认的,只能在当前包下使用
- private————私有的,只能在当前类中使用
三、final——最终的
1、final修饰变量
可以发现,会标红,这是因为 final 修饰的变量需要立马初始化:
且不能重新赋值:
被 final 修饰的变量,首先需要全大写:
且一般与 static 一起使用,形成常量,一般当做状态值(比如网页的状态码)。如果有多个单词,每个单词间用下划线 _ 连接:
这个全大写并不是程序要求,而是一种约定俗成。
2、final修饰方法
先修饰一个普通方法:
创建并调用:
运行结果:
可以看到,跟普通使用没区别。但是,在其他方面有区别:
final:最终的
- 修饰变量:形成常量,需要手动初始化,不能重新赋值,常量名大写,多个单词用“_”(下划线)拼接。与static 一起使用形成静态常量,一般当做状态值使用。
- 修饰方法:为最终方法,不能被重写。
- 修饰构造方法:不能修饰
- 修饰构造代码块:不能修饰
- 修饰类:类无法被继承