java面向对象基本概念
天使总在想象中,魔鬼总在细节处
java是面向对象的编程语言,对象就是面向对象程序设计的核心,所谓对象就是现实世界中的实体。对象与实体是一一对应的,也就是说现实世界中每一个实体都是一个对象,它是一种具体的概念
对象有以下的特点:
- 对象具有属性和行为
- 对象具有变化的状态
- 对象具有唯一性
- 对象都是某个类别的实例
- 一切皆为对象,现实世界中的所有事务都可以视为对象(万物皆对象)
面向对象的五大基本原则
原则 | 详情 |
---|---|
单一职责原则 | 一个类的功能要单一,不能包罗万象 |
开放封闭原则 | 一个模块在扩展性方面应是开放的,在更改性方面应是封闭的 |
替换原则 | 子类应当可以替换父类,并可以出现父类能够出现的任何位置 |
依赖原则 | 具体依赖抽象,上层依赖下层 |
接口分离原则 | 模块需要通过抽象接口隔开,而不能通过具体的类强行耦合在一起 |
面向对象的三大特征
1.封装
所谓封装,就是将客观事物封装成抽象的类,并且类可以把数据和方法让可信的类或者对象进行操作,对不可信的类或者对象进行隐藏。
类就是封装数据和操作这些数据的逻辑实体。
简单通俗来说
信息隐藏,利用抽象数据类型将数据和基于这些数据的操作封装到一起,使其成为一个不可分割的独立实体,数据被保护子啊抽象数据类型的内部,尽可能地隐藏内部地细节,只保留一些对外接口使之与外部发生联系,系统地其他对象只能通过包裹在数据外面地已经授权地操作来与这个封装地对象及新娘交流和交互。也就是说用户无需知道对象内部地细节,但可以通过该对象对外提供地接口来访问该对象。
要点
一个类若没有提供给外界访问地方法,那么这个类也就没有什么意义了。
(如同一个没有商家货物和顾客交互地窗口地自动收货机,不能提供原本设想地服务,那这台自动收货机便没有存在地意义)
2.继承
继承是一种使用已存在的类的定义为基础建立新类的 技术,新类的定义可以增加新的数据或者新的功能,也可以使用父类的功能,但不能选择性地继承父类。
通过继承创建的新类称为子类或者派生类,被继承的称为基类
继承有两种方式,一种为实现继承,一种为接口继承
继承的特点:
- 子类拥有父类的非private的属性和方法
- 子类可以拥有自己属性和方法,即子类可以对父类进行扩展
- 子类可以用自己的方式实现父类的方法
- 子类无法继承父类的构造器
构造器
构造器只能被调用而不能被继承
构造过程是从父类 “向外” 扩散的,子类在初始化的过程中,子类在自身构造器中调用父类的构造器来实现初始化,一般情况下,编译器会默认给子类调用父类的默认构造器,若父类没有默认的构造器,子类就需要显式地使用super()来调用父类地构造器,否则编译器会报错,无法找到符合父类形式地构造器
构造器总结:
- 构造方法名称与类名相同,没有返回值声明(包括 void)
- 构造方法用于初始化数据(属性)。
- 每一个类中都会有一个默认的无参的构造方法。
- 如果类中有显示的构造方法,那么默认构造方法将无效。
- 如果有显示的构造方法,还想保留默认构造方法,需要显示的写出来。
- 构造方法可以有多个,但参数不一样,称为构造方法的重载。
- 在构造方法中调用另一个构造方法,使用this(…),该句代码必须在第一句。
- 构造方法之间的调用,必须要有出口。
- 给对象初始化数据可以使用构造方法或Setter方法,通常情况下,两者都会保留。
- 一个好的编程习惯是要保留默认的构造方法。
3.多态
一个变量到底指向哪个类的实例对象,该引用对象发出的方法调用到底是哪个类中实现的方法,必须在程序运行期间才能决定。
对于面向对象而言,多态分为编译时多态和运行时多态。其中编译时多态是静态的,主要是指方法的重载,它是根据参数列表的不同来区分不同的函数,通过编译后会变成不同的函数,在运行时,该种方法谈不上多态。
而运行时多态是动态的,它是通过动态来绑定实现的,也就是我们所说的多态性。
java实现多态的三个必要条件:
- 继承
- 重写
- 向上转型
多态在实例中运用:向上造型和向下转型
向上转型 | 父类的引用指向子类对象,可以使用没有被子类重写的所有方法,被该子类重写的方法,只能调用子类重写后的方法,父类原先的方法无法调用。属性只能调用父类的属性,无法使用子类的属性。 |
---|---|
向下转型 | 子类引用指向父类对象,该父类对象只能是该子类的向上造型。否则编译时,不会报错,运行时,会报类型转换异常 。可以调用该子类所有的方法和父类未被该子类对象重写的所有方法,属性只能调用该子类对象的属性,无法使用父类的属性 |
属性的调用看引用的类型,父类的引用,只能调用该父类的属性;子类的引用只能调用该子类的属性
方法的调用规则:向上造型:父类的引用,能调用该父类被重写的方法(子类的方法)和父类未被重写的方法,但是不能调用子类所特有的方法。向下造型:子类的引用,使得其能够访问子类的特有方法。
在继承链中对象方法的调用存在一个优先级:
this.show(O);
super.show(O);
this.show((super)O);
super.show((super)O)。