好几次面试都问到了这个问题,回答的也都不好,暂且总结一下:
       我的理解是:面向对象是向现实世界模型的自然延伸,这是一种”万物皆对象”的编程思想。在现实生活中的任何物体都可以归为一类事物,而每一个个体都是一类事物的实例。
       面向对象有三大特性:封装、继承、多态。
       (1)封装。是将一类事物的属性和行为抽象成一个类,一般是使其属性私有化,行为公开化,提高了数据的隐秘性的同时,使代码模块化。这么做的好处是:
              • 将变化隔离。
              • 便于使用。
              • 提高代码复用性。
              • 提高安全性。
       封装原则:
              • 将不需要对外提供的内容都隐藏起来。
              • 把属性都隐藏,提供公共方法对其访问。
Java中可以通过对类的成员设置一定的访问权限,实现类中成员的信息隐藏。

private:类中限定为private的成员,只能被这个类本身访问。如果一个类的构造方法声明为private,则其它类不能生成该类的一个实例。
default:类中不加任何访问权限限定的成员属于缺省的(default)访问状态,可以被这个类本身和同一个包中的类所访问。
protected:类中限定为protected的成员,可以被这个类本身、它的子类(包括同一个包中以及不同包中的子类)和同一个包中的所有其他的类访问。
public:类中限定为public的成员,可以被所有的类访问。

       (2)继承。基于已有的类的定义为基础,构建新的类,已有的类称为父类,新构建的类称为子类,子类能调用父类的非private修饰的成员,同时还可以自己添加一些新的成员,扩充父类,甚至重写父类已有的方法,更其表现符合子类的特征。
       Java中父类可以拥有多个子类,但是子类只能继承一个父类,称为单继承。
       继承的好处是:
              • 实现了代码的复用。
              • Java中所有的类都是通过直接或间接地继承java.lang.Object类得到的。
              • 子类不能继承父类中访问权限为private的成员变量和方法。
              • 子类可以重写父类的方法,即命名与父类同名的成员变量。

Java中通过super来实现对父类成员的访问,super用来引用当前对象的父类。super 的使用有三种情况:
              • 访问父类被隐藏的成员变量,如:super.variable;
              • 调用父类中被重写的方法,如:super.Method([paramlist]),super())调用父类构造方法;
              • 调用父类的构造函数,如:super([paramlist]);

super和this的用法相同:this代表本类应用 ;super代表父类引用 。当子父类出现同名成员时,可以用super进行区分 ,子类要调用父类构造函数时,可以使用super语句。
       在子类覆盖方法中,继续使用被覆盖的方法可以通过super.函数名获取。

注意:

1 . 子类中所有的构造函数默认都会访问父类中空参数的构造函数,因为每一个构造函数的第一行都有一条默认的语句 super();子类会具备父类中的数据,所以要先明确父类是如何对这些数据初始化的。当父类中没有空参数的构造函数时,子类的构造函数 必须通过this或者super语句指定要访问的构造函数。

2 . 覆盖时,子类方法权限一定要大于等于父类方法权限静态只能覆盖静态。父类中的私有方法不可以被覆盖。

3.被final修饰的类是一个最终类,不可以被继承。
             被final修饰的方法是一个最终方法,不可以被覆盖。
             被final修饰的变量是一个常量,只能赋值一次。

4.内部类只能访问被final修饰的局部变量。
       (3)多态。方法的重写、重载与动态连接构成多态性。如果说封装和继承是为了使代码重用,那么多态则是为了实现接口重用。多态的一大作用就是为了解耦–为了解除父子类继承的耦合度。如果说继承中父子类的关系式IS-A的关系,那么接口和实现类之之间的关系式HAS-A。简单来说,多态就是允许父类引用(或接口)指向子类(或实现类)对象。很多的设计模式都是基于面向对象的多态性设计的。
       多态性:发送消息给某个对象,让该对象自行决定响应何种行为。

通过将子类对象引用赋值给超类对象引用变量来实现动态方法调用。

  java 的这种机制遵循一个原则:当超类对象引用变量引用子类对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,但是这个被调用的方法必须是在超类中定义过的,也就是说被子类覆盖的方法。

  1. 如果a是类A的一个引用,那么,a可以指向类A的一个实例,或者说指向类A的一个子类。

  2. 如果a是接口A的一个引用,那么,a必须指向实现了接口A的一个类的实例。要理解多态性,首先要知道什么是“向上转型”。
  
子类Cat继承了Animal类,那么后者就是前者是父类。

  Cat c = new Cat();//实例化一个Cat的对象,

  Animal a = new Cat();//定义了一个Animal类型的引用,指向新建的Cat类型的对象
  由于Cat是继承自它的父类Animal,所以Animal类型的引用是可以指向Cat类型的对象的。那么这样做的什么意义是:因为子类是对父类的一个改进和扩充,所以一般子类在功能上较父类更强大,属性较父类更独特,
  定义一个父类类型的引用指向一个子类的对象既可以使用子类强大的功能,又可以抽取父类的共性。
  所以,父类类型的引用可以调用父类中定义的所有属性和方法,但是对于子类中定义而父类中没有的方法,它是无可奈何的;
  同时,父类中的一个方法只有在在父类中定义而在子类中没有重写的情况下,才可以被父类类型的引用调用;
  对于父类中定义的方法,如果子类中重写了该方法,那么父类类型的引用将会调用子类中的这个方法,这就是动态连接。
  实现多态,有二种方式,覆盖(override),重载(overload)。

覆盖,是指子类重新定义父类的虚函数的做法。它是覆盖了一个方法并且对其重写,以求达到不同的作用。在覆盖要注意以下的几点:
              1、覆盖的方法的标志必须要和被覆盖的方法的标志完全匹配,才能达到覆盖的效果;
              2、覆盖的方法的返回值必须和被覆盖的方法的返回一致;
              3、覆盖的方法所抛出的异常必须和被覆盖方法的所抛出的异常一致,或者是其子类;
              4、被覆盖的方法不能为private,否则在其子类中只是新定义了一个方法,并没有对其进行覆盖。

重载,是指允许存在多个同名函数,而这些函数的参数表不同(或许参数个数不同,或许参数类型不同,或许两者都不同)。它是指我们可以定义一些名称相同的方法,通过定义不同的输入参数来区分这些方法,然后再调用时,在使用重载要注意以下的几点:
              1、在使用重载时只能通过不同的参数样式。例如,不同的参数类型,不同的参数个数,不同的参数顺序(当然,同一方法内的几个参数类型必须不一样,例如可以是fun(int,float),但是不能为fun(int,int));
              2、不能通过访问权限、返回类型、抛出的异常进行重载;
              3、方法的异常类型和数目不会对重载造成影响;
              4、对于继承来说,如果某一方法在父类中是访问权限是priavte,那么就不能在子类对其进行重载,如果定义的话,也只是定义了一个新方法,而不会达到重载的效果。

多态也有弊端:当父类引用指向子类对象时,虽然提高了扩展性,但是只能访问父类中具备的方法,不可以访问子类中特有的方法。(前期不能使用后期产生的功能,即访问的局限性)
       参考文章:
              对于面向对象的简单理解
              面试总结之谈谈你对面向对象的理解
              面试——你是如何理解java的面向对象思想

如何理解Java中的面向对象相关推荐

  1. 简单理解Java中的面向对象

    java基础之面向对象 面向对象是什么 打个比方,你找对象的时候,是不是应该找人类?更具体点,你是在找茫茫人海中的一个个体,每个人都是不同的.在Java中,同一个类也是有不同的对象的,但都有相同的.基 ...

  2. 如何理解Java中的自动拆箱和自动装箱?

    小伟刚毕业时面的第一家公司就被面试官给问住了,记忆尤深啊- 如何理解Java中的自动拆箱和自动装箱? 自动拆箱?自动装箱?什么鬼,听都没听过啊,这-这-知识盲区- 回到家后小伟赶紧查资料,我透,这不就 ...

  3. Java重载和重写6_深入理解Java中的重写和重载

    深入理解Java中的重写和重载 重载(Overloading)和重写(Overriding)是Java中两个比较重要的概念.但是对于新手来说也比较容易混淆.本文通过两个简单的例子说明了他们之间的区别. ...

  4. 如何理解Java自动装箱_如何理解Java中的自动拆箱和自动装箱?

    如何理解Java中的自动拆箱和自动装箱? 自动拆箱?自动装箱?什么鬼,听都没听过啊,这...这..知识盲区... 回到家后小伟赶紧查资料,我透,这不就是问基本类型跟封装类型吗,面试官整啥名词呢... ...

  5. 深入理解Java中的内存泄漏

    理解Java中的内存泄漏,我们首先要清楚Java中的内存区域分配问题和内存回收的问题本文将分为三大部分介绍这些内容. Java中的内存分配 Java中的内存区域主要分为线程共享的和线程私有的两大区域: ...

  6. 理解Java中的弱引用(Weak Reference)

    理解Java中的弱引用(Weak Reference) 本篇文章尝试从What.Why.How这三个角度来探索Java中的弱引用,理解Java中弱引用的定义.基本使用场景和使用方法.由于个人水平有限, ...

  7. 深入理解Java中的final关键字

    深入理解Java中的final关键字 http://www.importnew.com/7553.html Java中的final关键字非常重要,它可以应用于类.方法以及变量.这篇文章中我将带你看看什 ...

  8. 如何理解 JAVA 中的 volatile 关键字

    如何理解 JAVA 中的 volatile 关键字 最近在重新梳理多线程,同步相关的知识点.关于 volatile 关键字阅读了好多博客文章,发现质量高适合小白的不多,最终找到一篇英文的非常通俗易懂. ...

  9. java中demo接人_return的用法_如何理解java中return的用法?

    C语言中return用法?(请熟练者进) return是返回值,这个返回值是和函数的类型有关的,函数的类型是什么,他的返回值就是什么 比方主函数intmain() {}这里就必须有一个return,只 ...

最新文章

  1. 被操纵的BCE与去中心化的BCH
  2. python重复执行_python flask schedule重复运行 任务被重复执行问题 解决方案
  3. 哪里可以接到python的活干-越忙越穷?赶紧把瞎忙活的事情交给Python吧!
  4. .net erp(办公oa)开发平台架构概要说明之表单设计器
  5. hihocder 1181 : 欧拉路·二
  6. SSO之CAS单点登录详细搭建
  7. Request_获取请求参数中文乱码问题处理
  8. 黑马程序员————java中面向对象的三大特性
  9. en55032最新标准下载_施工升降机事故案例ppt(可下载)
  10. 基于Packet Tracer 的校园网络设计方案(计算机网络与通信技术课程实验)(二)——IP网络仿真配置
  11. 中彩3d组合王 霏凡软件站
  12. 阿里巴巴实习生招聘 不完全指南
  13. [NOI2015]小园丁与老司机
  14. 二项式分布(Binomial Distribution)
  15. 从Unix看文言文为什么短
  16. 腾讯、阿里、京东员工下班不回家,原因竟然是……
  17. Linux常用命令——mv命令
  18. 上帝 谭卓 马加爵等人的对话
  19. Source Insight 4.x完美激活破解安装图文教程
  20. SD卡扇区损坏引起了读文件失败

热门文章

  1. 2021-09-10 文件上传时,文件的格式的区别,如application/x-www-form-urlencoded
  2. ingress配置无效,zuul重启nginx重启奔溃,nginx-ingress-controller无法启动
  3. HTML+CSS详细介绍(全)
  4. 转眼又是一年国庆节和中秋节,假日好好休息一下,不想太累!
  5. 史上最全的xpath定位方法 全在这了!
  6. fileReader字符流读取中文乱码的解决办法
  7. linux初始mysql_linux mysql初始化
  8. Oracle-添加列(字段)与注释
  9. 专升本英语——语法知识——高频语法——第一节 时态和语态——主动表被动【学习笔记】
  10. 详解scheduleAtFixedRate 与 scheduleWithFixedDelay 的区别