还是一张图轻松搞定
基本特征 |
定义 |
具体实现方式 |
优势 |
封装 |
隐藏实现细节,将属性私有化,对外提供公共的访问接口 |
属性私有化、添加公有的setter、getter方法 |
增加了数据访问权限,增强代码的可维护性 |
继承 |
从一个已有的类派生出新的类,子类具有父类的一般特性,以及自身特殊的特性 |
继承需要符合的关系:is-a |
1、实现抽象(抽出像的部分) 2、增强代码的可复用性 |
多态 |
向同一父类的不同子类对象发送同一条消息,行为不同 |
通过Java接口/继承来定义统一的实现接口;通过方法重写为不同的实现类/子类定义不同的操作 |
增强代码的可扩展性、可维护性 |
继承:当多个类中出现相同的成员,可以将多个相同的成员提取到一个独立的类中,继承此类即可。继承需要符合的关系:is-a,父类更通用、子类更具体
语法:class Zi extends Fu{}
Zi:子类;派生类
Fu:父类,基类
好处: 1.提高了代码的重用性
2.降低代码的维护成本
3.使类与类之间更加强大,是多态的前提
弊端:1.类的耦合性提高了
2.开发原则:高内聚低耦合
特点:1.单继承:一个子类只能继承一个父类,一个父类可以被多个子类继承
2.多层继承:子继父,父继祖
继承中的关系:
A.成员变量关系:如果子类与父类出现同名变量,使用子类的,如果想用父类的同名变量,super.变量名;不重名该用谁用谁
B.成员方法关系:如果子类与父类出现同名方法,使用子类的,如果想用父类的同名方法,super.方法名;不重名该用谁用谁
C.构造方法:不存在继承关系!!!如果没有显式调用父类的构造方法,JVM将自动调用父类的无参构造方法。
原因是:子类继承父类的构造方法,所以当初始化子类对象时,要先完成父类的初始化。
一般有参调有参,并且
!!!注意:只要在类中有有参构造方法,通常在类中再提供一个无参构造方法
如果父类中没有无参构造方法:子类无参构造函数和有参构造函数-->都手动调用父类的有参构造方法
例如:
Zi(){
//两种调用方法,super() 和 this() 都必须是第一条语句,只能用一个
super(100);//子类直接调用父类的有参构造函数
this(100);//子类无参构造先调用本类的有参构造,本类的有参构造也会手动调用父类的有参构造
}
Zi(int a){
super(a);//子类有参构造手动调用父类的有参构造,
this.a=a;
}
super关键字: super();注意!!!不写.
super关键字 父类引用
super.成员变量名;
super.成员方法名();
super();//调用父类的构造方法 必须是构造其中的第一条语句
this();//调用本类的构造方法 必须是构造其中的第一条语句
this关键字:
局部变量与成员变量重名,局部变量会把成员变量隐藏,使用this关键字访问成员变量。this指代调用对象,super指代父类对象。
私有化成员:private关键字修饰的成员变量和成员变量没有继承,子类不能直接调用,被private修饰的成员只能在本类中被访问; (即封装)
调用方法:1.子类继承父类中提供setter和getter方法;
2. 调用父类的有参构造方法可以对父类的私有化成员进行赋值。
多态:具有表现多种形态的能力的特征,向同一父类的不同子类对象发送同一条消息,行为不同。
多态创建对象:
1.有继承关系
2.有方法的重写
3.父类引用指向子类对象(父像子)(允许将子类类型的指针赋值给父类类型指针)
成员特点:
1.成员变量:编译看父类,运行看父类
2.成员方法:编译看父类,运行看子类
3.静态方法:编译看父类,运行看子类
4.构造方法:没有被继承,更谈不上重写
多态中的转型:
1. 基本数据类型的转型 向上转型就是把子类转换成父类(自动转换),向上转型时无法调用子类独有方法
2.引用数据类型转型 向下转型(因为想使用子类特有的功能)(强制类型转换)
默认:多态创建对象 父类引用指向(赋值)子类对象
强制转型:将父类引用转为子类对象 IronMan i=(IronMan)p;
多态好处:
1.提高了代码的维护性(继承是多态的前提)
2.提高了代码的扩展性
多态弊端:不能访问子类特点有方法
解决方法:多态中的强转,将父类引用转为子类对象