java的多态和抽象类

本文详细解析了多态原理,包括动态加载和向上/向下转型,展示了如何利用多态提高代码灵活性。此外,介绍了抽象类的概念,抽象方法的特性和继承规则,以及抽象类在设计模式中的应用。重点讲解了抽象类与普通类的区别和关键字如final、abstract和static的作用。

多态和抽象类

多态

原理

多态:在代码中描述是用父类的引用指向子类的对象

java程序运行分成两个阶段:编译,运行

编译阶段:从打开程序到执行运行之前—只能识别=前面的引用类型,不会识别=后面的对象
运行阶段:从运行开始—识别=后面对象,对象开始干活儿

动态机制:(了解)
类型:动态类型,动态绑定,动态加载
动态加载:我们在编译阶段不能确定具体的对象类型,只有到了运行阶段才能确定真正的干活儿
的对象.
多态就是典型的动态加载

在多态下只能直接调用父类有的方法,不能直接调用子类特有的方法

优点

可以提高代码的扩展性,使用之前定义好的功能,后面直接拿来使用,不用再创建新的方法

对象的转型

注意:在多态的前提下再说向上转型,向下转型.
向上转型
对象由子类类型, 转型为父类类型, 即是向上转型。
向上转型是一个隐式转换,相当于自动类型转换, 一定会转型成功。
向上转型后的对象, 只能访问父类中定义的成员。
作用:实现多态

向下转型
对象由父类类型, 转型为子类类型, 即是向下转型。
向下转型是一个显式转换,相当于强制类型转换, 有可能转型失败.
向下转型后的对象, 将可以访问子类中独有的成员。

instanceof关键字

向下转型, 存在失败的可能性。 如果引用实际指向的对象, 不是要转型的类型, 此时强制
转换, 会出现 ClassCastException 异常。
所以, 在向下转型之前, 最好使用 instanceof 关键字进行类型检查。
instanceof:是一个运算符
构成: 对象 instanceof 类或类的子类
原理说明:确定当前的对象是否是后面的类或者子类的对象,是返回true,不是false
作用:进行容错处理,增加用户体验

多态中的方法重写

当向上转型后的对象, 调用父类中的方法。 如果这个方法已经被子类重写了, 此时调用的就是子类的重写实现!

父子类出现同名成员

继承下的调用规则
成员变量:调用子类的
成员方法:调用子类的,子类没有再去调用父类的.
多态下的调用规则:
成员变量:编译的时候能不能访问看父类,运行的时候也看父类
成员方法:编译的时候能不能访问看父类,运行的时候看子类
静态成员方法:编译运行都看父类

抽象类

定义

在继承中,提取父类方法的时候,每个子类都有自己具体的方法实现,父类不能决定他们各自的实
现方法,所以父类干脆就不管了,在父类中只写方法的声明(负责制定一个规则),将方法的实现交
给子类.在类中只有方法声明的方法叫抽象方法,拥有抽象方法的类叫抽象类
abstract:抽象的
声明:不写函数体的函数,可以叫声明
abstract修饰方法:抽象方法
abstract修饰类:抽象类
抽象类的功能:1.可以节省代码 2.可以制定一批规则

抽象方法

抽象方法的特点
抽象方法只有方法的声明, 没有实现。
抽象方法只能定义在抽象类中。

抽象类的继承

抽象方法有一个特点, 就是只能定义在抽象类中。 如果一个非抽象子类继承自一个抽象父
类, 此时, 可以继承到抽象父类中的抽象方法。 那么这个时候, 抽象方法就存在于一个非
抽象的子类中了。 此时会有问题。
所以, 非抽象的子类, 在继承自一个抽象父类的时候, 必须重写实现抽象父类中所有的抽象方法或者将自己也变成抽象类

抽象类的总结

基本点总结:
抽象类不一定有抽象方法,但是有抽象方法的一定是抽象类.
继承了抽象类的子类一定要实现抽象方法,如果不实现就只能将自己也变成抽象的.
抽象类不能直接创建对象,必须通过子类实现,所以抽象类一定有子类
比较普通类与抽象类:
普通类可以直接创建对象
抽象类可以有抽象方法
比较:final,abstract,static,private
三个都是不能与abstract同时存在的关键字
final:被final修饰的类不能有子类,方法不能重写,但是abstract必须有子类,必须重写
static:修饰的方法可以通过类名调用,abstract必须通过子类实现
private:修饰的方法不能重写,abstract必须重写

Java类的多态抽象类是面向对象编程的重要特性。 **多态(Polymorphism)**: 在Java中,多态允许不同类型的对象对同一消息作出响应。它主要有两种形式:方法重载(Overloading)方法覆盖(Overriding)。方法重载是指在同一类中有多个同名方法,但参数列表不同;方法覆盖则是指子类重写父类的方法,提供自己的实现。通过引用父类或接口类型的对象,可以调用其实现的具体方法,体现了“一种接口多种实现”的原则。 **抽象类(Abstract Class)**: 抽象类是一种特殊的类,它不能被实例化,主要用于定义一组共同的属性行为。抽象类可以包含抽象方法(没有实现体的方法,仅声明了方法名返回类型)以及非抽象方法。子类继承抽象类后,如果实现了所有的抽象方法,那么该子类就可以是具体的(non-abstract);如果没有实现所有抽象方法,则子类也需要变为抽象类。 使用场景示例: ```java abstract class Animal { // 抽象类 abstract void sound(); // 抽象方法 } class Dog extends Animal { // 具体子类 @Override void sound() { System.out.println("汪汪汪"); } } class Cat extends Animal { @Override void sound() { System.out.println("喵喵喵"); } } Dog dog = new Dog(); Cat cat = new Cat(); dog.sound(); // 输出:汪汪汪 cat.sound(); // 输出:喵喵喵 ``` 在这个例子中,`Animal`是抽象类,`Dog``Cat`是它的子类并实现了`sound()`方法。通过`Animal`类型的引用,我们可以调用它们各自的`sound()`实现,展示了多态性。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值