第一次遇到这个问题还是在我求职期间,从网上下载了某《java常见面试题集》。其中就有个问题是java面向对象的三大特征是什么。这个问题的答案是:Java面向对象的三大特征是封装、继承和多态。
但是我遇到这个问题的时候是真的一脸懵逼,我的教科本和我读的相关资料(《Thinking in java》)中并没有这个问题的相关描述。我最后找到了相关答案,还好的是,这个问题的答案并没有争议,看来这就是正确答案了。本章就借助于此问题,和大家一起了解一下封装、继承、多态。
- 封装
封装性虽然是面向对象核心特征,但是却没有什么难理解的。类的封装包含两层含义,将数据和对数据的操作组合起来构成类,类是一个不可分割的独立单位;类中既要提供与外部联系的接口,同时又要尽可能隐藏类的实现细节。封装性为软件提供了一种模块化的设计机制,设计者提供标准化的类模型,使用者根据实际需求悬着所需的类模块,通过组装类模型实现大型软件系统。
也就是说,java能够被广泛运用于大型软件的开发,类的封装性功不可没。
为了实现封装,类的成员都要有合适的访问权限,有些成员可以被外部调用,而某些变量和方法对于外部是隐藏的。下面来介绍集中访问权限修饰词:
1、public 公共的,正如其名,它是权限最大的修饰词,可以被内外所有类中访问。
2、protected 受保护的,被这个修饰词修饰的成员变量和方法,能被本类和本类的子类所访问,也可以被与本类位于同一包中的类所访问,但不能被其他包中的非子类所访问。权限仅次于public。
3、缺省(package) 缺省是指不适用访问权限修饰词,此时被修饰成员只能被同包类所访问,就算是子类,如果不同包也不行。
4、private 私有的,正如其名,最小的访问权限,被修饰成员只能被本类访问。
需要注意的是这些访问修饰符,不能用于修饰方法中声明的变量,因为方法中生命的变量或形式参数的作用域只是这个方法,对外不可见,这些修饰词将毫无意义。 - 继承
1)避免代码重复,有利于代码的复用
2)通过extends实现继承
3)父类:包括本类所特有的属性和行为
子类:包括父类的+子类的
4)子类继承父类后,子类等于子类加父类
5)一个父类可以有多个子类,一个子类只能有一个父类(单一继承)
6)继承具有传递性(继承子类的类,同时也继承了那个子类的父类)
7)Java规定,构造子类之前,必须先构造父类
若子类中没有通过super来调用父类的构造方法,则编译器默认调用无参构造器,若自己用super调了父类的某构造方法,则不再默认
8)父类的类型能够调用所有子类的对象类型
9)所有的类都是子类,默认继承类Object。
父子类需要注意的部分,方法的重写与重载的区别:
方法的重写:
1)发生在父子类中,方法签名相同,方法体不同
2)重写方法被调用时,看对象的类型
重写需要遵守“两同两小一大”规则
1、两同
(1)方法名称相同
(2)参数列表相同
2、两小 (父类是大于子类的)
(1)子类的返回值类型小于或等于父类的 父类void时,子类也只能是void
(2)子类抛出异常小于或等于父类的
3、一大
子类的访问权限大于或等于父类的
方法的重载
重载发生在同一类中,方法名相同但参数列表不同。也就是方法签名不同。调用重载主要看方法的传参。 - 多态
1)多态的意义
1.1)同一类型的引用,指向不同的对象,会实现不同的功能
--------行为的多态
1.2)同一个对象被造型为不同的类型时,有不同的功能
--------对象的多态
2)向上造型
2.1)父类的引用指向子类的对象
2.2)能造型成的类型,要么是父类型、要么是实现的接口的类型
2.3)能点出来什么,看引用类型
向上造型之后,能点出来的东西变少了
3)强制类型转换,成功的条件(父类大,子类小)
3.1)引用所指向的对象,就是该类型
3.2)引用所指向的对象,实现了该接口
interface inter1{ }
class Aoo{}
class Boo extends Aoo implements inter1{}
Aoo o1 = new Boo();
Boo o21 = (Boo)o1; //符合条件1
inter1 o11 = (inter1)o1;//符合条件2
4)若不符合强转的条件,则会发生类型转换异常
建议:强转之前,先通过instanceof判断是否可以转换
if (o1 instanceof Boo) {
Boo n = (Boo)o1;
}