面向对象——三大特性

目录

 

面向对象封装特性

面向对象继承特性

继承出现的原因

继承的格式

继承的好处

为什么只能单继承,不能多继承

什么时候子类方法需要重写?

继承的一些知识点

重载和重写的区别

方法覆盖重写的注意事项

继承中构造方法的调用

面向对象多态特性

多态直译概念

多态的前提条件

多态的格式

多态的好处和弊端

如何解决弊端,调用子类中特有的方法

多态的出现引起的思想变化

 向上转型和向下转型的总结

 多态时静态函数和成员变量的调用

关键字instanceof


面向对象封装特性

假如将内部的属性直接暴露出来,可以通过对象.属性直接进行操作,那么有可能会存在操作的不合理性,比如年龄直接赋值为负数,性别赋值为比较奇怪的数据,所以可以用方法对外联系,并在方法内进行一定的属性控制

封装的本质在于对信息的隐藏,数据被保护在内部,尽可能地隐藏内部的细节,只保留一些对外方法使之与外部发生联系,私有仅仅是封装的一种体现而已,而用户是通过可读可写的方法去访问内部数据,至于内部如何实现的,用户无从了解,提高了安全性

 

A:封装概述

是面向对象三大特征之一

是面向对象编程语言对客观世界的模拟,客观世界里成员变量都是隐藏在对象内部的,外界无法直接操作和修改。就像刚才说的年龄。

B:封装原则:

将不需要对外提供的内容都隐藏起来。

把属性隐藏,提供公共方法对其访问。

成员变量private(只能在本类中访问),需提供对应的getXxx()/setXxx()方法

特殊:当成员变量是基本数据类型中的boolean,那么他的get方法要定义成isXxx()的模式,不要定义成getXxx()的模式,这是一种特殊情况,当然如果是包装类的Boolean类型,则不需要遵守

C:好处:

通过方法来控制成员变量的操作,提高了代码的安全性

把代码用方法进行封装,提高了代码的复用性

面向对象继承特性

继承出现的原因

因为一些类有共同的属性和行为,将它们的共性抽取出来,让他们实现类与类的继承,减少代码量,提高代码的复用性

比如:学校有很多职业,每个职业有学号、姓名、还有它本身职业所特有的功能,那么既然每个职业都有学号,姓名,那么我们就可以抽调这两个属性抽取到员工类(父类,基类,超类)中,让每个职工类(子类,派生类)来继承,这样每个职工类就不用再重复定义学号,姓名了,减少了代码量,这就是继承的好处

下面来两个继承的示意图:

继承的格式

格式:

class 子类名称 extends 父类名称 {}

继承的好处

1:提高了代码的复用性。

2:让类与类之间产生了关系,提供了另一个特征多态的前提。

为什么只能单继承,不能多继承

多继承的话两个父类如果有相同方法名的功能,则子类调用时不知道具体执行哪个父类的方法体

什么时候子类方法需要重写?

当子类继承父类,需要对功能中的内容进行重新定义时,这时候就需要重写的应用(也就是父类定义的内容已经满足不了需要,需要改变)

继承的一些知识点

1 ) 继承使用extends关键字

2) 小狗Dog类称为子类, 或者派生类,  Pet宠物类称为父类或者超类, 基类

3) 子类继承了父类, 就意味着自动拥有了父类的实例变量与实例方法,不过拥有了不代表就能访问,比如说父类中私有的实例变量与实例方法虽然被子类继承了,但是不能被访问,这跟权限修饰符有关系,而父类的构造方法和静态方法子类是不会继承拥有的,静态方法和构造方法是不讨论继承问题的

4) 在子类中可以添加子类特有的属性与行为, 也称为子类可以对父类进行扩展

5) 如果一个类没有显示的extends继承一个父类,则该类默认继承Object类

6) 类的继承只允许单继承, 即一个类最多有一个父类

7) 继承不能乱用, 只有当 子类  is  a  父类 关系成立时才能使用继承, 父类是通用类,或者是一般类; 子类是特殊类

8) 继承是可传递的,A继承B,B继承C,那么A也会拥有C的实例变量和方法

重载和重写的区别

1.重写必须继承,重载不用。

2.重写的方法名,参数列表都要相同,重载的方法名相同,参数列表不同

3.重写的方法修饰符大于等于父类的方法,重载和修饰符无关

4.重写的返回值类型必须小于等于父类的返回值类型,而重载与返回值类型无关

方法覆盖重写的注意事项

1. 必须保证父子类之间方法的名称相同,参数列表也相同。

@Override:写在子类重写方法上面,用来检测是不是有效的正确覆盖重写。建议写上,因为它能有效的检测你的重写方法是否书写正确

这个注解就算不写,只要满足要求,也是正确的方法覆盖重写。

2. 子类方法的返回值类型如果是引用类型的话必须【小于等于】父类方法的返回值类型范围。如果返回值类型是void或者基本类型时必须相同

小扩展提示:java.lang.Object类是所有类的公共最高父类(祖宗类),java.lang.String就是Object的子类。

3. 子类方法的权限修饰符必须【大于等于】父类方法的权限修饰符。

小扩展提示:public > protected > (default) > private

备注:(default)不是关键字default,而是什么都不写,留空。

4.如果父类方法抛出异常,则子类重写父类方法后子类可以抛出相同的异常,也可以抛出子异常,或者不抛出异常,如果父类方法没有抛出异常,重写后也不能抛出异常

继承中构造方法的调用

1. 子类构造方法当中有一个默认隐含的“super()”调用,所以一定是先调用的父类构造,后执行的子类构造。

2. 子类构造可以通过super关键字来调用父类重载构造。

3. super的父类构造调用,必须是子类构造方法的第一个语句。不能一个子类构造调用多次super构造,只能调用一次。

总结:

子类必须调用父类构造方法,不写则在子类构造方法第一行默认调用super(),就是父类的无参构造方法;也可调用父类的其他有参构造(super括号里输入对应参数即可),super只能有一个,还必须是第一个

面向对象多态特性

多态直译概念

一个事物的子类的多种形态

例如:动物就有多种形态:Animal a=new Dog();和Animal a=new Cat();(这两个是向上转型,可以说狗对象被叫做小动物,也可以说猫对象叫做小动物,之前是具体的对象引用指向子对象,现在是父类的引用指向子对象,子父类才能这样做)

多态的前提条件

1:必须要有关系,比如继承、或者实现。

2:通常会有覆盖操作。

多态的格式

代码当中体现多态性,其实就是一句话:父类引用指向子类对象

格式:

父类名称 对象名 = new 子类名称();

或者:

接口名称 对象名 = new 实现类名称();

 

多态的好处和弊端

好处:无论右边new的时候换成哪个子类对象,等号左边调用方法都不会变化,图解如下所示

 

弊端:通过父类操作子类对象时,只能操作父类中已有的方法,不能操作子类中特有的方法(弊端),调用父子类都有的普通方法,运行的是子类的内容,父类普通方法被重写

如何解决弊端,调用子类中特有的方法

就上面例如的问题,如果Dog中有另外(特有)的方法,我们想要引用的话,我们可以向下转型,也就是强制转换,例如Dog d=(Dog)a(这是向下转型);这样d对象就可以使用本身定义的,在animal中没定义的特有方法

无论是向上转型还是向下转型,我们做的都是引用类型的变换,而不是对象的变换(例如(Dog)new Animal()),动左边不动右边,对象强制变换会发生类型转换异常

多态的出现引起的思想变化

以前是创建对象并指挥对象做事情。有了多态以后,我们可以找到对象的共性类型,直接操作共性类型做事情即可,这样可以指挥一批对象做事情,即通过操作父类或接口实现。

 向上转型和向下转型的总结

1.当不需要使用子类中的特有成员方法时,就向上转型,提高了拓展性

(这时候调用的方法都是父类所拥有的方法,如果子类有重写其方法,执行的是子类方法内的内容,如果子类没有重写其方法,那么调用的仍然是子类的方法中的主体内容,因为这一切都是发生在继承基础上,既然没重写,那此时子类的方法内容没改变,跟父类中的方法内容一致)----总而言之,我们调用(编译)时看的是父类有无此成员方法,运行时看的是子类的方法内容(要注意继承下来的方法)

2.当需要使用子类的特有方法时,就向下转型

 多态时静态函数和成员变量的调用

上面讲的都是成员函数在多态情况下的调用,成员函数的特点是编译时看左边(编译时无对象,所以看父类),运行时看右边(看子类),如果运行的是多态情况下的成员变量或者静态函数呢?一句口诀是编译运行都看左边。因为成员函数动态绑定在对象上,而静态函数是静态绑定在类上(静态函数是随着类的加载而加载,被加载时还没有对象,所以只要关心左边的类型)

关键字instanceof

在向下转型时为了避免发生类型转换异常(ClassCastException),比如说原本向上转型前子类对象是一只猫,那么你不能在向下转型的时候转成一只狗,如果强行转成狗,就会造成类型转换异常,所以在转型前会进行类型判断,关键字的解释:左边是否是右边的实例,只要左边继承了右边类,或者实现了右边的接口,或者是右边的对象,返回的都会为true

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值