JavaSE第八天(多态)

    技术2022-08-10  94

    JavaSE第八天(多态)

    文章目录

    JavaSE第八天(多态)第一节、多态1、理解2、实现多态条件3、分析四大原则 第二节 对象转型(casting)与instanceof1、对象转型(casting)2、instanceof 第三节 抽象类1、抽象类的产生2、抽象类的定义3、 抽象类应用场景 第四节 接口1. 什么是接口2. interface定义接口3. 接口的特征4. 实验5、面向对象三大特征总结 5、面向对象三大特征总结

    第一节、多态

    1、理解

    多态,polymorphism 即多种形态,模糊策略,以不变应万变,使用多态可以编写更加通用的代码。

    多态的概念发展出来,是以封装和继承为基础的。子类以父类的身份出现,但做事情时还是以自己的方法实现。

    相同的事物,调用其相同的方法,参数也相同时,但表现的行为却不同。

    2、实现多态条件

    多态,polymorphism 即多种形态,模糊策略,以不变应万变,使用多态可以编写更加通用的代码。 多态是建立在继承和重写的基础上,是一个运行期的动态绑定行为。

    要发生多态有三个必要条件:要有继承,要有重写,父类引用指向子类对象

    public class Animal { public void eat(){ System.out.println("eat....."); } public void shout(){ System.out.println("shout....."); } } public class Dog extends Animal { //重写 public void shout(){ System.out.println("主人我是旺财....."); } } public class Pig extends Animal{ //重写 public void shout(){ System.out.println("我是世界最聪明的动物....."); } //新增 public void gongDi(){ System.out.println("拱地........."); } }

    由于使用的是父类的引用,使用父类型进行编译,所以发生多态是对新增方法不可见,要使用新增方法必须强制类型。转型为子类方法就可以使用子类独有的方法

    3、分析四大原则

    1) 、继承链,自己没有找父亲;

    2) 、编译看类型+确定方法表,运行找对象

    3) 、就近最优原则:自己没有找父亲

    4) 、发生多态,基类对子类的新增方法不可见

    第二节 对象转型(casting)与instanceof

    1、对象转型(casting)

    数据类型转换可以说是非常让JAVA程序猿头痛的事情了。有时候它在不经意之间就完成了(自动类型转换),有时候却又要求程序员必须手动指定(强制类型转换)。基本数据类型,转换规则还可以通过类型本身空间大小和精度分析明白,而且最多就是丢失精度但运行起来至少是不会报错。可是面对引用数据类型,这个“坑”就大了:有自动转的,有强制转的,居然还有强制都转不了的;自动转了的却把对象身上的方法丢了看不见;强制转的编译过了运行却可能报异常。

    为什么需要强制转换类型?

    引用变量只能调用它编译类型的方法,不能调用它运行类型的方法。这时, 我们就需要进行类型的强制转换!

    一个父类的引用类型变量可以“指向”其子类的对象。

    一个父类的引用不可以访问其子类对象新增加的成员(属性和方法)。

    可以使用 引用 变量 instanceof 类名 来判断该引用型变量所“指向”的 对象是否属于该类或该类的子类。

    子类的对象可以当作基类的对象来使用称作向上转型(upcasting),反之 称为向下转型(downcasting)

    无论怎么转,都需要在同一条继承链上。

    2、instanceof

    向下转型—强制转换,是有风险的, 可能会出现类型转换异常ClassCastException,为了降低这种风险性,我们可以使用Java中的instance运算符,在强转前进行一次判断。

    结论:

    在引用数据类型中,只有有继承关系的类型才能进行类型转换;类型转换只是转换看待对象的引用的类型,对象本身没有也不可能参与转换;父类引用可以自动指向子类对象,但只能访问和调用到来自于父类的属性和行为;子类的引用不能指向父类或其它子类对象,就算强转也会导致运行失败并抛出ClassCastException;.把父类引用赋给子类引用,语法上必须使用强制类型转换,要想运行也成功还必须保证父类引用指向的对象一定是该子类对象(最好使用instance判断后,再强转)。

    第三节 抽象类

    1、抽象类的产生

    分析事物时,发现了共性内容,就出现向上抽取。会有这样一种特殊情况,就是方法功能声明相同,但方法功能主体不同。那么这时也可以抽取,但只抽取方法声明,不抽取方法主体。那么此方法就是一个抽象方法。

    比如我们要声明一个人类class,人类包含很多种,美国人和中国人。那么人类肯定会说话,但是说的是英语还是汉语需要具体的看是那种人,因为这个人类class就可以声明为抽象类,声明一个说话的抽象方法,美国人和中国人分别继承然后重写说话的犯法实现自己的说话方式。

    2、抽象类的定义

    用 abstract 关键字来修饰一个类时,这个类叫做抽象类;用 abstract 来修饰一个方法时,该方法叫做抽象方法。

    含有抽象方法的类必须被声明为抽象类,抽象类必须被继承(才有意义),抽象方法必须被重写抽象类不能被实例化

    抽象方法只需声明而不需要实现

    例:动物高兴了都会叫 但对于不同种类的动物,各自的叫声不同,动物(这个父类)的叫法/叫声永远不可能满足子类的需求


    A:抽象方法定义的格式: public abstract 返回值类型 方法名(参数);

    B: 抽象类定义的格式: abstract class 类名 {}


    抽象类除了包含抽象方法外,还可以包含具体的变量和具体的方法。类即使不包含抽象方法,也可以被声明为抽象类,防止被实例化。

    抽象类不能被实例化,也就是不能使用new关键字来得到一个抽象类的实例,抽象方法必须在子类中被实现。

    //有抽象方法的类也必须被声明为abstract public class Test1 { public static void main(String[] args) { Teacher teacher=new Teacher("教师"); teacher.work(); Driver driver=new Driver("驾驶员"); driver.work(); } } //一个抽象类 abstract class People{ //抽象方法 public abstract void work(); } //具体的子类继承抽象类,并重写抽象方法 class Teacher extends People{ private String work; public Teacher(String work) { this.work=work; } @Override public void work() { System.out.println("我的职业是"+this.work); } } //具体的子类继承抽象类,并重写抽象方法 class Driver extends People{ private String work; public Driver(String work) { this.work=work; } @Override public void work() { System.out.println("我的职业是"+this.work); } }
    3、 抽象类应用场景

    在下列情况下,一个类将成为抽象类:

    1. 当一个类的一个或多个方法是抽象方法时。 2. 当类是一个抽象类的子类,并且不能实现父类的所有抽象方法时。 3. 当一个类实现一个接口,并且不能实现接口的所有抽象方法时。

    第四节 接口


    1. 什么是接口

    接口(interface)是抽象方法和常量值的定义的集合。

    从本质上讲,接口是一种特殊的抽象类,这种抽象类中只包含常量和方法的定义,而没有变量和方法的实现从语义 上可以理解为,对于某一种动作、行为、功能的抽象,我们将其定义为接口,作为一种标准完全的规范而已,不适 宜定义为类。例如:飞这个功能,飞机可以飞(具有飞这个功能),小鸟能飞(具有飞这个功能),昆虫也能飞, 一般我们不会定义一个类Fly,从语义上不通,所以这只是一种功能,一个规范,我们可以将其定义为一种接口,供 其他类来实现

    2. interface定义接口

    定义Java类的语法格式:

    修饰符 class 类名 extends 父类 implements 接口1,接口2...,接口N{}
    3. 接口的特征

    接口中声明属性默认为 public static final 的,也只能是public static final的;接口中只能定义抽象方法,而且这些方法默认为public的,也只能是 public的 1.9之后可以为private static 但是没有静态代码块1.8之后可以有方法体,定义default修饰的方法1.8之后可以有静态方法 接口可以继承其他的接口,并添加新的属性和抽象方法接口不能实现另一个接口,但可以继承多个其它接口

    接口举例:Sing这种能力 Paint这种能力

    4. 实验

    设计接口实现下面结构

    说明:多个无关的类可以实现同一个接口;一个类可以实现多个接口;接口与实现类之间存在多态关系

    5、面向对象三大特征总结

    在编写代码时,我们追求”高内聚 低耦合” ,达到重用与规范,则需要使用面向对象的三大特性来实现:

    封装:encapsulation 隐藏信息

    继承:inheritance 延续+扩展父类信息

    多态:polymorphism 模糊策略 以不变应万变

    封装作用: a) 实现专业的分工,工作中的分模块、分功能开发。b) 隐藏信息和实现细节。使得对代码的修改更加安全和容易

    继承作用:实现代码的复用,延续+扩展父类信息

    5、面向对象三大特征总结


    在编写代码时,我们追求”高内聚 低耦合” ,达到重用与规范,则需要使用面向对象的三大特性来实现:

    封装:encapsulation 隐藏信息

    继承:inheritance 延续+扩展父类信息

    多态:polymorphism 模糊策略 以不变应万变

    封装作用: a) 实现专业的分工,工作中的分模块、分功能开发。b) 隐藏信息和实现细节。使得对代码的修改更加安全和容易

    继承作用:实现代码的复用,延续+扩展父类信息

    多态作用:以不变应万变(如 USB 接口,只要你实现了我的标准,就能插上电脑)

    Processed: 0.014, SQL: 9