一、封装

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注意事项

  1. 私有方法不能被重写(父类私有成员子类是不能继承的)

  2. 子类方法访问权限不能更低(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多态性的不同表现,重写是父类与子类之间多态性的一种表现,重载可以理解成多态的具体表现形式。

面向对象的三大特性------封装、继承、多态相关推荐

  1. Day55-每日一道Java面试题-Java 面向对象编程三大特性: 封装 继承 多态

    Java 面向对象编程三大特性: 封装 继承 多态 封装 封装把一个对象的属性私有化,同时提供一些可以被外界访问的属性的方法,如果属性不想被外界访问,我们大可不必提供方法给外界访问.但是如果一个类没有 ...

  2. python多态的三种表现形式_python小结----面向对象的三大特征(封装,继承,多态)

    面向对象的三大特征: 封装,继承,多态 面向对象的编程思想核心:高类聚,低耦合–程序的设计模式范畴 封装 什么是封装: 在面向对象编程的思想中,对代码进行高度封装,封装又叫包装 封装就是指将数据或者函 ...

  3. 深入理解Java面向对象三大特性 封装 继承 多态

    1.封装 封装的定义: 首先是抽象,把事物抽象成一个类,其次才是封装,将事物拥有的属性和动作隐藏起来,只保留特定的方法与外界联系 为什么需要封装: 封装符合面向对象设计原则的第一条:单一性原则,一个类 ...

  4. Java面向对象三大特性(封装继承多态)解释及案例

    文章目录 包 包基本语法 命名规则 命名规范 导入包实例 访问修饰符 面向对象编程-封装 面向对象编程-继承 super关键词 super和this的比较 方法重写/覆盖 (override) 注意事 ...

  5. Python全栈开发——面向对象的三大特性(继承 多态 封装)

    1.继承 1.两层意思 改变和扩展(详细看随笔继承和组合) 2.多态(体现在运行时的状态) 1.不同的类可以调用相同的方法,得到不同的结果 2.实际上是继承的一种体现机制 class H2o:def ...

  6. Python学习笔记④——类、面向对象的三大特征 [封装+继承+多态]

    ✅ Blogger Learns Python is for learning the "Deep Learning". 文章目录 一.面向对象编程的简介 二.类与对象 -- 基础 ...

  7. OC面向对象的三大特征(封装 继承 多态)习题2 复合

    复合:一个类中有一个成员变量是另外一个类的对象. 比如我现在要制作一台电脑,电脑需要CPU,显示器,鼠标和键盘等.这些东西的研发都是很复杂的过程.如果现在有成型的CPU等组件,就可以直接用这些组件攒一 ...

  8. 到底什么是面向对象,面试中怎么回答。面向过程和面向对象的区别是什么。java跨平台特性以及java和C++的区别。面向对象的三大特性——封装、继承和多态。面向对象的高拓展性以及低耦合度怎么体现?

    Java语言具有的特点:面向对象.跨平台.多线程以及网络编程 1. 和C++的区别 1.1 Java隐蔽了C++的指针,避免指针直接操作,程序更加安全. 1.2 Java类继承只能单继承,避免了C++ ...

  9. 【Golang第8章:面向对象编程】Go语言的结构体是什么,怎么声明;Golang方法的调用和声明;go语言面向对象实例,go语言工厂模式;golang面向对象的三大特性:继承、封装、多态

    介绍 这个是在B站上看边看视频边做的笔记,这一章是Glang面向对象编程 这一章内容较多,内容有Go语言的结构体是什么,怎么声明:Golang方法的调用和声明:go语言面向对象实例,go语言工厂模式: ...

  10. Python - 面向对象编程 - 三大特性之继承

    继承 继承也是面向对象编程三大特性之一 继承是类与类的一种关系 定义一个新的 class 时,可以从某个现有的 class 继承 新的 class 类就叫子类(Subclass) 被继承的类一般称为父 ...

最新文章

  1. pyinstaller 打包tensorflow2.0为单个文件
  2. 为什么需要自己实现前端框架
  3. php7-internal 7.7 zval的操作
  4. SQL Server 2005中的分区表(一):什么是分区表?为什么要用分区表?如何创建分区表?...
  5. pyecharts x轴字体大小调整_pyecharts 柱状图基础篇#学习笔记#
  6. 模型评价(一) AUC大法 混淆矩阵
  7. 从零开始学前端:初识JavaScript --- 今天你学习了吗?(JS:Day01)
  8. Day_2_Python_str_list_dict的使用
  9. CYQ.Data 轻量数据层之路 华丽升级 V1.3出世(五)
  10. 持续集成部署工具jenkins简介
  11. office安装出现windows installer服务不能更新一个或多个受保护的windows文件
  12. 【上交OJ】1002:二哥种花生(二维前缀和+二维差分---模版题)
  13. SQl盲注原理及其简单演示
  14. linux天气软件,Ubuntu 18.04 6款查询天气的小工具推荐(适用于其它Linux)
  15. chm 文件的阅读、制作和反编译
  16. 奇安信天擎卸载密码_【web安全】记奇安信“渗透测试”培训
  17. python123八边形绘制_使用python实现简单的画多边形。
  18. 检查内存泄露的利器--VLD使用指南
  19. c语言用break语句提前结束循环,break语句C语言程序设计.pdf
  20. 微信小程序使用mock.js

热门文章

  1. python之http协议
  2. 用计算机打青春不打烊,青春不打烊作文
  3. 配置springboot使用c3p0连接池
  4. 《学习如何学习》week3 1.4-1.7 过程VS结果如何改变拖延的习惯如何平衡学习和生活
  5. 高仿qq聊天:qt界面
  6. 如何查看csdn博主所有的文章
  7. JArray 查寻指定对象, jarray 取值
  8. 【牛客】Old Bill(C语言)
  9. mac系统python读取文件路径_Python小技巧:3个处理文件路径的简单方法
  10. 5G将给世界带来哪些变化?