这一部分和上一篇连一个专题。
2 面向对象的三大特性:封装、继承、多态
程序设计要求“高内聚低耦合”。高内聚就是类的内部数据操作细节自己完成,不允许外部干涉;低耦合即仅暴露少量的方法给外部使用。
2.1 封装
- 封装就是隐藏对象的属性和实现细节,仅对外提供公共访问方式。
- 封装的好处:隐藏类的实现细节;让使用者只能通过程序员规定的方法来访问数据;可以方便的加入存取控制语句,限制不合理操作。
【就是属性私有,然后通过类内get、set函数访问属性。】
2.2 继承
- 继承的语法:
修饰符 Class 子类名 extends 父类名{ 类定义部分 }
- 继承的本质是对某一批类的抽象,从而实现对现实世界更好的建模。
- extands的意思是“扩展”。子类是父类的扩展。JAVA中类只有单继承,没有多继承。
- 继承是类和类之间的一种关系。除此之外,类和类之间的关系还有依赖、组合、聚合等。都是实现目的的一种方法。
- 快捷键:(鼠标放在类里)
ctrl+H
展开子父类关系。
- object类是一个共有的大类,所有对象都属于这个类,包含一些基础的方法。
- super方法重写。
2.2.1 super关键字
在方法的调用中,提过用this关键字指代当前对象自己,super关键字和this关键字类似,它指向了当前对象自己的父类型特征。
this关键字和super关键字的使用:
- 都能出现在实例方法和构造方法中。
- 语法结构一致,“this.”和“this()”;“super.”和“super()”。
- 都不能出现在静态方法中。
- 大部分情况下是可以省略的。
- 什么时候不能省略呢:
- this在区分局部变量和实例变量时不能省略。
this.name = name;
- super不能打印输出(只想的东西不是一个整体)。
this可以看做一个引用变量,保存了该对象的地址,是当前对象整体,而super代表的是父类型特征,是子类局部的一些东西,这些继承过来的东西已经在子类里面了,你可以输出整体thisSystem.out.println(this); //输出this.toString()的值
,但不能输出父类型特征superSystem.out.println(super); //编译报错,需要'.'
。
- 不能同时使用this()和super()调用构造方法,因为他们都只能出现在构造方法的第一行。
this()通过当前的构造方法去调用“本类”中的对应的构造方法,目的是:代码复用。
super()通过当前的构造方法去调用“父类”中的对应的构造方法,目的是:创建子类对象时,先初始化父类型特征。
2.2.2 方法重写
首先,方法重写≠方法重载。
方法重载:同样的函数名+不同的参数列表。达到在传递不同参数时调用不同的方法。
方法重写:一模一样的函数名和参数列表,是子类方法和父类方法的区别。
重写的特点:
- 必须需要有继承关系,子类重写父类的方法,方法名必须相同参数列表列表必须相同。即方法和父类必要一致,方法体不同。
- 修饰符范围可以扩大但不能缩小【public>Protected>Default>private】
不能限定为static,否则方法的调用只和左边的限定符有关。 - 抛出的异常:范围,可以被缩小,但不能扩大【ClassNotFoundException→Exception(大)重写】
- 为什么需要重写:父类的功能,子类不一定需要,或者不一定满足。
- 快捷键:
Alt +Insert→override
2.3 多态
- 多态即同一方法可以根据发送对象的不同而采用多种不同的行为方式。一个对象的实际类型是确定的,但可以指向对象的引用的类型有很多。
- 多态存在的条件:有继承关系;子类重写父类方法;父类引用指向子类对象。
Father f1 = new Son( );
注意:多态是方法的多态,属性没有多态性。 - instanceof关键字用来判断对象类型,存在父子关系编译通过返回true/false,否则报错。
System.out.println(对象名 instanceof 类名);
- 异常:父类和子类,有联系类型转换异常!【classcastException 】
- 不能被重写的方法:
(1)static方法,属于类,它不属于实例
(2)final常量
(3)private方法 - 把父类转换为子类,向下转型,强制转换。
把子类转换为父类,向上转型,可能丢失自己的本来的一些方法。