封装,继承和多态

面向对象编程的三大特征

封装,继承,多态

一.封装encapsulation

1.封装介绍

封装就是把抽象出的数据(属性)和对数据的操作(方法)封装在一起,数据被保护在内部,程序的其他部分只有通过被授权的操作(方法),才能对数据进行操作。
比如:电视机,需要那个功能用户只需要按哪一个功能键就行,不管如何实现。

2.封装的好处

1).隐藏实现细节: 方法(比如是连接数据库)<—调用(传入参数…)
2).可以对数据进行验证,保证安全合理

3.封装的实现步骤

1).将属性进行私有化private(不能直接修改属性)
2).提供一个公共(public)的set方法,用于对属性判断并赋值(业务逻辑)

public void setXxx(类型 参数名){//Xxx表示某个属性
     //加入数据验证的业务逻辑
     属性 = 参数名;
}

3).提供一个公共的get方法,用于获取属性的值(权限判断)

public 数据类型 getXxx(){//权限判断,Xxx某个属性
     return xx;
}
4.快速入门案例

问题
第一步:按题目私有化年龄和工资
1
第二步:写setXxx和getXxx,一个一个写太慢了,快捷键alt + insert,选择光标处
在这里插入图片描述
选中全部添加:

在这里插入图片描述
得:
在这里插入图片描述
具体代码见:com.hspedu.encap: Encapsulation01.java
一个问题:如果使用构造器,则以上对年龄和名字的限制不起效了
解决方法:将set方法写在构造器中,即:
方法
一个练习题见代码:AccountTest.java

二.继承extends

两个类的属性和方法有很多是相同的,怎么办?
继承(代码复用性)

1.基本介绍和示意图

继承可以解决代码复用,当多个类存在相同的属性(变量)和方法时,可以从这些类中抽象出父类,在父类中定义这些相同的属性和方法,所有的子类不需要重新定义这些属性和方法,只需要通过extends来声明继承父类即可。
示意图:1
对D类而言,B是D的父类,D是B,A的子类

2.基本语法:

class 子类 extends 父类{
}
1).子类就会自动拥有父类定义的属性和方法
2).父类又叫超类,基类
3).子类又叫派生类

3.快速入门

父类:
父类
子类Pupil:
子类
子类Graduate:
子类

4.继承使用细节

1).子类继承了所有属性和方法,非私有的属性和方法可以在子类直接访问,但是私有属性和方法不能在子类直接访问,要通过父类提供公共的方法去访问
例如:
父类:private的n4不能直接访问,提供了一个public方法来访问
在这里插入图片描述
子类:

2).子类必须调用父类的构造器,完成父类的初始化
3).当创建子类对象时,不管使用子类的哪个构造器,默认情况下总会去调用父类的无参构造器,如果父类没有提供无参构造器,则必须在子类的构造器中用super去指定使用父类的哪个构造器完成对父类的初始化工作,否则编译不通过
super

4).如果希望指定去调用父类的某个构造器,则显式的调用一下:super(参数列表)
5).super()在使用时,需要放在构造器的第一行(只能在构造器中使用)
6).super()和this()都只能放在构造器的第一行,所以这两个方法不能共存在一个构造器
7).java所有类都是Object类的子类
11

8).父类构造器的调用不限于直接父类!将一直往上追溯直到Object类(顶级父类)
9).子类最多只能继承一个父类(指直接继承),即Java中是单继承机制
思考:如何让A继承B和C
【A继承B,B继承C】
10).不能滥用继承,子类和父类之间必须满足is—a的逻辑关系
例如:
Person is a Music?
Music extends Person // 不合理,人不是音乐
Cat extends Animal // 合理

5.继承的本质分析(重要!)

程序:
程序
内存布局:
在这里插入图片描述
输出信息:
输出

三.多态

1.多态基本介绍

方法或对象具有多种形态,是面向对象的第三大特征,多态是建立在封装和继承之上的
多态的具体体现:
1).方法的多态
重写和重载就体现多态
比如:
1
2).对象的多态(核心,重点)
①.一个对象的编译类型和运行类型可以不一致
②.编译类型在定义对象时,就确定了,不能改变
③.运行类型是可以变化的
④.编译类型看定义时=号的左边,运行类型看=号的右边

Animal animal = new Dog();
//animal编译类型是Animal,运行类型是Dog,不一样
//一个父类的引用可以指向子类的对象
Dog dog = new Dog;
//也可以一样,都是Dog
animal = new Cat();
//animal的运行类型变成了Cat,编译类型仍然是Animal
3.向上转型,向下转型,属性重写问题

多态的前提是:两个对象(类)存在继承关系

1).多态的向上转型:

①:本质:父类的引用指向了子类的对象
②:语法:父类类型 引用名 = new 子类类型();
③:特点:编译类型看左边,运行类型看右边;可以调用父类中的所有成员(需遵守访问权限),不能调用子类中的特有成员;最终运行效果看子类(运行类型)的具体实现!(即调用方法时,按照从运行类型开始查找方法,然后调用,规则和前面的方法调用规则一致)

2).多态的向下转型:

①.语法:子类类型 引用名 = (子类类型) 父类引用
②.只能强转父类的引用,不能强转父类的对象
③.要求父类的引用必须指向的是当前目标类型的对象
即:若向下转型为:Cat cat = (Cat) animal;
则必须有:Animal animal = new Cat;//当前目标类型是Cat才能使用上述向下转型语句
④.当向下转型后,就可以调用子类类型中的所有成员
例如:
1
Cat类中的catchMouse方法可以调用了,而在向上转型即:Animal animal = new Cat;时不可以调用子类中特有的catchMouse方法

3).属性没有重写之说!属性的值看编译类型

例如:例子

4.instanceOf:比较操作符

instanceOf:用于判断对象的运行类型是否为XX类型或者XX类型的子类型
例如:
1

5.练习题:

11
22

5.Java的动态绑定机制(重要!)

1).当调用对象方法的时候,该方法会和对象的内存地址/运行类型绑定
2).当调用对象属性时,没有动态绑定机制,哪里声明就哪里使用
P315

6.多态的应用
1).多态数组

数组的定义类型为父类类型,里面保存的实际元素类型为子类类型
例如:
例子

2).多态参数

方法定义的形参类型为父类类型,实参类型为子类类型

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值