day12_static_多态

今日内容

零、 复习昨日
一、final
二、static
三、多态
四、向上转型&向下转型
五、多态应用

零、 复习昨日

0 类封装步骤

  • 属性私有private
  • set,get方法

1 继承的好处

  • 减少重复
  • 多态的前提条件

2 子类可以使用父类什么

  • 子类可以使用父类 非私有 属性和方法

3 方法重写的要求

  • 访问修饰符 >= 父类
  • 返回值类型要与父类一致
  • 方法名要一致
  • 参数列表一致

4 访问修饰符的权限大小
public>protected>缺省>private

5 this和super 总结表格

  • this不代表父类对象!!!
  • 表格见笔记

6 有继承时创建对象的过程

  • 先父类, 再属性初始化 后执行构造
  • 后子类, 再属性初始化 后执行构造

一、作业

重要作业,需要花10分钟尝试一遍,如果不会写

  • 记当时自己心路历程,尽可能完整
  • 等我讲的是时候 重点听

见项目包com.qf.pdf6_t19和com.qf.pdf6_t24

二、final

修饰符,用来修饰类,属性和方法

2.1 修饰类

final修饰类,类不能被继承

image-20240130103351871

2.2 修饰变量

final修饰成员变量,局部变量,变量不再变化,即变成常量!!

image-20240130103817632

注意: 命名规范要求

  • 变量命名是首字母小写,其余单词大写!
  • 常量命名是全部大写,多个单词中间_分开

2.3 修饰方法

final修饰方法,方法不能被 重写!!

image-20240130104142405

2.4 总结

不管修饰类,变量,方法,其实本质是一样,因为final 单词,释义 最终,最后的

所以

  • 最后的类,不能被继承
  • 最后的变量,不能改变
  • 最后的方法,不能重写

2.5 练习

 public static void main(String[] args) {
        final Dog[] dogs = new Dog[3];
        dogs[0] = new Dog();// 数组内部的东西是可以改变的
        dogs[0] = new Dog();
        // dogs本身引用不能再改变
        // dogs = new Dog[4];

        final Dog dog = new Dog( );
        dog.name = "大黄";// 对象内的属性是可以变的
        dog.name = "小黄";
        // dog = new Dog(); // 对象的引用不能变

    }

三、static

3.1 语法解释

:写法: static修饰符,修饰类,属性和方法,

一般常见,常用的是修饰属性 和 方法


特性:

  • 凡是被static修饰的属性,方法会随着 类加载 而初始化
  • 凡是被static修饰的属性,方法在内存只有一份,被当前类的所有对象共享
    • static修饰的属性和方法称为类方法,类属性(属于类)
    • 没有被static修饰的属性和方法称为对象方法,对象属性(属于对象)

特殊用法:

  • 因为static修饰的属性和方法会随着类加载而初始化,即
    • 不需要创建对象,属性和方法即可使用!!!
  • 静态方法不能调用非静态属性和方法
    • 是因为静态是随着类加载就出现,而对象是new的时候才出现的,即有静态不一定有对象

image-20240130111915728

3.2 用法

用法1: 设计的方法为了方便调用的时候,可以设计成静态方法

  • 例如: Arrays.sort() Arrays.toString()

用法2: 设计的程序中属性需要被多个对象共享时,可以将属性设置成静态 的

  • 例如: 多个窗口要共享火车票数据, 多个学生要共享老师对象

用法3: static一般会配合final,去修饰静态 常量

例如:

 public static final double PI = 3.14159265358979323846;

ps: public static final这三个修饰符顺序原则上怎么写都行,但是建议是按照public static final顺序

三、多态

3.1 什么是多态

生活多态: (多种形态)

  • 蝌蚪–>青蛙
  • 迪迦(蓝色,红色,红蓝)
  • 铁甲小宝

代码的多态:(主要是指方法多种表现形式)

  • 同一个对象的同一个方法会出现不同的结果

3.2 如何形成多态

想要形成多态,要同时满足前提

  • 先有继承(子父类关系)
  • 重写方法
  • 父类引用指向子类对象(向上转型)

// 父类

image-20240130144816777

// 子类

image-20240130144831085

// 向上转型,展现多态

image-20240130144903551

3.3 作用?好处?

多态可以让代码很灵活,扩展性强!减少耦合度!

举例: 现有需求,设计方法,传入对应的动物对象,展现对应动物的吃的行为

如果没有多态,此题该怎么写?如下

image-20240130145414355

再扩展一下: 现在动物园来了一个新动物,也要展现其吃的行为,怎么办?

此时需要,再修改代码,单独加一个方法来适应这个新动物!!!

image-20240130145644404

此时,思考!!! 如果有很多新动物??? 要设置很多新的方法, 不灵活,扩展性差!


这时 利用多态,此题非常简单, 做到以不变应万变!!!

image-20240130151248849

3.4 练习

改造形状题目为多态

创建一个长度为3 的数组,里面有三个不同 类型的对象,分别打印这三个对象的周长和面积。

四、向上转型&向下转型

父类引用指向子类对象,就是向上转型(子对象变父对象)

什么时候需要向上转型,想要表现多态的时候就可以向上转型!

image-20240130154943043

向下转型(父对变子对象),父类对象指向子类引用!

       /**
         * 向下转型
         * 以下这都是向下转型,但是第一遍会失败
         * 第二遍这个成功!
         * --------
         * 为什么?
         *  要想向下转型成功,得向上再向下
         */
        // Animal animal2 = new Animal();
        // Dog dog = (Dog) animal2;// 不行!!

        Animal animal3 = new Dog();// 先向上
        Dog dog = (Dog) animal3;// 再向下,能转成
// ps: 这些其实就是之前的类型转换问题

为什么需要向下转型?

  • 需要调用子类特有的方法

场景: 猪狗猫等类都有共同的方法:eat(),此时每一个动物还有不同的特有的方法,要表现出来

image-20240130161040471

但是这样可以调用狗类特有方法,但是不适用,因为其他动物不能转为Dog类,怎么解决?

  • 思路: 判断这个animal是哪个子类对象向上转型,我再对应的向下转型为哪个子类
  • 利用jdk提供 instanceof方法来判断animal是哪个类的实例

image-20240130161629284

练习

pdf6_t14

五、多态应用

场景1: 方法的参数列表是父类,调用该方法时,传入子类,方法表现出子类特点

image-20240130164809782

场景2: 设计父类型数组,存储子类对象元素

image-20240130164901276

image-20240130164913402

场景3: 方法的返回值类型是父类,但是return的值是子类

image-20240130165351976

六、总结

final

  • 修饰类,不能继承
  • 修饰变量,变量为常量,注意变量的命名
  • 修饰方法,方法不能重写

static

  • 静态的方法和属性,可以通过类名直接调用,不用创建对象
  • 静态的方法和属性,在内存只有一个,会共享

多态

  • 多态的前提(继承,重写,向上转型)
  • 多态好处: 扩展,方便
  • 记住常用的应用场景
  • 记住一句话: 编译看父类,运行看子类
  • 了解向下转型(其实就是类型转换)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值