第一次遇到这个问题还是在我求职期间,从网上下载了某《java常见面试题集》。其中就有个问题是java面向对象的三大特征是什么。这个问题的答案是:Java面向对象的三大特征是封装、继承和多态。
但是我遇到这个问题的时候是真的一脸懵逼,我的教科本和我读的相关资料(《Thinking in java》)中并没有这个问题的相关描述。我最后找到了相关答案,还好的是,这个问题的答案并没有争议,看来这就是正确答案了。本章就借助于此问题,和大家一起了解一下封装、继承、多态。

  1. 封装
    封装性虽然是面向对象核心特征,但是却没有什么难理解的。类的封装包含两层含义,将数据和对数据的操作组合起来构成类,类是一个不可分割的独立单位;类中既要提供与外部联系的接口,同时又要尽可能隐藏类的实现细节。封装性为软件提供了一种模块化的设计机制,设计者提供标准化的类模型,使用者根据实际需求悬着所需的类模块,通过组装类模型实现大型软件系统。
    也就是说,java能够被广泛运用于大型软件的开发,类的封装性功不可没。
    为了实现封装,类的成员都要有合适的访问权限,有些成员可以被外部调用,而某些变量和方法对于外部是隐藏的。下面来介绍集中访问权限修饰词:
    1、public 公共的,正如其名,它是权限最大的修饰词,可以被内外所有类中访问。
    2、protected 受保护的,被这个修饰词修饰的成员变量和方法,能被本类和本类的子类所访问,也可以被与本类位于同一包中的类所访问,但不能被其他包中的非子类所访问。权限仅次于public。
    3、缺省(package) 缺省是指不适用访问权限修饰词,此时被修饰成员只能被同包类所访问,就算是子类,如果不同包也不行。
    4、private 私有的,正如其名,最小的访问权限,被修饰成员只能被本类访问。
    需要注意的是这些访问修饰符,不能用于修饰方法中声明的变量,因为方法中生命的变量或形式参数的作用域只是这个方法,对外不可见,这些修饰词将毫无意义。
  2. 继承
    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、一大
    子类的访问权限大于或等于父类的
    方法的重载
    重载发生在同一类中,方法名相同但参数列表不同。也就是方法签名不同。调用重载主要看方法的传参。
  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;
	}