再谈面向对象-2023(三)

封装:属性私有化,方法公有化

继承:是一种使用已有的类创建新类的机制,是指在已有类的基础上扩展功能。①提高代码复用性②提高代码可扩展性

多态:是指不同对象调用相同的方法执行的操作不同,或者说同一实现接口,使用不同的实例可以执行不同的操作。→极大的减少了代码的冗余,不需要定义多个重载的方法。

抽象方法:只提供方法的声明,不提供方法的实现
抽象方法就是提供给接口的,只不过为了在类中生存,又提出了抽象类

接口:将接口理解为一种契约,主要用于声明一组应该履行的方法。
Java中引入接口的目的一方面是为了实现多重继承,更重要的目的是通过接口能够更好地提高程序的可扩展性和可维护性。

封装

  1. 为什么需要封装性?
    理论上:
    -高内聚:类的内部数据操作细节自己完成,不允许外部干涉;
    -低耦合:仅暴露少量的方法给外部使用,尽量方便外部调用。

通俗的说:把该隐藏的隐藏起来,该暴露的暴露出来。这就是封装性的设计思想。

  1. 如何实现数据封装?

2.1 权限修饰符
Java规定了4种权限修饰,分别是:private、缺省、protected、public

2.2 作用
我们可以使用4种权限修饰来修饰类及类的内部成员。当这些成员被调用时,体现可见性的大小。

2.3 实际案例:
在题目中,我们给Animal的对象的legs属性赋值。在实际的常识中,我们知道legs不能赋值为负数的。但是如果直接调用属性legs,是不能加入判断逻辑的。那怎么办呢?

将legs属性私有化(private),禁止在Animal类的外部直接调用此属性。
提供给legs属性赋值的setLegs()方法,在此方法中加入legs赋值的判断逻辑if(legs >= 0 && legs % 2 ==0)将此方法暴露出去,允许在Animal类的外部调用此方法,对legs属性赋值。
提供给legs属性获取的getLegs()方法,此方法对外暴露。使得在Animal类的外部还可以调用此属性的值。

  1. 封装性的体现

场景1:私有化(private)类的属性,提供公共(public)的get和set方法,对此属性进行获取或修改
场景2:将类中不需要对外暴露的方法,设置为private.
场景3:单例模式中将构造器private,避免在类的外部创建实例。

继承

  1. 继承性的理解
  • 生活上:财产的继承、颜值的继承
  • 代码层面:
    自上而下:定义了一个类A,在定义另一个类B时,发现类B的功能与类A相似,考虑类B继承于类A
    自下而上:定义了类B,C,D等,发现B、C、D有类似的属性和方法,则可以考虑将相同的属性和方法进行抽取,封装到类A中,让类B、C、D继承于类A,同时,B、C、D中的相似的功能就可以删除了。
  1. 继承性的好处
  • 继承的出现减少了代码冗余,提高了代码的复用性
  • 继承的出现,更有利于功能的扩展
  • 继承的出现让类与类之间产生了is-a的关系,为多态的使用提供了前提。
  • 继承描述事物之间的所属关系,这种关系是:is-a 的关系。可见,父类更通用、更一般,子类更具体。
  1. 继承的格式:

class A{
//属性、方法
}

class B extends A{

}

继承中的基本概念:

类A: 父类、superClass、超类、基类
类B: 子类、subClass、派生类

  1. 有了继承性以后:

子类就获取到了父类中声明的所有的属性和方法。
但是,受访问权限的影响,可能子类不能直接调用父类中声明的某些属性或方法。
子类在继承父类以后,还可以扩展自己特有的功能(体现:增加特有的属性、方法)。extends:延展、扩展、延伸
子类和父类的理解,要区别于集合和子集
不要为了继承而继承。在继承之前,判断一下是否有is a的关系。

  1. 默认的父类:
    Java中声明的类,如果没有显式的声明其父类时,则默认继承于java.lang.Object

  2. 补充说明:

Java是支持多层继承。概念:直接父类、间接父类
Java中的子父类的概念是相对的。
Java中一个父类可以声明多个子类。反之,一个子类只能有一个父类(Java的单继承性

方法重写

  1. 为什么需要方法的重写?

子类在继承父类以后,就获取了父类中声明的所有的方法。但是,父类中的方法可能不太适用于子类,换句话说,子类需要对父类中继承过来的方法进行覆盖、覆写的操作。
2. 何为方法的重写?

子类对父类继承过来的方法进行的覆盖、覆写的操作,就称为方法的重写。

  1. 方法重写应遵循的规则

[复习]方法声明的格式:
权限修饰符 返回值类型 方法名(形参列表) [throws 异常类型] { //方法体 }

具体规则:
① 父类被重写的方法与子类重写的方法的方法名和形参列表必须相同
② 子类重写的方法的访问权限修饰符 不小于父类被重写的方法的访问权限修饰符
(子类不能重写父类中声明为private权限修饰的方法。)
③ 关于返回值类型:

  • 父类被重写的方法的返回值类型是void,则子类重写的方法的返回值类型必须是void
  • 父类被重写的方法的返回值类型是基本数据类型,则子类重写的方法的返回值类型必须与被重写的方法的返回值类型相同。
  • 父类被重写的方法的返回值类型是引用数据类型(比如类),则子类重写的方法的返回值类型可以与被重写的方法的返回值类型 相同 或 是被重写的方法的返回值类型的子类

④ (超纲)子类重写的方法抛出的异常类型可以与父类被重写的方法抛出的异常类型相同,或是父类被重写的方法抛出的异常类型的子类。

补充说明:方法体:没有要求。但是子类重写的方法的方法体必然与父类被重写的方法的不同。

  1. 面试题:区分方法的重载(overload)与重写(override / overwrite)

重载:“两同一不同”
重写:继承以后,子类覆盖父类中同名同参数的方法

注:若子类与父类中有达成重载条件的两个方法 例:父 a(); 子 a(int b);,那么也是方法的重载

多态

  1. 如何理解多态性?

理解:理解为一个事物的多种形态。

  1. Java中多态性的体现:
    子类对象的多态性:父类的引用指向子类的对象。(或子类的对象赋给父类的引用)
    比如:Person p2 = new Man(); 【这种写法并不常用,多态常用于方法的形参中体现】

  2. 多态性的应用:
    多态性的应用:虚拟方法调用

在多态的场景下,调用方法时:
编译时,认为方法是左边声明的父类的类型的方法(即被重写的方法)
执行时,实际执行的是子类重写父类的方法。

简称为:编译看左边,运行看右边。

  1. 多态性的使用前提:① 要有类的继承关系 ② 要有方法的重写

  2. 多态的适用性:适用于方法,不适用于属性。
    【多态new出来的对象只能调用子类中重写父类的方法以及父类中的方法和属性】

  3. 多态的好处与弊端
    6.1 弊端:
    在多态的场景下,我们创建了子类的对象,也加载了子类特有的属性和方法。但是由于声明为父类的引用,导致我们没有办法直接调用子类特有的属性和方法。
    6.2 好处:
    极大的减少了代码的冗余,不需要定义多个重载的方法。

instanceof

  1. 建议在向下转型之前,使用instanceof进行判断,避免出现类型转换异常 【使得程序更具备健壮性】
  2. 格式: a instanceOf A : 判断对象a是否是类A的实例。
  3. 如果a instanceOf A 返回true,则:a instanceOf superA 返回也是true。其中,A 是superA的子类。

抽象

  1. abstract的概念:抽象的

  2. abstract可以用来修饰:类、方法

  3. 具体的使用:

4.1 abstract修饰类:

此类称为抽象类
抽象类不能实例化。
抽象类中是包含构造器的,因为子类对象实例化时,需要直接或间接的调用到父类的构造器。
抽象类中可以没有抽象方法(可以有非抽象方法)。反之,抽象方法所在的类,一定是抽象类。☆【原因:非静态的方法保证不被调用,要求所在类不能被实例化(没有对象),那此类必须是抽象类】

4.2 abstract修饰方法:

此方法即为抽象方法
抽象方法只有方法的声明,没有方法体。
抽象方法其功能是确定的(通过方法的声明即可确定),只是不知道如何具体实现(体现为没有方法体)
子类必须重写父类中的所有的抽象方法之后,方可实例化。否则,此子类仍然是一个抽象类。

  1. abstract不能使用的场景:
    5.1 abstract 不能修饰哪些结构?
    属性、构造器、代码块等。

5.2 abstract 不能与哪些关键字共用?(自洽)

不能用abstract修饰私有方法、静态方法、final的方法、final的类。

接口

  1. 接口的理解:接口的本质是契约、标准、规范,就像我们的法律一样。制定好后大家都要遵守。

  2. 定义接口的关键字:interface

  3. 接口内部结构的说明:

    可以声明:
    属性:必须使用public static final修饰 ☆【全局常量】
    方法:jdk8之前:声明抽象方法,修饰为public abstract 【SubClassTest.java】
    jdk8:声明静态方法、默认方法
    jdk9:声明私有方法

    不可以声明:构造器、代码块等

  4. 接口与类的关系 :实现关系

  5. 格式:class A extends SuperA implements B,C{}

A相较于SuperA来讲,叫做子类
A相较于B,C来讲,叫做实现类。

  1. 满足此关系之后,说明:

类可以实现多个接口
类针对于接口的多实现,一定程度上就弥补了类的单继承的局限性。
类必须将实现的接口中的所有的抽象方法都重写(或实现),方可实例化。否则,此实现类必须声明为抽象类。

  1. 接口与接口的关系:继承关系,且可以多继承

  2. 接口的多态性: 接口名 变量名 = new 实现类对象;

  3. 面试题:区分抽象类和接口

共性:都可以声明抽象方法
都不能实例化

不同:① 抽象类一定有构造器。接口没有构造器
② 类与类之间单继承关系,类与接口之间是多实现关系,接口与接口之间是多继承关系

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值