Java面向对象系统理解

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方法,因此我们不能运行它。
多继承 抽象方法可以继承一个类和实现多个接口 接口只可以继承一个或多个其它接口
速度 它比接口速度要快 接口是稍微有点慢的,因为它需要时间去寻找在类中实现的方法。
添加新方法 如果你往抽象类中添加新的方法,你可以给它提供默认的实现。因此你不需要改变你现在的代码。 如果你往接口中添加方法,那么你必须改变实现该接口的类。

猜你喜欢

转载自blog.csdn.net/weixin_44139445/article/details/88538047