Java 中面向对象的理解
在理解面向对象之前,首先来理解对象的含义:
现实生活中,所有存在的事物都可以称为对象,像宇宙,星球,土地,大河,高山,绿树,秋风,落叶,石头,人都可以视为对象,我们所生存的环境,正是由无数对象拼凑而成。
什么是面向对象:
面向对象是代码世界对现实世界中各个对象的模拟,由此在代码中产生了“万物皆对象”的思想,现实中的对象,我们使用代码将它抽象的表达出来。
面向对象编程:
使用代码,构造出各个对象,指挥这些对象完成需求。我们不再关注实现某需求的具体逻辑,只获取对象返回的结果即可。这将我们从执行者这一角色转换成了指挥者,将复杂的事情简单化。
面向对象的三大特性
在了解对象的三大特征之前,我们需要理解 Java 中的类和对象这两个概念。
类:具有相同属性和行为的事物的集合,是创建对象的模板。
对象:某类的一个具体实现。
1、封装
将有关的属性和行为组成一个类,就叫封装。一般将属性私有化,行为公开化,提高数据的隐秘性,让代码模块化。
封装的好处:将变化隔离、便于使用、提高代码的复用性、提高代码的安全性。
封装的原则:将不需要对外提供的内容都隐藏起来。
把属性隐藏起来,提供对其访问的公共方法。
Java 中通过对类的成员变量设置访问权限,来实现信息隐藏。
private:使用 private 修饰的成员变量,只能被这个类访问。如果一个类的构造方法声明为 private,那其他类不能生成该类的一个实例。
default:不加任何的访问权限修饰,这个成员变量属于缺省的访问状态,可以被这个类和同一包中的类访问。
protect:使用 protect 修饰的成员变量,可以被这个类本身、它的子类(包括同一个包中和不同包中的子类)、同一个包中的类访问。
public:使用 public 修饰的成员变量,可以被所有类访问。
同一类中 | 同一包中 | 子类 | 所有类 | |
---|---|---|---|---|
private | √ | |||
default | √ | √ | ||
protected | √ | √ | √ | |
public | √ | √ | √ | √ |
2、继承
在已有类的基础上,构建新类。已有的类称为父类,新类称为子类,两者之间的关系称为继承,用 extends 关键字表示,格式为:子类 extends 父类 {……};
子类能调用父类中非 private 修饰的成员变量和方法,同时还可以添加新的成员变量和方法,扩充父类,甚至可以重写父类的方法,使其更表现子类特征。
继承的规则:Java 中父类可以拥有多个子类,但每个子类只能继承一个父类,称为“单继承”。
继承的好处:实现了代码的复用。
可以重写父类中的方法,即命名与父类同名的方法。
子类能吸收父类的属性和行为,并能扩展新的能力。
Java 中通过 super 来实现对父类成员的访问,super 来引用当前对象的父类,有三种使用情况:
-
访问父类中被隐藏的成员变量:super.variable
-
调用父类中被重写的方法:super.method([paramlist],super());
-
调用父类的构造方法:super([paramlist]);
super 和 this 的用法:
this 代表本类引用;super 代表父类引用。当子父类出现同名变量时,可以使用 super 区分,子类调用父类的构造方法时,可以用 super,在子类方法重写中,若想调用重写前的方法,可以使用 super.方法名() 获取。
注意:
1、子类不继承父类的构造方法,它只是调用(隐式或显式)。如果父类构造方法没有参数,则在子类的构造方法中不需要使用 super 关键字调用父类构造方法,系统会自动调用父类的无参构造,如果父类的构造方法带有参数,则子类必须在构造方法中显式地通过 super 关键字调用父类的构造方法并配以适当的参数列表。
2、方法重写时,子类方法的权限要大于等于父类方法的权限,静态的方法重写后也必须是静态的,父类中私有的方法不能被重写。
3、被 final 修饰的类是一个最终类,不能被重写;被 final 修饰的方法是一个最终方法,不能被重写;被 final 修饰的变量是一个常量,不能被再次赋值。
4、内部类只能访问被 final 修饰的局部变量。
3、多态
多态是对象多种表现形式的体现。它的作用就是解耦,解除父子类的耦合度。简单来说,多态就是父类引用(或接口)指向子类(或实现类)对象。
例如:子类 Cat 继承了 Animal 类,那么 Animal 就是 Cat 的父类。
Animal a = new Cat(); //定义了一个 Animal 类型的引用,指向了新建的 Cat 类型的对象。
由于 Cat 是继承自 Animal 的,所以 Animal 类型的引用可以指向 Cat 类型的对象,这样做的意义是:
子类是对父类的扩充,一般子类在功能上更强大,父类引用指向子类对象既可以使用子类的强大功能,又可以抽取父类的共性。
但是对于子类中新定义的成员和方法,父类是无法使用的。同时,父类中的一个方法只有在没被子类重写的情况下,才可以被父类引用调用,对于被子类重写过的方法,父类引用调用时,会调用子类重写的方法,这就是动态连接。
实现多态的方式有:重写、接口回调
重写
重写,也叫覆盖,是指子类重新定义父类方法,以求达到不同的作用。
注意:
1、重写方法的访问权限必须和原方法的访问权限完全匹配,才能达到重写效果。
2、重写方法的返回值必须和原方法的返回值一致。
3、重写方法必须抛出和原方法相同的异常。
4、被重写的方法不能是私有方法。
接口回调
接口回调描述的是一种现象:接口声明的变量指向它实现类的实例化对象,那么该接口声明的变量就可以调用接口中的抽象方法。
编译时方法行为表现为接口中的抽象方法,运行时方法行为表现为实现类中重写的方法的这种特征,即为多态。
小小爱意,不成敬意.
各位看官,后面几章会以代码详细讲述三大特性,我们下篇见 (∩_∩)~~
-Czx.