1.对面向对象的理解

面向过程

面向过程,核心是过程二字。过程即解决问题的步骤,设计一条流水线,机械式的思维方式。它考虑的是实际地实现,针对一个特定的问题去思考其解决步骤。学过C语言的同学就知道,用C语言编程,我们需要去解析题意,分析目的,画出流程图,按着步骤实现。这就是一种面向过程的思考方式。一般的面向过程是从上往下步步求精,所以面向过程最重要的是模块化的思想方法。因此在模块化编程的时候才会有“低耦合,高内聚”的思想来提高效率。

面向对象

面向对象离不开面向过程,我们可以把面向过程当做面向对象每一部分的实现。就比如造车,面向对象就是思考车这个对象是由什么组成的,而每一个零件的制作就是一个个过程要经过一道道工序才能做出来。因此,面向对象可以帮助我们从宏观上把握、从整体上分析整个系统。 但是,具体到实现部分的微观操作(就是一个个方法),仍然需要面向过程的思路去处理。

两种思想的对比

面向过程是具体化的、流程化的。解决一个问题,需要一步一步分析需要怎样,然后需要怎样,一步一步实现的。面向对象是模型化的,抽象出一个类,这是一个封闭的环境,在这个环境中有数据、有解决问题的方法,你如果需要什么功能直接使用就可以了,至于是怎么实现的,你不用知道。

2.面向对象重要名词介绍

类与构造方法

类是把同类事物的共同特征行为封装在一起的结构体,事物的特征称为属性,事物的行为称为方法,类是抽象的概念集合,表示的是一个共性的产物,类中定义的是属性和方法。 换句话说,类就是一个用来创建具有某些属性和行为对象的模板,其中变量表明对象的状态,方法表明对象所具有的行为。就好比,用来造车的图纸。

构造方法

构造方法是一种特殊的方法,它是一个与类同名且返回值类型为同名类类型的方法。对象的创建就是通过构造方法来完成,其功能主要是完成对象的初始化。当类实例化一个对象时会自动调用构造方法。 构造方法和其他方法一样也可以重载。通过一个类创建一个对象,这个过程叫做实例化 。 实例化是通过调用构造方法实现的 。

构造方法是一种特殊的成员方法,它的特殊性反映在如下几个方面:

  • 构造方法的名字必须与定义他的类名完全相同,没有返回类型,甚至连void也没有。

  • 主要完成对象的初始化工作,构造方法的调用是在创建一个对象时使用new操作进行的。

  • 类中必定有构造方法,若不写,系统自动添加无参构造方法。接口不允许被实例化,所以接口中没有构造方法。

  • 构造方法在初始化对象时自动执行,一般不能显式地直接调用.当同一个类存在多个构造方法时,java编译系统会自动按照初始化时最后面括号的参数个数以及参数类型来自动一一对应。完成构造函数的调用。

  • 构造方法可以被重载。没有参数的构造方法称为默认构造方法,与一般的方法一样,构造方法可以进行任何活动,但是经常将他设计为进行各种初始化活动,比如初始化对象的属性。

对象与实例化对象

对象: 对象就是类的一个实例。由一个类可以创建无数个对象,就好比根据一张图纸来造车一样,我们可以根据图纸生产无数量车。对象与类的区别在于,类就是一张图纸不占空间,而对象是一个具体的事物,占据一定的空间。创建好一个对象后,这个对象就可以拥有类的基本属性和方法。

实例化对象:在Java中,我们用类名 对象名=new 类名(); 这用形式来实例化一个对象。

  • int a = 47;相信学过编程的同学一定不陌生,int是数据类型,a是变量名也可以理解为一个对象,47即将对象a初始化为47。

  • 那么Test a = new Test();也是类似。Test是类名,也就是对象的类型。a是对象名。new是一个关键字,而Test()是类Test的构造方法,用来给新创建的对象进行初始化。连起来就是创建一个名称为a的Test类的以Test()构造方法初始化的实例化对象。

不过这里还是与直接赋值有些区别,这条语句是把这个新创建的对象在内存中的地址 赋值 给变量h,这就是Java中引用概念,h就叫做引用,或者叫引用变量,或者直接叫变量,都没问题。h的值就是一个内存地址,或者叫引用地址。Java中的引用我们可以理解为C语言的指针。

下面我们详细解读一下这条语句:

  • 类名 对象名 创建名称为“对象名”的“类名”类引用变量
    new ; 创建一个新对象。
    类名() 构造方法; 作用是初始化对象。
    new 类名(); 以构造方法(可以添加参数)实例化对象;
    类名 对象名=new 类名(); ** 用指针的解释就是以无参数构造方法实例化对象并将这个对象的内存引用**赋给“类名”类的“对象名”引用变量

“=”操作符使对象a引用指向刚new的那个Test对象。所以这里有两个实体:a是对象引用变量,右边的“new Test”,是以Test类为模板,在堆空间里创建一个Test类对象(也简称为Test对象)即对象本身

下面我来解释一下,new关键字的作用和初始化对象的方法:

  • new的意思是创建一个新的实例。 用new关键字加上构造方法,来创建一个对象,一个普通类在没有实例化之前,就是new之前,它的属性,方法等等在内存中都是不存在的。只有使用new了以后,这个类的一些东西在内存中才会真的存在,也就是说只有new了之后,这个类中的属性和方法才被赋予给创建的对象。new关键字的执行过程为开辟空间、生成对象——复制对象地址——调用构造函数——把创建好的对象引用赋给变量
  • Java初始化对象可以有很多种,比如new一个对象、或者通过clone来克隆一个对象。类都提供了一个默认的构造方法,里面为空,用户是可以自己编写构造方法,用来初始化变量。 一般建议在构造函数或提供setters方法对变量赋值。直接给成员变量赋值,Java是不推荐的,因为这样会破坏它的封装性。构造函数的初始化,一般是为了给实例变量进行初始化,我们可以通过有参构造方法来传入参数给变量赋值。若是无参构造方法,对变量初始化为null或者0,这样在编译的时候才不会报错。

3.面向对象的三大特性

封装

所谓封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。 举个例子,封装就好比是一台电视,厂家把电视的电路板、电线、信号接收器等封装在外壳里,只有相关技术人员才能打开电视机外壳,对其中的东西进行访问,而我们只需要通过开关、遥控器就可以实现电视机的功能。

这也就是程序设计所要求的高内聚、低耦合。高内聚就是类的内部数据操作细节自己完成,不允许外部干涉;低耦合是仅暴露少量的方法给外部使用,尽量方便外部调用。 通过这种方式,对象对内部数据提供了不同级别的保护,以防止程序中无关的部分意外的改变或错误的使用了对象的私有部分。

封装的实现—使用访问控制符

Java是使用“访问控制符”来控制哪些细节需要封装,哪些细节需要暴露的。 Java中4种“访问控制符”分别为public、protected、default、private,它们说明了面向对象的封装性,所以我们要利用它们尽可能的让访问权限降到最低,从而提高安全性。

​ 下面详细讲述它们的访问权限问题。

修饰符 同一个类中 同一个包中 子类 所有类
public
protected ×
default × ×
private × × ×

1.public表示可以被该项目的所有包中的所有类访问

2.protected表示可以被同一个包的类以及其他包中的子类访问

3.default表示没有修饰符修饰,只有同一个包的类能访问

4.private 表示私有,只有自己类能访问

封装的使用细节

类的属性的处理:

1.一般使用private访问权限。

2.提供相应的get/set方法来访问相关属性,这些方法通常是public修饰的,以提供对属性的赋值与读取操作(注意:boolean变量的get方法是is开头!)。

3.一些只用于本类的辅助性方法可以用private修饰,希望其他类调用的方法用public修饰。

继承

所谓继承是指可以让某个类型的对象获得另一个类型的对象的属性的方法。它支持按级分类的概念。继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。 通过继承创建的新类称为“子类”或“派生类”,被继承的类称为“基类”、“父类”或“超类”。继承的过程,就是从一般到特殊的过程。要实现继承,可以通过“继承”(Inheritance)和“组合”(Composition)来实现。继承概念的实现方式有二类:实现继承与接口继承。实现继承是指直接使用基类的属性和方法而无需额外编码的能力;接口继承是指仅使用属性和方法的名称、但是子类必须提供实现的能力;

1.父类也称作超类、基类等。

2.Java中只有单继承,没有像C++那样的多继承。多继承会引起混乱,使得继承链过于复杂,系统难于维护。

3.Java中类没有多继承,接口有多继承。

4.子类继承父类,可以得到父类的全部属性和方法 (除了父类的构造方法),但不见得可以直接访问(比如,父类私有的属性和方法)。

5.如果定义一个类时,没有调用extends,则它的父类是:java.lang.Object。

多态

多态指的是一个类实例的相同方法在不同情形有不同表现形式。所以我理解的的多态,是多种实现状态。现实生活中,同一个方法,具体实现会完全不同。 比如:同样是吃饭,中国人用筷子吃饭,而西方很多国家用刀叉吃饭,印度人用手吃饭。

​ 多态的要点:

​ 1. 多态是方法的多态,不是属性(变量)的多态(多态与属性无关)。

​ 2. 多态的存在要有3个必要条件:继承,方法重写,父类引用指向子类对象

​ 3. 父类引用指向子类对象后,用该父类引用调用子类重写的方法,此时多态就出现了。

**总结:**所谓封装,就是通过定义类并且给类的属性和方法加上访问控制来抽象事物的本质特性。所谓继承,就是代码重用,而多态,就是一个行为(方法)在不同对象上的多种表现形式。

4.抽象类与接口

抽象方法:即不是具体的方法。也就是没有包含实现内容的方法,我们只需定义有这种方法即可。

抽象类:在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。 也就是说,一个类无法描述其生成对象的某一行为(方法),那我们就在这个类中添加抽象方法,来让子类自己重写,或者说定义该方法的内容。就比方说,一个动物类,几乎每中动物都有其独特的移动方式,比方说狗是跑,兔子是跳,乌龟是爬。紧靠动物类我们无法描述所有对象的行为,所以我们可以用抽象方法,来让子类自己描述其移动方法。

接口:接口可以看成比抽象类更抽象的一种特殊的类,但它并不是类。接口只包含全局变量和公共的抽象方法。如果说类是一种模板,接口就是一种框架,它已经规定了数据的大小,无法更改,而且我们要用这个框架,必须按照它的样子往里面添加东西,也就是必须实现其已有的抽象方法。

抽象类与接口的区别

参数 抽象类 接口
默认的方法实现 它可以有默认的方法实现,就是说除了抽象类,还可以有其他方法,一个抽象类可以没有抽象方法,而一个抽象方法必须存在于一个抽象类中。 接口完全是抽象的。它根本不存在方法的实现
实现 子类使用extends关键字来继承抽象类。如果子类不是抽象类的话,它需要提供抽象类中所有声明的方法的实现。也就是重写父类所有的抽象方法 子类使用关键字implements来实现接口。它需要提供接口中所有声明的方法的实现
构造器 抽象类可以有构造方法 接口不能有构造方法
与正常Java类的区别 除了你不能实例化抽象类之外,它和普通Java类没有任何区别 接口是完全不同的类型
访问修饰符 抽象方法可以有publicprotecteddefault这些修饰符 接口方法默认修饰符是public。你不可以使用其它修饰符。
main方法 抽象方法可以有main方法并且我们可以运行它 接口没有main方法,因此我们不能运行它。
多继承 抽象方法可以继承一个类和实现多个接口 接口只可以继承一个或多个其它接口
速度 它比接口速度要快 接口是稍微有点慢的,因为它需要时间去寻找在类中实现的方法。
添加新方法 如果你往抽象类中添加新的方法,你可以给它提供默认的实现。因此你不需要改变你现在的代码。 如果你往接口中添加方法,那么你必须改变实现该接口的类。

Java面向对象系统理解相关推荐

  1. java 面向对象个人理解

    1.java面向对象我的理解是:一个系统可以看做一个对象,例如能耗监测系统,我需要监测能耗时,我只要用这个系统就可以了,他内部怎么实现的我不用去管. 2.举个例子:例如一个人是一个对象,可以用属性描述 ...

  2. java面向对象的理解_java胜于C语言,却又静态面向对象,简单?

    Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承.指针等概念,因此Java语言具有功能强大和简单易用两个特征. Java语言作为静态面向对象编程语言的代 ...

  3. Java面向对象的理解

    1. 面向对象 Java 是面向对象的编程语言,对象就是面向对象程序设计的核心.其基本思想是使用对象.类.继承.封装.多态等基本概念来进行程序设计.从现实世界中客观存在的事物(即对象)出发来构造软件系 ...

  4. java面向对象的理解_面向对象及其核心的概念:抽象、继承与多态、封装

    面向对象的思想是上个世界60年代出现的,一些比较典型的面向对象的编程语言包括JAVA.C++等.很多脚本语言也支持面向对象的语法比如PHP.Python. 什么是面向对象呢?它是一种现实对象的建模方法 ...

  5. 关于Java面向对象的理解

    前言 这是Java系列的第二篇文章,其实在年初的时候我就给我自己定下了目标,要重新走一遍所有Java有关的知识,所以应该会写很多,会把我的面试经历,日常踩坑都写进去,有兴趣的大佬可以看看. 面向对象 ...

  6. 对Java面向对象的理解

    面向对象是一种编程思想,把具有某些特征的属性和行为(方法)封装到类中,不关心其具体实现过程,只关心完成功能. 面向对象中两个重要的概念: 类:对一类事物的描述,是抽象的.概念上的定义 对象:是实际存在 ...

  7. 谈谈java面向对象之抽象,手把手带你搞定java面试之面向对象

    计算机语言晦涩难懂,打算利用通俗易懂的文字带领大家学习java基础.如果文中有什么错误的地方,欢迎大家在评论区指正,免得我误人子弟. Question:当面试JAVA开发岗位的时候,面试官最爱问的问题 ...

  8. Java面向对象 --- 吃货联盟订餐系统(完整版)

    文章目录 为什么使用面向对象 划分类 代码编写 为什么使用面向对象 Java面向对象版本的吃货联盟订餐系统: 因为基础版本都在一个类中实现的功能,太过于麻烦,不清楚 ,所以说我们利用面向对象制作吃货联 ...

  9. 对java面向对象的三大特征的理解_Java面向对象的三大特征是什么?

    面向对象的三大核心特性简介 面向对象开发模式更有利于人们开拓思维,在具体的开发过程中便于程序的划分,方便程序员分工合作,提高开发效率. 该开发模式之所以使程序设计更加完善和强大,主要是因为面向对象具有 ...

最新文章

  1. 第四范式入围Gartner新兴技术与趋势影响力雷达全球代表厂商
  2. P2P的原理和常见的实现方式
  3. linux ntfs 新建,Linux在NTFS中创建的文件的权限
  4. 阿里云商标注册服务及常见问题
  5. 数据结构(二)之二叉树
  6. c#.net常用函数列表
  7. (5)机器学习_K折交叉验证(iris数据集实例)
  8. python简单代码解决生活小问题①
  9. js中excel模板下载
  10. Mathematica 训练课(3)- 简单图形绘制
  11. html canvas画背景图片,HTML5 canvas画布
  12. C++数字三角形问题(动态规划)
  13. 【公式小记】自相关、卷积、能量信号、功率信号
  14. 剔除matlab中NaN
  15. pandas去除两列中同一行有相同元素的数据——数据分析必备技能(5)
  16. 某校2019专硕编程题-平方根
  17. SIM卡的封装有哪几种?
  18. 用苹果CMS搭建电影网站教程
  19. 使用ASP.NET做购物网站
  20. 腾讯云ubuntu远程桌面

热门文章

  1. 升职加薪轮不到我,原来因为.....
  2. 新勒索病毒 Petya 已席卷全球,多家跨国企业陷入瘫痪
  3. JavaScript常用转义字符
  4. 做好当下才能放眼未来--实习总结
  5. Easyx介绍与安装
  6. 语法精髓,10来节课补完初中,高中英语所有语法,彻底颠覆传统英语教育
  7. vue,uniapp带有导航栏的轮播图swiper组件,滑动的同时点击导航栏切换,使异步滑动过程中位置发生改变,不能正常展示的问题解决(这里用uiniapp的swiper组件)
  8. 本地网络书签,使用nodejs写的chrome插件
  9. android 7.1 小米,你的小米手机,能升Android 7.1吗?
  10. 前端必读 0基础学习 一文看懂 Vue3 对比 Vue2 发生哪些变化