面向对象的三大特性------封装、继承、多态
一、封装
1、封装的思想
1.1封装的概述
封装是指利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成一个不可分割的独立实体,数据被保护在抽象数据类型的内部,尽可能地隐藏内部的细节,只保留一些对外接口使之与外部发生联系。是面向对象编程语言对客观世界的模拟,客观世界里成员变量都是隐藏在对象内部的,外界是无法直接操作的。
1.2、封装的原则
将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问 成员变量private,提供对应的getXxx()/setXxx()方法。
1.3、封装的好处
通过方法来控制成员变量的操作,提高了代码的安全性
把代码用方法进行封装,提高了代码的复用性
提高了代码的可维护性
2、封装的两大关键字及其使用
2.1private关键字
private是一个修饰符,可以用来修饰成员(成员变量,成员方法)
被private修饰的成员,只能在本类进行访问,针对private修饰的成员变量,如果需要被其他类使用,提供相应的操作
提供“get变量名()”方法,用于获取成员变量的值,方法用public修饰
提供“set变量名(参数)”方法,用于设置成员变量的值,方法用public修饰
2.2this关键字
this修饰的变量用于指代成员变量,其主要作用是(区分局部变量和成员变量的重名问题)
方法的形参如果与成员变量同名,不带this修饰的变量指的是形参,而不是成员变量
方法的形参没有与成员变量同名,不带this修饰的变量指的是成员变量
2.3关键字的使用(封装的具体过程)
public class Student {//使用private关键字对name,和age两个属性封装,使其私有化private String name;private int age;//提供get(),set()方法作为对外开放的接口,并使用this关键字来区分局部变量和成员变量public void setName(String name) {this.name = name;}public String getName() {return name;}public void setAge(int age) {this.age = age;}public int getAge() {return age;}public void show() {System.out.println(name + "," + age);}
}
3、总结
封装可以使我们容易地修改类的内部实现,而无需修改使用了该类的客户代码。就可以对成员变量进行更精确的控制。用户通过该对象对外的提供的接口来访问该对象,提高了代码的安全性,同时把代码用方法进行封装,提高了代码的复用性。
二、继承
1、继承的概念
继承是面向对象三大特征之一,可以使得子类具有父类的属性和方法,还可以在子类中重新定义,以及追加属性和方法。也可以理解为继承是从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并能扩展新的能力。
1.1解析
继承的类叫做子类(派生类或者超类),被继承的类叫做父类(或者基类)。
2、继承的实现
2.1实现条件
使用继承,需要考虑类与类之间是否存在is..a的关系。可以理解为两者之间是否存在包含关系。
2.2实现格式
继承通过extends实现
格式:class 子类 extends 父类 { }
3、继承的利弊
3.1利
提高了代码的复用性(多个类相同的成员可以放到同一个类中)
提高了代码的维护性(如果方法的代码需要修改,修改一处即可)
3.2弊
继承让类与类之间产生了关系,类的耦合性增强了,当父类发生变化时子类实现也不得不跟着变化,削弱了子类的独立性
4、继承的原则
1一个类只能继承一个类
2子类只能访问父类非private的成员变量和成员方法(子类依然拥有父类private的成员变量和成员方法,拥有和访问是不同的概念)
3子类的成员方法和成员变量与父类的同名时,父类的成员方法和成员变量会被子类覆盖,如果要在子类中访问父类中同名成员变量,需要使用super关键字来进行引用。
5、继承实现中的两大运用:super关键字和方法重写
5.1super
5.1.1super的意
代表父类存储空间的标识(可以理解为父类对象引用)
5.1.2运用
super.成员变量 - 访问父类成员变量
super.成员方法 - 访问父类成员方法
super(…) - 访问父类构造方法
5.1.3继承中构造方法的访问特点
子类中所有的构造方法默认都会访问父类中无参的构造方法
子类会继承父类中的数据,可能还会使用父类的数据。所以,子类初始化之前,一定要先完成父类数据的初始化,原因在于,每一个子类构造方法的第一条语句默认都是:super()
5.2、方法重写
5.2.1方法重写的概念
子类出现了和父类中一模一样的方法声明(方法名一样,参数列表也必须一样)
5.2.2应用场景
当子类需要父类的功能,而功能主体子类有自己特有内容时,可以重写父类中的方法,这样,即沿袭了父类的功能,又定义了子类特有的内容
5.2.3注意事项
私有方法不能被重写(父类私有成员子类是不能继承的)
子类方法访问权限不能更低(public > 默认 > 私有)
6、代码演示
//封装一个Person类
class Person {private String name;private int age;public Person() {}public Person(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public void teach() {System.out.println("教书育人");}}
//使用extands实现继承
class Teacher extends Person {public Teacher() {}//手动给出无参构造方法public Teacher(String name,int age) {super(name,age);//super访问成员变量,以及带参构造方法}public void teach() {System.out.println("用爱成就每一位学员");//方法重写}
}
7、总结
继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类。通过使用继承我们能够非常方便地复用以前的代码,能够大大的提高开发的效率。
三、多态
1、概述
1.1什么是多态
同一个对象,在不同时刻表现出来的不同形态。
1.2多态的实现条件
要有继承或实现关系
要有方法的重写
要有父类引用指向子类对象
2、成员访问特点
成员变量
编译看父类,运行看父类
成员方法
编译看父类,运行看子类
代码解析:
//父类引用指向子类对象Animal a = new Cat();/* Animal父类中有一个eat()方法,子类Cat里面重写了eat方法,那么当调用eat()方法时首先会在父类Animal类编译,而具体执行时是执行子类Cat的eat(),输出的是子类里eat()定义的结果。*/
3、多态的好处
提高程序的扩展性。定义方法时候,使用父类型作为参数,在使用的时候,使用具体的子类型参与操作
4、多态中的转型
向上转型
父类引用指向子类对象就是向上转型
说明:向上转型时,子类对象当成父类对象,只能调用父类的功能,如果子类重写了父类中声明过的方法,方法体执行的就是子类重过后的功能。
向下转型
格式:子类型 对象名 = (子类型)父类引用;
说明:向下转型时,是为了方便使用子类的特殊方法,也就是说当子类方法做了功能拓展,就可以直接使用子类功能。
代码解析:
//定义一个父类Animal类
public class Animal {public void eat() {System.out.println("动物吃东西");}
}
//子类Cat类
public class Cat extends Animal {@Overridepublic void eat() {System.out.println("猫吃鱼");}public void playGame() {System.out.println("猫捉迷藏");}
}
public class AnimalDemo {public static void main(String[] args) {//多态//向上转型Animal a = new Cat();//父类引用指向子类对象a.eat();
// a.playGame();//向下转型Cat c = (Cat)a;//- 子类型 对象名 = (子类型)父类引用;c.eat();c.playGame();}
}
5、(补充)方法重载和重写的区别
5.1概念上的区别
方法重载:重载(overloading) 是在一个类里面,方法名字相同,而参数不同。返回类型可以相同也可以不同。
方法重写:重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。
5.2规则上的区别
方法重写的规则:
1、参数列表必须完全与被重写方法的相同;
2、返回类型必须完全与被重写方法的返回类型相同;
3、访问权限不能比父类中被重写的方法的访问权限更低。
4、父类的成员方法只能被它的子类重写。
5、声明为final的方法不能被重写。
6、声明为static的方法不能被重写,
7、构造方法不能被重写。
方法重载的规则:
1、被重载的方法必须改变参数列表(参数个数或类型或顺序不一样);
2、被重载的方法可以改变返回类型;
3、被重载的方法可以改变访问修饰符;
4、被重载的方法可以声明新的或更广的检查异常;
5、方法能够在同一个类中或者在一个子类中被重载。
6、无法以返回值类型作为重载函数的区分标准。
5.3小结
方法的重写(Overriding)和重载(Overloading)是java多态性的不同表现,重写是父类与子类之间多态性的一种表现,重载可以理解成多态的具体表现形式。
面向对象的三大特性------封装、继承、多态相关推荐
- Day55-每日一道Java面试题-Java 面向对象编程三大特性: 封装 继承 多态
Java 面向对象编程三大特性: 封装 继承 多态 封装 封装把一个对象的属性私有化,同时提供一些可以被外界访问的属性的方法,如果属性不想被外界访问,我们大可不必提供方法给外界访问.但是如果一个类没有 ...
- python多态的三种表现形式_python小结----面向对象的三大特征(封装,继承,多态)
面向对象的三大特征: 封装,继承,多态 面向对象的编程思想核心:高类聚,低耦合–程序的设计模式范畴 封装 什么是封装: 在面向对象编程的思想中,对代码进行高度封装,封装又叫包装 封装就是指将数据或者函 ...
- 深入理解Java面向对象三大特性 封装 继承 多态
1.封装 封装的定义: 首先是抽象,把事物抽象成一个类,其次才是封装,将事物拥有的属性和动作隐藏起来,只保留特定的方法与外界联系 为什么需要封装: 封装符合面向对象设计原则的第一条:单一性原则,一个类 ...
- Java面向对象三大特性(封装继承多态)解释及案例
文章目录 包 包基本语法 命名规则 命名规范 导入包实例 访问修饰符 面向对象编程-封装 面向对象编程-继承 super关键词 super和this的比较 方法重写/覆盖 (override) 注意事 ...
- Python全栈开发——面向对象的三大特性(继承 多态 封装)
1.继承 1.两层意思 改变和扩展(详细看随笔继承和组合) 2.多态(体现在运行时的状态) 1.不同的类可以调用相同的方法,得到不同的结果 2.实际上是继承的一种体现机制 class H2o:def ...
- Python学习笔记④——类、面向对象的三大特征 [封装+继承+多态]
✅ Blogger Learns Python is for learning the "Deep Learning". 文章目录 一.面向对象编程的简介 二.类与对象 -- 基础 ...
- OC面向对象的三大特征(封装 继承 多态)习题2 复合
复合:一个类中有一个成员变量是另外一个类的对象. 比如我现在要制作一台电脑,电脑需要CPU,显示器,鼠标和键盘等.这些东西的研发都是很复杂的过程.如果现在有成型的CPU等组件,就可以直接用这些组件攒一 ...
- 到底什么是面向对象,面试中怎么回答。面向过程和面向对象的区别是什么。java跨平台特性以及java和C++的区别。面向对象的三大特性——封装、继承和多态。面向对象的高拓展性以及低耦合度怎么体现?
Java语言具有的特点:面向对象.跨平台.多线程以及网络编程 1. 和C++的区别 1.1 Java隐蔽了C++的指针,避免指针直接操作,程序更加安全. 1.2 Java类继承只能单继承,避免了C++ ...
- 【Golang第8章:面向对象编程】Go语言的结构体是什么,怎么声明;Golang方法的调用和声明;go语言面向对象实例,go语言工厂模式;golang面向对象的三大特性:继承、封装、多态
介绍 这个是在B站上看边看视频边做的笔记,这一章是Glang面向对象编程 这一章内容较多,内容有Go语言的结构体是什么,怎么声明:Golang方法的调用和声明:go语言面向对象实例,go语言工厂模式: ...
- Python - 面向对象编程 - 三大特性之继承
继承 继承也是面向对象编程三大特性之一 继承是类与类的一种关系 定义一个新的 class 时,可以从某个现有的 class 继承 新的 class 类就叫子类(Subclass) 被继承的类一般称为父 ...
最新文章
- pyinstaller 打包tensorflow2.0为单个文件
- 为什么需要自己实现前端框架
- php7-internal 7.7 zval的操作
- SQL Server 2005中的分区表(一):什么是分区表?为什么要用分区表?如何创建分区表?...
- pyecharts x轴字体大小调整_pyecharts 柱状图基础篇#学习笔记#
- 模型评价(一) AUC大法 混淆矩阵
- 从零开始学前端:初识JavaScript --- 今天你学习了吗?(JS:Day01)
- Day_2_Python_str_list_dict的使用
- CYQ.Data 轻量数据层之路 华丽升级 V1.3出世(五)
- 持续集成部署工具jenkins简介
- office安装出现windows installer服务不能更新一个或多个受保护的windows文件
- 【上交OJ】1002:二哥种花生(二维前缀和+二维差分---模版题)
- SQl盲注原理及其简单演示
- linux天气软件,Ubuntu 18.04 6款查询天气的小工具推荐(适用于其它Linux)
- chm 文件的阅读、制作和反编译
- 奇安信天擎卸载密码_【web安全】记奇安信“渗透测试”培训
- python123八边形绘制_使用python实现简单的画多边形。
- 检查内存泄露的利器--VLD使用指南
- c语言用break语句提前结束循环,break语句C语言程序设计.pdf
- 微信小程序使用mock.js