Java面向对象编程作为一种编程思想,有三大特性,封装,继承,多态。对于一个类而言, 如何封装 呢?继承是父类和子类的关系, 继承关系如何实现的呢?父类和子类继承时的方法体是怎么样的关系呢?多态是多个类之间的关系,类有不同的行为和属性,其他类也有这样的方法和属性,就实现了多态的关系,不同类的多态实现是怎么样实现的呢?

一:面向对象编程三大特性

面向对象编程是利用 类和对象编程的一种思想。万物可归类,类是对于世界事物的高度抽象 ,不同的事物之间有不同的关系 ,一个类自身与外界的封装关系,一个父类和子类的继承关系, 一个类和多个类的多态关系。万物皆对象,对象是具体的世界事物,面向对象的三大特征封装,继承,多态,封装,封装说明一个类行为和属性与其他类的关系,低耦合,高内聚;继承是父类和子类的关系,多态说的是类与类的关系。

1. 封装

  • 什么是封装
    把客观事物封装成抽象的类,并且把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。也 就 是 说抽象数据类型对数据信息以及对数据的操作进行打包,将其变成一个不可分割 的实体,在这个实体内部,我们对数据进行隐藏和保密,只留下一些接口供外部调用。

    简单的说,一个类就是一个封装了数据以及操作这些数据的代码的逻辑实体。在一个对象内部,某些代码或某些数据可以是私有的,不能被外界访问。通过这种方式,对象对内部数据提供了不同级别的保护,以防止程序中无关的部分意外的改变或错误的使用了对象的私有部分。

封装隐藏了类的内部实现机制,可以在不影响使用的情况下改变类的内部结构,同时也保护了数据。对外界而已它的内部细节是隐藏的,暴露给外界的只是它的访问方法。

就好比一个烤面包机,我们把面包(数据)放进去,按下开关,过了一会,它就会自动弹出烤好的面包(处理后的信息),而这个过程是怎么烤的(对数据的操作),我们是不需要知道的,
  • 为什么需要封装
    隐藏一个类中不需要对外提供的实现细节;

    属性的封装:使用者只能通过事先定制好的方法来访问数据,可以方便地加入逻辑控制,限制对属性的 不合理操作;

    方法的封装:使用者按照既定的方式调用方法,不必关心方法的内部实现,便于使用; 便于修改,增强 代码的可维护性;
    -如何封装
    利用权限修饰符来描述方法体或属性。private修饰的属性或方法为该类所特有,在任何其他类中都不能直接访问;default修饰的属性或方法具有包访问特性,同一个包中的其他类可以访问;protected修饰的属性或方法在同一个中的其他类可以访问,同时对于不在同一个包中的子类中也可以访问;public修饰的属性或方法外部类中都可以直接访问。

封装类似于黑箱操作,其设计要求是低耦合,高内聚。一个具体复杂的对象有很多的属性和方法,有些需要公开,有些不需要公开,就好比一个具体的人的信息,有些是public,有些是private,而有些是protecred,别人问到的时候对于怎么样的信息都有不同的态度。根据与这个人的关系来回答问题,封装的结果是输出结果,不问过程,其中,public是可以被任何变量访问的,private是该类私有的,protected类是受保护的,可以被该类所述的包内的所有的其他类访问,其子类也可以访问。

比如我们将一个房子看做是一个对象,里面的漂亮的装饰,如沙发、电视剧、空调、茶桌等等都是该房子的私有属性,但是如果我们没有那些墙遮挡,是不是别人就会一览无余呢?没有一点儿隐私!就是存在那个遮挡的墙,我们既能够有自己的隐私而且我们可以随意的更改里面的摆设而不会影响到其他的。但是如果没有门窗,一个包裹的严严实实的黑盒子,又有什么存在的意义呢?所以通过门窗别人也能够看到里面的风景。所以说门窗就是房子对象留给外界访问的接口。

2.继承

- 什么是继承
继承是从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并能扩展新的能力。

在本职上是特殊——一般的关系,即常说的is-a关系。子类继承父类,表明子类是一种特殊的父类,并且具有父类所不具有的一些属性或方法。从多种实现类中抽象出一个基类,使其具备多种实现类的共同特性 ,当实现类用extends关键字继承了基类(父类)后,实现类就具备了这些相同的属性。

继承的类叫做子类(派生类或者超类),被继承的类叫做父类(或者基类)。

比如从猫类、狗类、虎类中可以抽象出一个动物类,具有和猫、狗、虎类的共同特性(吃、跑、叫等)。

  • 如何实现继承: Java通过extends关键字来实现继承,父类中通过private定义的变量和方法不会被继承,不能在子类中直接操作父类通过private定义的变量以及方法。

    继承的优点: 继承避免了对一般类和特殊类之间共同特征进行的重复描述,通过继承可以清晰地表达每一项共同特征所适应的概念范围——在一般类中定义的属性和操作适应于这个类本身以及它以下的每一层特殊类的全部对象。运用继承原则使得系统模型比较简练也比较清晰。
    - 继承有哪些原则
    成员变量的继承原则 具体的原则如下:

    • [u ] 能够继承父类的public和protected成员变量;不能够继承父类的private成员变量;
    • [u ] 对于父类的包访问权限成员变量,如果子类和父类在同一个包下,则子类能够继承;否则,子类不能够继承;
    • [y ] 对于子类可以继承的父类成员变量,如果在子类中出现了同名称的成员变量,则会发生隐藏现象,即子类的成员变量会屏蔽掉父类的同名成员变量。如果要在子类中访问父类中同名成员变量,需要使用super关键字来进行引用。

    1.方法的重写
     子类如果对继承的父类的方法不满意(不适合),可以自己编写继承的方法,这种方式就称为方法的重写.通过重写父类的方法,可以用自身的行为代替父类的行为。当调用方法时会优先调用子类的方法。重写要注意:  a、返回值类型  b、方法名  c、参数类型及个数
     都要与父类继承的方法相同,才叫方法的重写。
     重载和重写的区别:
      方法重载:在同一个类中处理不同数据的多个相同方法名的多态手段。
      方法重写:相对继承而言,子类中对父类已经存在的方法进行区别化的修改
    2. 继承初始化顺序
    父类的构造器调用以及初始化过程一定在子类的前面
      1、初始化父类再初始化子类
      2、先执行初始化对象中属性,再执行构造方法中的初始化。
     基于上面两点,我们就知道实例化一个子类,java程序的执行顺序是:
     父类对象属性初始化---->父类对象构造方法---->子类对象属性初始化—>子类对象构造方法   
     下面有个形象的图:

    继承实例:

  /**1. 我是父类super2. 我是子类sub3. 先打印的是父类里面的在打印的子类里面4. 从这个可以看出是先调用父类的构造方法创建父类对象再来调用子类里面的构造方法*/
class Super{public Super(){System.out.println("我是父类super");}
}
class Sub extends Super{public Sub(){System.out.println("我是子类sub");}
}
public class InstanceDemo {public static void main(String[] args) {new Sub();}
}

运行结果:

3.多态

Java 面向对象编程之多态
相比于封装和继承,Java多态是三大特性中比较难的一个,封装和继承最后归结于多态, 多态指的是类和类的关系,两个类由继承关系,存在有方法的重写,故而可以在调用时有父类引用指向子类对象。自己对于多态的理解还不够深刻,故而转载了一篇关于多态比较好的文章。

public class main {/*** @param args*/public static void main(String[] args) {//分别将animal实例化成三种动物,Animal an = new Dog();an.cry();//根据每种动物自身的方法,自动选择内容an = new Cat();an.cry();an = new UnknowAnimal();an.cry();}
}
//基本类,包含一个基本方法
class Animal{public void cry(){System.out.println("我不知道自己是什么动物。");}
}
//声明子类,继承基本类,但有自己的方法
//实例化后优先使用自身的方法。
class Dog extends Animal{public void cry(){System.out.println("这是一条狗。");}
}class Cat extends Animal{public void cry(){System.out.println("这是一只猫。");}
}
//这个子类自身没定义方法,实例化后会使用从父类继承来的方法
class UnknowAnimal extends Animal{}

运行结果如下:

Java面向对象编程之三大特性相关推荐

  1. Java学习笔记二十五:Java面向对象的三大特性之多态

    Java面向对象的三大特性之多态 一:什么是多态: 多态是同一个行为具有多个不同表现形式或形态的能力. 多态就是同一个接口,使用不同的实例而执行不同操作. 多态性是对象多种表现形式的体现. 现实中,比 ...

  2. Java基础篇——三大特性(封装)

    Java三大特性我会用自己理解给大家一一介绍,有兴趣的可以关注一下,可以让你学到一些基础但是又非常实用的东西,基本上都是自己的一些理解和实践结果,对于新手来说可以避免走弯路(后期会出Java的其他重要 ...

  3. Java语言的三大特性

    Java语言的三大特性即是:封装.继承.多态 封装: 首先,属性可用来描述同一类事物的特征,方法可描述一类事物可做的操作.封装就是把属于同一类事物的共性(包括属性与方法)归到一个类中,以方便使用. 1 ...

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

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

  5. Java基础篇——三大特性(多态)

    这是Java三大特性的最后一篇文章,本篇主要讲解多态的概念和应用.如果是对Java有兴趣的小伙伴可以关注一下,后续会推出一系列的Java基础和进阶的总结(或者说是个人的理解吧!)可以让你学到一些基础但 ...

  6. java面向对象:三大特性:封装,继承,多态

    -----------------------------------面向对象:三大特性:封装,继承,多态 ----------------------------------- 1.什么是类?什么是 ...

  7. 一文带你了解java面向对象的三大特性:继承、封装、多态

    文章目录 1.继承 2.封装 3.多态 本篇文章以同步到:https://www.bithachi.cn/posts/c72fe2cc.html 1.继承 继承是类与类的一种关系,子类拥有父类的所有( ...

  8. Java内存模型三大特性

    文章目录 一.原子性 如何保证原子性? 1.使用原子类来保证线程安全 2.使用synchronized 互斥锁 二.可见性 如何保证可见性? 三.有序性 如何保证有序性? 1.volatile关键字 ...

  9. java基础--面向对象三大特性(二)

    5. 继承 优点:在一定程度上提高代码的复用性(将一些重复的内容不再多次编写) 关键字:extends 子承父业将多个类中的共性再一次抽取,作为一个父类.父类的作用就是用来讲一些重复的内容不再多次编写 ...

  10. java 面向对象编程之二

    面向对象程式设计方法中,封装(英语:Encapsulation)是指,一种将抽象性函式接口的实作细节部份包装.隐藏起来的方法. 封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机 ...

最新文章

  1. docker 连接容器
  2. JEECMS V3.0 常用标签使用说明
  3. pythonrequests发送数据_在python中使用requests 模拟浏览器发送请求数据的方法
  4. Oracle 序列的创建和使用
  5. Amarino例程无法使用的问题
  6. IE报vuex requires a Promise polyfill in this browser问题解决
  7. 哆啦A梦消除连连看游戏源码项目完整版
  8. 检查图形是否为真彩色图形
  9. 网站开发和企业级开发有什么区别?
  10. java 读取 excel poi_Java中读取Excel功能实现_POI
  11. CPU VS GPU笔记
  12. pb实现简单计算器的思想_【python实用编程之简单矩阵计算器实现】GUI编程
  13. 2019云计算战局前瞻:百度云要啃“硬骨头”
  14. 机载激光雷达测量技术及工程应用实践_倾斜摄影与激光雷达技术在实景三维测量应用中的比较...
  15. 服务器CPU与家用个人电脑CPU的区别详解
  16. map和object对象互转
  17. 什么是栈,栈及其特点和应用详解
  18. 计算机专业论文提纲,计算机硕士毕业论文提纲(范文精选)
  19. edup无线网卡驱动安装linux,EDUP无线网卡驱动下载-EDUP无线网卡驱动排行榜-比克尔下载...
  20. 《操作系统真象还原》第十章

热门文章

  1. 深度分析《英雄联盟》游戏运营商背后的大数据支撑体系
  2. 解决Python print 输出文本显示 gbk 编码错误问题
  3. xml.html一键解密工具,AutoJs一键解密
  4. 雷达波形样式_雷达技术的发展趋势概述
  5. 基于STM32F103完成对SD卡的数据读取操作
  6. 1031 查验身份证 (15 分) 一个合法的身份证号码由17位地区、日期编号和顺序编号加1位校验码组成。
  7. linux编译生成动态库、静态库,以及使用
  8. MATLAB牛拉法计算潮流,Matlab牛拉法潮流计算程序
  9. 关于Dll、Com组件、托管dll和非托管dll
  10. PHP函数strcmp,PHP strcmp函数