2021-03-05

@面向对象下TOC

继承
子类继承父类,目的子类扩展父类的属性以及方法,就是为了实现代码的复用(继承在Java中只能单继承,不能多继承)

  • -子类可以继承父类的非私有化的属性以及方法
  • -所有的引用类型都默认继承了超类Object

※方法的重写(两同、一大、两小)
子类重写父类的方法(子类覆盖父类的方法),凸显出子类的行为特征

  • -方法名相同、方法参数列表相同【方法签名一致】
  • -和方法修饰符、返回值类型有关
    –子类重写父类的方法,子类方法的权限修饰符比父类的大或者相等
    –子类重写父类的方法,子类的返回值类型比父类的小或者相等
    –子类重写父类的方法,子类的抛出的异常类型要比父类的小或者相等
  • -当子类中有和父类一样的私有化方法,那么子类的私有化方法是一个普通方法,并不是重写了父类的方法

练习:
《一》 --定义一个动物类Animal 属性 name、sex、age
–定义eat方法()
–定义一个鸟类Bird,继承动物类,子类重写父类的eat方法

–定义一个狗类Dog,继承动物类,子类重写父类的eat方法

《二》 --在鸟类中定义一个移动方法move()
–定义一个鸵鸟类Ostrich 继承鸟类 ,重写鸟类的move方法

思考:方法重写和方法重载的区别

  • -子类重写父类方法,凸显出子类的行为特征
  • -在同一个类中,同一种行为的不同的体现
    方法重写存在于继承链中,方法重载存在于同一个类中
    方法重写是和修饰符以及返回值是有关系的,而方法重载是没有关系的
    方法重写方法名和参数列表是一样的,但是方法重载是方法名一致,参数列表不一致
    方法重载和方法重写是互不干涉的
    方法重载体现的是同一个类中,同一个行为的不同体现
    方法重写是体现在继承链中,子类的行为和父类的行为不一致

Ostrich–>Bird–>Animal–>Object

Ostrich–>Animal

super引用

  • -表示当前直接父类的对象的引用(父类的对象)
  • -当创建一个类的对象的时候会先创建其父类的对象
  • -1、可以使用super来调用父类的构造器
  • -2、可以调用父类的方法以及属性
    注意:super也是一个引用,所以也不能在static修饰的方法中使用

初始化以及初始化块(静态与非静态)

  • -初始化块的作用是用于在类加载或者创建对象时,可以设置一些固定的初始化操作(初始化成员变量、执行其他类的加载)
  • -静态初始化块只执行一次(类加载时),非静态初始化块每创建一个对象就执行一次
  • -静态初始化块–>非静态初始化块–>构造器

思考:如果初始化块在继承链中,又是怎么样?

  • -父类静态初始化块–>子类静态初始化块–>父类非静态初始化块–>父类构造器–>子类非静态初始化块–>子类构造器

作业:
定义交通工具类(父类)【name、type、sizes】,其中子类有汽车、火车、飞机,为这些类分别都提供三个构造器,并分别提供初始化块默认初始化每个类的【name、type、sizes】数值

※多态

  • -在Java中多态指的是行为的多态性
  • -多态是由于编译时类型和运行时类型不一致而出现的情况
    –编译时类型是引用变量的类型
    –运行时类型是new出来的对象类型
    多态是父类的引用指向子类的对象,子类要重写父类方法,当引用变量调用方法会出现行为的多态,显示子类的行为特征

注意的问题
1、多态指的是行为的多态性,变量是没有多态的
2、当父类的引用变量去调用子类特有的方法的时候,而父类没有则会报错

※多态的应用

  • -宠物商店PetShop,有寄养宠物的方法adoptPet
    –每有一个宠物就有对应的寄养方法-喂食操作
  • -宠物类Pet【name\sex\age】,有喂食的方法feedPet
    • 猫类 重写feedPet
    • 狗类 重写feedPet

引用类型的转换

  • -子类型可以赋值给父类的引用变量
  • -当引用变量进行向下转换时,要注意类型是否兼容,可以通过instanceof关键字进行判别

instanceof关键字

    • 判断变量中的对象是否为某个类或子类的对象

练习:
定义一个动物类Aminal:
定义公有属性:名字name、性别sex、年龄age
定义公有方法(吃水果):eatFruit方法 入参水果类,调用水果类中的importEnergy方法

定义一个Fruit水果(父类):
定义公有方法importEnergy 默认操作为输出“增加营养,补充维生素”

定义一个Apple(子类),继承Fruit:
重写importEnergy方法,操作为输出“补充维生素A”

定义一个Pear(子类),继承Fruit:
重写importEnergy方法,操作为输出“补充碳水化合物”

编写测试类创建动物类的对象,调用eatFruit方法

定义一个猴子类继承Aminal
重写(吃水果):eatFruit方法 入参水果类,进行一个判断,如果入参的水果对象为香蕉,则调用水果类中的importEnergy方法,输出"因为猴子喜欢吃,所以需要吃10kg的香蕉",否则输出"猴子不喜欢吃"

定义一个Banner(子类)香蕉,继承Fruit:
重写importEnergy方法,操作为输出“补充碳水化合物和纤维
素”

※静态类型

  • -根据入参变量的编译时类型决定调用哪个方法
    (谁入参到这个方法就根据谁的编译时类型来决定)
    ※动态类型
  • -根据调用方法的引用变量的运行时类型决定调用哪个类
    (谁调用了这个方法就根据谁的运行时类型来决定)

复习:
1、什么是多态?多态有什么特点?【会显示子类的行为特征】在Java中多态指的是行为的多样化和多态性 --多态是编译时类型和运行时类型不一致而导致的现象 --父类的引用指向子类的对象多态的出现有一定的前提: 父类的引用指向子类的对象 子类有重写父类的方法 2、多态作用和应用? 简化代码、降低维护成本、通过多态可以方便程序的扩展 3、什么是运行时类型?什么是编译时类型?【有什么用】 编译时类型就是定义的引用变量的类型; 运行时类型就是引用变量中存放的对象的类型 编译时是根据编译时类型进行校验语法 调用方法时是通过运行时类型的对象来调用方法4、在使用对象调用方法时,如何确定调用哪个类的方法? --确定有没有多态? A a = new A(); a.test();//明确是调用A类中的方法 --有多态[运行时类型确定在哪个类中调用方法] A a = new B(); a.test();//明确是调用B类中的方法 总结:不管有没有多态,调用哪个类的方法,直接看运行时类型即可5、明确类之后,如何确定调用哪个方法? A a = new A(); a.test(B b);//调用B参数的方法 总结:类确定后,是根据入参变量的编译时类型来调用方法4-5:总结–先确定类、确定方法 根据运行时类型确定类、根据编译时类型确定方法

final关键字

  • -用于修饰类、变量、常量、方法
  • -final修饰类 为最终类 ,则不能给子类继承
  • -final修饰方法,则该方法不能被重写
  • -final修饰成员变量,要先进行赋值,赋值后该变量的值不能被修改
    –类型为基本数据类型,赋值后该变量的值不能被修改
    –类型为引用类型,则不能赋值一个新的对象,但是可以修改对象中成员变量的数值
  • -final修饰局部变量,不要求先进行赋值,但是赋值后该变量的值不能被修改,注意在使用之前要先赋值,否则会编译出错

单例模式(Singleton)
用于限定当前类只能生成一个实例对象,则这个类称为单例类
意图:保证一个类中仅有一个实例,并提供一个访问它的全局访问点。
优点:
减少内存开销、避免了资源的多重访问占用
缺点:
没有继承、仅仅关心内部逻辑的实现,不考虑外部的实例化
–1、设置构造器为私有化 不允许外部类来创建对象
–2、提供一个静态的公有化的方法来获取唯一的对象
–3、判断sin是否为空,目的是确保对象是唯一的

  • -懒汉式:只有在使用的时候才去创建对象
  • -饿汉式:一开始就直接new对象

使用场景:
–要求生产唯一序列号
–WEB中的计数器,可以使用单例确保数据可靠
–I\O流或者数据库的链接对象【数据源\JDBC】

※抽象类

  • -抽象类是作为一个模板给子类继承,可以定义共通的属性、方法以及抽象的方法
  • -定义抽象类使用abstract关键字定义,抽象方法同理
  • -1、子类必须重写抽象类的所有抽象方法,除非子类为抽象类
  • -2、抽象类不能被实例化的,只能new子类的对象
  • -3、抽象类可以定义普通类中能定义的东西(初始化、变量、构造器、普通方法、抽象方法。。)
    抽象方法的目的就是为给子类实现

类与对象的概念?
类是抽象的、而对象是真实存在的
类是由某个具有共通的特征的多个实体抽象而成
对象是某种类型或者群体的真实的个例

抽象类:比普通的类还要抽象、体现在在于抽象类中可以定义抽象类
抽象方法:知道有对应的功能,但是不知道该功能是怎么实现的
抽象主要就是作为一个模板、给子类去继承
–不能出初始化抽象的对象,但是可以创建抽象类子类的对象 抽象类是不能创建对象的
–如果子类继承抽象类,则要么子类实现抽象方法,要么就定义为抽象方法
–抽象类和普通类有没有什么区别?
抽象类中可以定义抽象方法、普通类不可以定义抽象方法
普通类中能定义的操作、抽象类都能定义【有实现的方法、构造器、初始化块、变量、常量】

举例:
人类【抽象类】–工作的行为【抽象的行为】
老师–工作–》教书育人
程序员–工作–》写程序敲代码
农民–工作–》种菜务农

练习:
–多边形抽象类,定义求取周长的抽象方法
子类如下:
–正方形square
–长方形Rectangular
–三角形triangle
作业:

※接口(实现解耦)

  • -接口就是特殊的抽象类,接口类是作为一种规范
  • -接口就是用于定义抽象方法(定义规范)
  • -不能定义变量、普通方法、初始化块、构造器;但是可以定义默认方法、常量
  • -抽象方法默认是使用public修饰的
  • -常量默认是使用public final static修饰的
  • -接口不能被实例化的
  • -接口中可以定义默认方法,但是一定要使用default关键字修饰
  • -接口可以多实现(一个类可以实现多个接口)
    –类实现接口,要么该类实现了接口的抽象方法,要么该类为抽象类

思考:抽象类和接口的区别?什么场景下使用抽象类和接口?
抽象类是作为一个模板、接口作为一个规范
需要继承某些共通性的属性以及方法时,可以使用抽象类
需要多实现时以及一般的情况都使用接口,因为在Java中类只能单继承,如果继承类抽象类,则不能再继承其他类;但是如果实现了一个接口之后,还可以继承其他类以及实现其他接口

回调方法
就是一个参数,将一个A作为参数传到B里面,当B执行完之后,再执行传进去的到这个A,这个过程就叫做回调
老师叫某个学生来办公室喝茶、学生思考了一下,再回调老师的报告的方法,告诉老师情况

练习:

场景:今天早上,发生一个案件、警局派遣一个刑警小王去现场进行侦查,刑警小王侦查后给警局进行报告反馈现场情况

–警局 实现一个【报告】的功能
–派遣出警
–执行报告report

–传话筒 Phone(接口)【报告】report

–警官【抽象类】
–设置传话器方法
–侦查【抽象方法】【调用警局中执行报告onreport的方法来进行报告】
–实现子类刑警
–实现子类缉毒警

内部类【理解】

  • -类中包含类,目的就为了更好隐藏类的细节
  • -非静态内部类
  • -静态内部类

举例:
衣服
–扣子

语法分析:
–外部类只能使用public, abstract & final三个修饰符,而内部类可以
–在外部程序中不能通过内部类的对象访问外部类的属性,但在内部类中可以直接访问外部类的属性,因为内部类是属于外部类的成员
–在非静态内部类中不能定义静态的成员变量
–非静态内部类的对象创建是通过外部类的对象来调用内部类的构造器来创建:比如
// 创建外部类的对象
OuterClass out = new OuterClass();
// 创建内部类的对象 通过外部类的对象来调用非静态内部类的构造器
InnerClass in = out.new InnerClass();
–外部类中不能访问非静态内部类的属性和方法
–静态内部类中,不能直接访问外部类中非静态的方法和属性
–静态内部类的对象创建可以直接通过外部类调用内部类的构造器进行创建:比如
//创建静态内部类的对象
InnerClass in = new OuterClass.InnerClass();

※- -匿名内部类(实现了某个接口或抽象类,且没有类名的内部类)【必须】
–只使用一次(一次性的)
–不需要定义一个Java文件
–没有名字的、所以称为匿名

模板方法模式
概述
定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。用于作为一个模板给子类继承、进行扩展实现(抽象类、接口实现)
TemplateMethod使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

适用性
1.一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现。
2.各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。
首先识别现有代码中的不同之处,并且将不同之处分离为新的操作。
最后,用一个调用这些新的操作的模板方法来替换这些不同的代码。

举例:
–Game游戏
–开机、进行游戏角色、场景的初始化
–开启游戏、进行游戏的闯关
–闯关的结果分析,统计闯关时间和获取经验以及战果

–魂斗罗
–坦克大战

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值