封装
高内聚:具体细节自己完成,不允许外界干扰。
低耦合:仅爆露少量的方法给外部使用
改露的露,该藏的藏。应当禁止让用户直接访问一个对象中的数据实际表示,而应通过操作接口访问。
关键字private将属性私有,防止外部访问。
提供一些public的get set方法访问这些数据(即在私有变量方法内写调取赋值方法)
神奇的快捷键:alt+insert快捷生成get和set方法
还可以在set方法设置安全保护,使得数据合乎逻辑
意义
- 提高代码安全性,保护数据。
- 隐藏代码实现细节。
- 统一用户接口,方便使用。
- 增加系统的可维护性(便于修改)
继承(类与类之间的关系)
本质:对一批类进行抽象,一个儿子只能有一个爸爸,可以有多个儿子,Java只有单继承,没有多继承。
核心关键字:extends
public class Student extends Person {
}
类似于树一样的关系,继承就是扩展的意思,子类是父类的扩展
如Person是父类,Teacher和Student派生类/子类。
子类可以继承父类的所有方法以及属性。(创建好对象之后,可以调用父类的方法)【继承的前提,是public公开得】
优先级最高优先级public 不写默认default protected优先级高于default 最低优先级 private 一般属性都是私有的,但是留一些public的方法 如get set。供子类使用。
Object
快捷键 ctrl +H 里面有一个Object祖宗类,所有的类都默认直接或者间接继承Object类,不用显式继承
Super
关键字,
在主程序中new一个子类变量,默认调用父类无参构造器(隐藏调用) ,再调用对应类的构造器。
如果想显示调用出来,必须放在把父类super();放在子类调用器的
第一行。
一个类如果书写了有参构造,必须先书写无参构造,如果不书写只能调用有参
注意点
- super调用父类方法,必须放在构造方法(构造器)第一个(属性可以不用)
- Super必须只能出现在子类的方法或者构造方法中
- Super和this不能同时调用构造方法。(因为都要其放在第一行)
对比this - this代表本身调用者这个对象,super代表父类对象的应用。
- this没有继承也可以使用,super必须继承才能调用
- this();本类构造,Super();父类构造【调用构造器的方法】
方法重写
父类名 a = new 子类名()
子类名 b = new 子类名()
对于a子类重写了的父类的方法,则调用子类的,没有重写的才调用父类的
b可以调用父类的函数也可以调用子类的函数
但是对构造函数的执行上二者是没有区别的。
重写是指方法的重写,与属性无关
例如A继承了B
A a=new A()
B b=new A() 父类的引用指向了子类是可以的,方法的调用只和左边有关,(前提是静态方法)
静态方法和非静态方法不一样,重写只和非静态方法有关。(因为静态一开始就加载完了)
而且关键词只能是void
总结:
- 前提,需要用继承关系,子类重写父类的方法。
- 方法名和参数列表必须相同
- 修饰符 public 范围可以扩大,不能缩小 public>protected>default(?)>private
- 抛出的异常 范围可以被缩小,不可以被扩大
- 方法名一致,方法体不同。
为什么需要重写
父类的功能子类不一定需要,或者不一定满足
alt+insert快捷键 override重写
多态(面向对象一个很重要特性)
一个对象的实例类型是确定的,但是它所指向的引用类型不确定。
可以通过父类对象指向new的子类
Student s1=new Student();
Person s2=new Student();
Object s3=new Student();并且可以使用父类的方法
如果子类重写了父类的方法,执行子类的方法
注意事项
- 多态是方法的多态,属性没有多态。
- 父类和子类之间才有多态,不能强制转换无关类型类型转换异常:ClassCastException
- 存在条件 继承关系 按照左边类型执行方法 如果方法在子类重写,执行子类
- 父类引用指向子类。
- static final private修饰的方法无法重写,便没有多态