面向对象三大特征:封装、继承、多态

封装指的是将对象的状态信息和行为捆绑为一个逻辑单元的机制,将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问。简单来说就是属性私有化,对外提供统一访问的get/set方法。

下面通过程序来理解一下封装。

public class Person {
private int age;//属性私有化,这是封装的要求
private String name;
//无参的构造方法,构造方法名和类名相同,默认有该构造方法
//如果写了别的构造方法,则不再自动提供该构造方法
public Person() {
super();
}
//有参的构造方法,可以通过this.方法访问到本来的属性
public Person(int age, String name) {
super();
this.age = age;
this.name = name;
}
//写age和name的get和set方法,我们可以使用快捷键Shift+Alt+s
//然后在其中找关于get和set字样的一条,方法就会自动写好了
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class TestPerson {
public static void main(String[] args) {
//通过new+构造方法的方式创建了一个Person对象
Person p = new Person(30,"李四");//这里我们直接定义了对象的年龄和名字
//通过get方法得到年龄和名字并输出
System.out.println("年龄:"+p.getAge()+",姓名:"+p.getName());
//同样可以通过一下方式定义
p.setAge(20);//设置年龄为20
p.setName("张三");//设置名字为张三
System.out.println("年龄:"+p.getAge()+",姓名:"+p.getName());
}
}
//运行结果
//年龄:30,姓名:李四
//年龄:20,姓名:张三

简单说了一下封装,下面说一下继承。Java继承通过extends关键字来实现,实现继承的类被称为子类,被继承的类被称为父类。Java具有单继承的特点,每个子类只有一个直接父类。

继承有两点好处1.代码的复用,2为了以后多态的使用。

继承需要注意的地方有几点:一般的属性和方法可以被继承,构造方法不被继承,私有的方法不被继承,私有的属性被隐藏,可以通过继承来的公有方法访问。

下面通过一个程序简单理解一下继承。

//父类Person
public class Person {
private String name;
private int age;
public Person(){
}
public Person(String name,int age){
this.name = name;
this.age = age;
}
//父类的方法
public void print(){
System.out.println("姓名:"+this.name+",年龄:"+this.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;
}
}
//子类Student
public class Student extends Person {
private int sid;
// 避免使用和父类中同样名字的属性
// private String name;
// public void test(){
// this.name = "姓名";
// }
public Student() {
super();
}
public Student(int sid) {
super();
this.sid = sid;
}
public Student(String name, int age, int sid) {
super(name, age);// 调用父类的构造方法,这样就不用写下面的两句了
// this.setName(name);
// this.setAge(age);
this.setSid(sid);
}
//重写了父类的方法,调用的时候调用重写之后的子类的方法
public void print() {
System.out.println("测试");
//调用父类的方法
super.print();
}
public static void main(String[] args) {
// Student s = new Student("张飞",20); 构造方法不被继承。
Student s = new Student();
// s.name = "张飞";由于name是私有属性,所以不能继承
// s.print();
//通过继承来的方法来访问
s.setName("张飞");
s.setAge(20);
s.print();
}
public int getSid() {
return sid;
}
public void setSid(int sid) {
this.sid = sid;
}
}
//执行结果
//测试
//姓名:张飞,年龄:20

下面说一下多态的概念及使用。顾名思义多态即一个对象,多种状态,父类引用指向子类的对象。

多态两点基本定理:

1. 发生多态时,只能调用父类的方法,不能调用子类的方法。

2. 发生多态时,如果子类中重写了父类的方法,再调用这个方法,调用的是子类重写之后的方法。

下面通过程序理解一下多态。

//父类Pet
public class Pet{
private String name;
private int age;
public Pet() {
super();
}
public Pet(String name, int age) {
super();
this.name = name;
this.age = age;
}
public static void test(){
System.out.println("父类静态测试方法");
}
public void eat(){
System.out.println("Pet:不知道吃什么");
}
//重写toString方法
public String toString(){
return "姓名:"+this.name+",年龄:"+this.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;
}
}
//子类Dog
public class Dog extends Pet {
public static void test(){
System.out.println("子类静态方法重写");
}
public void catchMouse(){
System.out.println("Dog:狗跑的快");
}
//如果我们不重写子类的这个方法,默认调用的则是父类的方法
public void eat(){
System.out.println("Dog:狗吃骨头");
}
public static void main(String[] args) {
Pet p =  new Dog();//用Pet创建了一个Dog的对象
p.eat();//由于重写了父类的方法,所以调用的是子类的
Pet.test();// 父类静态测试方法
Dog.test();//调用子类的静态方法
//      p.catchMouse();//因为父类没有这个方法,所以这句话会报错
//      Dog d = new Dog();
//      d.catchMouse();
//这样就可以根据上面创建的p属于哪类对象而调用对应的方法
if(p instanceof Dog){//判断p是否属于Dog的类型
Dog d = (Dog)p;// 新建对象?没有新建对象
d.catchMouse();
}else if(p instanceof Cat){
Cat c = (Cat)p;
c.climb();
}
}
}
//子类Cat
public class Cat extends Pet{
public void eat(){
System.out.println("Cat:猫吃鱼");
}
public void climb(){
System.out.println("Cat:猫捉老鼠");
}
}
//执行结果,如果创建的是Cat的对象,那么结果可想而知
//Dog:狗吃骨头
//父类静态测试方法
//子类静态方法重写
//Dog:狗跑的快

转载于:https://blog.51cto.com/libaiqiang/1259314

面向对象三大特征:封装、继承、多态相关推荐

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

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

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

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

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

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

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

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

  5. 三大特征 封装 继承 多态

    ''' 1.面向对象与面向过程 面向过程:核心过程二字,过程即解决问题的步骤,就是先干什么后干什么 基于该思想写程序就好比在这是一条流水线,是一种机械式的思维方式 优点:复杂的过程流程化 缺点:扩展性 ...

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

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

  7. c++局部对象是什么_面向对象三大特征: 封装

    今日内容 面向对象概述 类和对象的关系 面向对象内存图 private.this关键字和封装 面向对象之构造方法 面向对象三大特征 封装 继承 多态 01. 面向过程和面向对象思想概述 什么是面向过程 ...

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

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

  9. 面向对象第七章,内存的管理,面向对象三大特征封装、继承、多态

    ###1.内存管理:由JVM来管理的------了解 1)堆: 1.1)存储new出来的对象(包括实例变量) 1.2)垃圾:没有任何引用指向的对象 垃圾回收器(GC)不定时到内存中清扫垃圾, 回收过程 ...

  10. c++面向对象三大特征封装、继承和多态知识总结

    面向对象三大特征:封装,继承,多态: 一.封装:该公开的就公开话,该私有的就隐藏掉,主要是由public,private实现:作用是便于分工和分模块,防止不必要的扩展: 二.继承:就是一种传承,可以把 ...

最新文章

  1. 【Linux运维】Centos7上借助ansible搭建LVS+Keepalived
  2. Scala入门到精通——第十六节 泛型与注解
  3. 『对比Excel,轻松学习Python数据分析』新书发布
  4. linux 22.3 终端,Linux系统服务Day.22
  5. 学数据库还不会Select,SQL Select详解,单表查询完全解析?
  6. [poj1410]Intersection
  7. c语言动态的申请矩阵存储空间,C语言中二维数组如何申请动态分配内存
  8. 织梦(Dedecms)V5.6 远程文件删除漏洞
  9. 【学习笔记】人体姿态识别
  10. msicuu2微软卸载工具
  11. 计算机的冷门知识课件,PPT竟然还能这么玩!7组超实用冷门PPT小技巧
  12. soap报文解析 php,soap 返回报文解析
  13. unity商店demo学习:俯视视角RPG游戏
  14. Android短信开发 发送彩信 ‘ 高通源码 ‘ (彩信发送过程1)
  15. 办公用PC机的CPU是基于冯诺伊曼结构,然而单片机是哈佛结构的
  16. 阿里云服务器安装mongodb
  17. codeblocks 10.5配置vc2008x64编译器
  18. 电赛硬件电路设计抗干扰措施
  19. python-实现保留3位有效数字(四舍六入五成双规则)
  20. 关于文件复制,文件名乱码的问题

热门文章

  1. TCP粘包拆包基本解决方案
  2. 如何用Eclipse进行单元测试
  3. centos Install Docker
  4. 2014.7.8模拟赛【笨笨当粉刷匠】|bzoj1296 [SCOI]粉刷匠
  5. 转 Grub4Dos硬盘安装Fedora/CentOS Linux操作系统
  6. 我的each方法——JavaScript Array
  7. usionCharts 技术文档-Jsp画图
  8. 2018-2019-2 网络对抗技术 20165301 Exp 9 Web安全基础
  9. oracle sql 字段行转列
  10. jquery做一个表单验证