Java多态
1.多态规则(前提): 一种事物的多种形态
1.类与类之间 要产生联系 继承关系
2.要有方法重写(没有方法的重写 多态的意义不大)
3.核心: 父类引用(指针)指向子类空间(声明方式)
多态时 调用成员变量 和 调用成员方法
多态 调用成员变量时
Father f = new Son();
简单记 编译和运行 都看等号 左边(父类引用)
当使用父类引用 指向子类空间的时候
父类的引用 只能访问到
子类空间中 属于 父类的那部分(super访问的部分)
当本类引用 指向本类空间的时候
本类的引用 可以访问到 整个 空间
编译时:
寻找父类中有没有该方法(看等号 左边)
运行时:
运行时 调用时子类中重写的方法
多态的弊端:
* 使用多态声明对象的时候 无法直接调用子类的特有方法
* 只能通过向下转型后 才能使用子类特有的方法
*
* 多态的好处:
* 1.代码维护性强(这条建立在 继承的基础上)
* 2.方法的扩展性强(核心好处)
2.多态在内存中的体现
3.final关键字
final(关键字)(绝育的)
1.修饰方法 作用 被修饰的 不能被重写
2.修饰变量 作用
被final修饰对象 的 地址不能改变(不能重新指向)
final 修饰的基本数据类型的变量 不能被重新赋值
3.修饰类 作用 被修饰类 不能被继承
// final修饰成员变量 该成员变量 必须有有效的初值
// 被final修饰变量 程序中不能被修改 相当于常量
/*
* 使用的场景
* 一般会与 public static 连用
* 常量命名规范
* 纯大写 多个单词用下划线 分开
*
*/
public static final int USER_NAME = 100010;
// 参数也可以被final修饰 相当于修饰的是局部变量
public void fun(final int i) {
}
5.// 封装一个方法 创建刀
// 接收的时候 相当于 WQ wq = new D();向上转型
// 这时候 只要是武器类的子类 都能使用这个方法
public static void makeWQ(WQ wq) {
wq.hit();
// 判断一下 是不是 刀类型
// 如果是刀 再进行向下转型
// wq instanceof D 判断 wq是否是D 类型
if (wq instanceof D) {
// 向下转型
D d = (D)wq;
// 调用特有的方法
d.lianDao();
}
// 判断是不棍
if (wq instanceof G) {
G g = (G)wq;
g.lianGun();
}
}
public static void main(String[] args) {
makeWQ(new D());
makeWQ(new G());
}
}
// 武器类
class WQ{
public void hit() {
System.out.println("挥武器");
}
}
// 刀类
class D extends WQ{
@Override
public void hit() {
System.out.println("挥刀 -- 砍人");
}
// 练刀方法
public void lianDao() {
System.out.println("练刀");
}
}
// 棍类
class G extends WQ{
@Override
public void hit() {
System.out.println("挥棍 ---- 敲人");
}
// 练棍
public void lianGun() {
System.out.println("练棍");
}
}