封装、继承、多态的详细说明
封装
1、封装的含义:封装是实现面向对象程序设计的第一步,封装就是将数据或函数等集合在一个个的单元中(我们称之为类)。被封装的对象通常被称为抽象数据类型。
2、封装的作用:封装的作用在于保护或者防止代码(数据)被我们无意中破坏。在面向对象程序设计中数据被看作是一个中心的元素并且和使用它的函数结合的很密切,从而保护它不被其它的函数意外的修改
继承
子类继承了所有的属性和方法,非私有的属性和方法可以在子类中直接访问,但是私有的属性和方法不能在子类直接访问,要通过公共的方法去访问(get set)
子类必须调用父类的构造器,完成父类的初始化
当创建子类对象时,不管使用子类的那个构造器,默认情况下 总会去调用父类的无参构造器,如果父类没有提供无参构造器,则必须在子类的构造器中用 super 去指定使用父类的哪个构造器,完成对父类的初始化工作,否则,编译不会通过
如果希望指定去调用父类的某个构造器,则显示的调用一下:super(参数列表)
super在使用时,需要放在构造器的第一行(super只能在构造器中使用)
super() 和 this() 都只能放在构造器的第一行,因此这两个方法不能共存在于一个构造器中
java所有类都是Object类的子类,Object是所有类的基类(父类)
父类构造器的调用不限于直接父类! 将一直往上追溯直到Object类(顶级父类)
子类最多只能继承一个父类(指直接继承),即 java中是 单继承机制
不能滥用继承, 子类和父类之间必须满足 is-a 的逻辑关系
就近原则:
- 首先看创建的子类是否有该属性
- 如果子类有这个属性,并且可以访问,则返回信息
- 如果子类没有这个属性,就看他的上一级的父类 有没有这个属性(如果父类有该属性,并且可以访问,就返回信息
- 如果父类没有 就按照3 的规则,继续找它的上级父类,直到Object…
注意点::
如果子类去调用某个属性,这个属性子类本身没有 但父类有,却是private 则会报错
如果父类的父类也有该属性 并且是public的,但是依旧会报错,因为你最初找到的 那个属性 是 private 的
如下面的 age:
public static void main(String[] args){Son son = new Son();System.out.println(son.age) // 会报错
}
class GrandPa{int age = 70;
}
class Father extengds GrandPa{private int age = 40;
}
class Son extends Father{
}
重写:需要有继承关系,子类重写父类的方法!
- 方法名必须相同
- 参数列表也必须相同
- 修饰符:范围只能扩大不能缩小: public>Protected(保护的) > Default(默认的) > private(私有的)
- 重写会抛出异常:范围,可以被缩小,但不能被扩大(重写异常抛出范围不能大于父类)
多态
即 同一个方法可以根据发送对象的不同而采用多种不同的行为方式
一个对象的实际类型是确定的,但可以指向对象的引用的类型有很多
多态的存在条件:
- 有继承关系
- 子类重写父类方法
- 父类引用指向子类对象
注意: 多态是方法的多态,属性没有多态性
多态的前提是:两个对象(类) 存在继承关系
多态的向上转型
本质:父类的引用指向了 子类的对象
语法:父类类型 引用名 = new 子类类型();
特点: 编译类型看 等号 左边,运行类型看 等号 右边
可以调用父类中的所有成员(需要遵守访问权限) 但不能调用子类中特有成员
最终运行效果看子类的具体实现!
多态的向下转型:
- 语法: 子类类型 引用名 = (子类类型) 父类引用;
- 只能强转父类的引用,不能强转父类的对象
- 要求父类的引用必须指向的是 当前目标类型的对象
- 当向下转型后,就可以调用子类类型中所有的成员
编译类型看等号的左边 运行类型看等号的右边
public static void main(String args[]){// 向上转型: 父类的引用指向了子类的对象// 语法: 父类类型 引用名 = new 子类类型();Animal animal = new Cat();// 可以调用父类中的所有成员(需要遵守访问权限)// 但是不能调用子类的特有的成员// 因为在编译阶段,能调用哪些成员,是由编译类型来决定的// animal.cry(); 所以是错误的// 最终运行效果看子类(运行类型)的具体实现, 即调用方法时,按照子类(运行类型)// 开始查找方法,然后调用,规则跟前面的方法调用规则一致。animal.eat(); // 先看子类Cat类里面有没有eat()方法; 因为有 所以输出 猫吃鱼// animal.cry(); // 为什么不能调用 cry()方法, 因为父类Animal里面没有该方法 编译器 认为你调用的// 方法在Animal中 但Animal里面没有 所以就会报错animal.run(); // 因为子类中没有run()方法, 所以就调用父类的run()方法 输出 run// 我现在想,可以调用Cat的 catchMouse()方法// 多态的向下转型// 语法: 子类类型 引用名 = (子类类型) 父类引用;// 问一个问题? cat 的编译类型 Cat, 运行类型是 Cat (= 号左右)Cat cat = (Cat) animal;cat.cry(); // cry
}class Animal{public void run (){System.out.println("run");}public void eat(){System.out.println("eat")}
}class Cat extends Animal{public void cry(){System.out.println("cry");}public void eat(){System.out.println("猫吃鱼")}
}
注意::
属性没有重写之说!!! 属性没有重写之说!!! 属性没有重写之说!!!
public class PolymorphicDetail {public static void main(String[] args) {// 属性没有重写之说! 属性的值看 编译类型Base base = new Sub();// 向上转型System.out.println(base.count); //因为属性的值看编译类型 所以输出10}
}class Base { // 父类int count = 10; //属性
}class Sub extends Base { //子类int count = 20; //属性
}
比较操作符: instanceof
//instanceof 比较操作符,用于判断对象的运行类型是否为xx类型或xx类型的子类型public class PolymorphicDetail {public static void main(String[] args) {BB bb = new BB();System.out.println(bb instanceof BB); // trueSystem.out.println(bb instanceof AA); // trueSystem.out.println(bb instanceof Object);// true// aa 的编译类型 AA, 运行类型是 BB// instanceof 对象看的是运行类型AA aa = new BB();System.out.println(aa instanceof AA); // trueSystem.out.println(aa instanceof BB);// true}
}class AA {}
class BB extends AA{}
封装、继承、多态的详细说明相关推荐
- Java继承_Hachi君浅聊Java三大特性之 封装 继承 多态
Hello,大家好~我是你们的Hachi君,一个来自某学院的资深java小白.最近利用暑假的时间,修得满腔java语言学习心得.今天小宇宙终于要爆发了,决定在知乎上来一场根本停不下来的Hachi君个人 ...
- python多态的三种表现形式_python小结----面向对象的三大特征(封装,继承,多态)
面向对象的三大特征: 封装,继承,多态 面向对象的编程思想核心:高类聚,低耦合–程序的设计模式范畴 封装 什么是封装: 在面向对象编程的思想中,对代码进行高度封装,封装又叫包装 封装就是指将数据或者函 ...
- python 参数类型的多态_【Python】面向对象:类与对象\封装\继承\多态
六.Python面向对象--类与对象\封装\继承\多态 1.什么是面向对象编程 1.1 程序设计的范式:程序可控,易于理解 1.2 抽象并建立对象模型 1.3 程序是不同对象相互调用的逻辑.每个对象在 ...
- python--编写程序:实现乐手弹奏乐器,乐手可以弹奏不同的乐器而发出不同的声音------使用类的封装继承多态的问题/使用面向对象的思想,设计自定义类,描述出租车和家用轿车的信息
编写程序:实现乐手弹奏乐器,乐手可以弹奏不同的乐器而发出不同的声音 ------使用类的封装继承多态的问题 class Instrumnet():#乐器类def make_sound(self):pa ...
- c语言编程 菲薄拉,C语言设计模式-封装-继承-多态
快过年了,手头的工作慢慢也就少了,所以,研究技术的时间就多了很多时间,前些天在CSDN一博客看到有大牛在讨论C的设计模式,正好看到了,我也有兴趣转发,修改,研究一下. 记得读大学的时候,老师就告诉我们 ...
- 大数据笔记8—java基础篇4(面向对象-封装-继承-多态)
面向对象 一.面向对象 1.面向过程 1.2.举例 1.3.总结 二.面向对象 1.简述 2.举例 3.思想特点 2.1.类的定义格式 2.1.1.简述 2.2.2.格式 2.3.3.示例 三.类的使 ...
- 小白理解——封装继承多态
一.封装 是什么:首先是抽象,把事物抽象成一个类,其次才是封装.对外表示为一个对象,隐藏对象的属性和动作实现的细节,仅对外公开接口. ...
- Day55-每日一道Java面试题-Java 面向对象编程三大特性: 封装 继承 多态
Java 面向对象编程三大特性: 封装 继承 多态 封装 封装把一个对象的属性私有化,同时提供一些可以被外界访问的属性的方法,如果属性不想被外界访问,我们大可不必提供方法给外界访问.但是如果一个类没有 ...
- 面向对象 编程及面向对象三大属性:封装 继承 多态
面向对象 面向对象(Object Oriented,OO)是软件开发方法.面向对象的概念和应用已超越了程序设计和软件开发,扩展到如数据库系统.交互式界面.应用结构.应用平台.分布式系统.网络管理结构. ...
- 白话文带你了解 封装 继承 多态
这里讲的仅仅是带你理解 封装 继承 多态 染好您可以移步去别的文章学习具体的实现 (只是个人理解 您可以不爱,请别伤害哦!) 首先你要知道 java是面向对象的,说白了就是我拿你当个人,请认清你的地位 ...
最新文章
- 哪里不知道“瞄”哪里,这项AI黑科技,打开手机就能体验
- java 贝塞尔_java贝塞尔曲线翻页效果
- 安全中间件与应用服务间如用session
- 怎么测试ajax get请求,为什么我的AJAX在运行测试时请求dev中的PUT请求,但请求了GET请求?...
- r语言三维柱状图_R语言三维图的绘制
- matlab两张图片合成一张_二次曝光合成手机照片剪影照并不难,这样用snapseed轻松实现...
- 使用 Design Pattern Toolkit 进行模型驱动的开发入门
- HR:你为什么选择计算机这个行业?
- 计算机科技的主题,科技感十足的电脑桌面,私藏多年,60多个主题和皮肤统统给大家...
- Grads:绘制风流畅
- SAP学习之北冥神功
- 蓝牙BQB 认证流程
- 中南大学计算机学院张伟,张伟(数学家)_百度百科
- Unirech-阿里云国际版云服务器ecs实例使用中的常见问题汇总
- Latex快速制表工具
- 安卓8.1 AEX5.4 Xposed框架T9拨号移植
- STM32 GPIO的配置寄存器(CRL、CRH)输入输出模式配置
- .resource文件如何打开
- 双向链表增删改查分析
- 二叉排序树,平衡二叉树和哈夫曼树