final关键字
为什么会有final:
由于继承中有一个方法重写的现象,而有时候我们不想让子类去重写父类的方法.这对这种情况java就给我们提供了一个关键字: final
final概述:
final关键字是最终的意思,可以修饰类,变量,成员方法
final关键字修饰类,方法以及变量的特点
final修饰特点:
- 修饰类: 被修饰类不能被继承
- 修饰方法: 被修饰的方法不能被重写
- 修饰变量: 被修饰的变量不能被重新赋值,因为这个量其实是一个常量
代码示例:
final修饰成员变量:
1 | public class MyTest { |
上述代码输出结果为:
1 | 10 |
final修饰类:
1 | public class MyTest{ |
上述代码对类进行了final修饰,运行上述代码,会报错。
B类无法成功继承A类
final修饰成员方法:
1 | public class MyTest { |
通过上述代码可以看出,通过final关键字修饰了成员方法,执行上述代码会报错,test()无法覆盖。
可知,被final修饰过的成员方法不能被子类重写。
final关键字修饰局部变量
- 基本类型,是值不能被改变
- 引用类型,是地址值不能被改变
多态的概述及其代码体现
概述
某一个事物,在不同时刻表现出来的不同状态。
举例:
1 | Cat c=new Cat(); |
猫可以是猫的类型。猫 m = new 猫();
同时猫也是动物的一种,也可以把猫称为动物。动物 d = new 猫();
多态前提
- 要有继承关系。
- 要有方法重写。 其实没有也是可以的,但是如果没有这个就没有意义。
- 要有父类引用指向子类对象。
父 f = new 子();
代码示例:
1 | public class MyTest { |
上述代码就是对多态的举例,运行结果为:
1 | 猫爱白天睡觉 |
多态中的成员访问特点
多态中的成员访问特点
- 成员变量,编译看左边,运行看左边。
- 构造方法,创建子类对象的时候,会访问父类的构造方法,对父类的数据进行初始化。
- 成员方法,编译看左边,运行看右边。
- 静态方法,编译看左边,运行看左边(静态和类相关,算不上重写,所以,访问还是左边的)。
多态的好处
多态的好处
- 提高了代码的维护性(继承保证)
- 提高了代码的扩展性(由多态保证)
多态的弊端
通过多态的弊端引出问题:
不能使用子类特有的功能
解决方法:
把父类的引用强制转换为子类的引用。(向下转型)
向上转型和向下转型
1.向上转型(upcasting)
子—->父 自动类型提升
2.向下转型(downcasting)
父—->子 强制类型转换
- 注意:无论是向上转型还是向下转型,两个类之间必须要有继承关系
代码示例:
父类: 动物类
1 | public class Animal { |
子类1:猫类
1 | public class Cat extends Animal{ |
子类2:狗类
1 | public class Dog extends Animal { |
测试类1:没转型,正常调用
1 | public class Test { |
测试类2:
1 | public class Test2 { |
静态绑定和动态绑定
静态绑定:编译阶段a1引用绑定的是Animal类中的eat()方法。
动态绑定:但是运行阶段,堆中的对象实际上是Cat类型,而Cat已经重写了eat方法,所以程序在运行阶段对象的绑定的方法时Cat中的eat方法
instance可以判断类型
用法:
1.instanceof作为运算符返回的结果是boolean类型 2.(引用 instanceof 类型)----->true/false 例如:(a instanceof Cat) 如果是true,则a指向堆中的对象是Cat类型