java基础

java面向对象二——封装继承多态

2019-06-24  本文已影响0人  LeoFranz

继承

基本概念

在一个类中定义一些基本属性和功能,其他派生的类都直接具备该类的特性,这一族类就形成了一个功能组,由基本功能类和其拓展类组成。使用上提高了代码的复用性和维护性,思想上java拓展性和维护性的体现,弊端就是增强了类之间的耦合。

继承实现过程

开发注意点:
1.不要因为有共同特性就创建父类,这会带来封装性的破坏并限制了子类行为的灵活性。理想的搭配是子类is a 父类的关系。
2.动态绑定原则——成员变量,根据调用者类型决定从哪个类开始寻找。子父类中出现同名的成员变量情况,系统使用成员变量的优先级:如果调用者是子类对象,依照就近原则,从子类开始寻找,在子类方法中局部变量>子类成员变量>父类成员变量。
如果调用者是父类对象,同样依照就近原则,不过从父类开始寻找。
3.子类对象创建时一定要先创建父类内容---顺序为父类静态内容,子类静态内容,父类成员变量和构造函数,子类成员变量和构造函数。如果父类中没有给无参构造器,会导致子类无法通过编译,再次印证了编程时尽量提供无参构造器的规范。如果开发要求父类不能有无参构造器,那么需要在子类构造器中添加带参的父类构造器。,或者通过在当前构造器中添加this(...)访问其他构造器,然后间接访问父类构造方法。总之,一定要先执行父类的构造器。
4.this()或super()必须放在构造器的第一行,防止父类多次初始化。
5.对象初始化顺序,成员变量默认初始化,显示初始化,构造函数初始化,从实践看成员变量和构造代码块是同一优先级。
所以java在初始化对象的时候是从类到对象,从父类到子类的分层初始化。构造方法中super关键字(默认包含)表示先对父类进行初始化。
7.在继承结构中,子类如果想访问父类的私有成员??这需要反向思考,父类私有成员通过哪些方式对外开放了?答案便是共有方法和共有构造函数,还有反射

final可以用在方法中修饰局部变量,修饰基本数据类型时,其值不能被改变;修饰引用数据类型时,其引用地址值不能改变,不是对象成员不能改变

多态

BaseClass bc = new SubClass();
相同的类型变量,调用同一个方法时出现多种不同的行为特征。
1.方法有重写时,调用重写方法;
2.仅子类有的方法,在多态代码中不能通过编译;
3.实例变量不具备多态性。

方法签名包括方法名和参数列表,不包括访问修饰符、返回类型和返回值
static、private、final修饰的方法和constructor都不能被重写,编译器知道具体应该调用父类还是子类的值,属于静态绑定的范畴。

子类构造过程图解
堆中对象区分为this区和super区,分别保存了本身和超类的特征。方法区中同时保存了this类和super类的方法


无抽象方法的抽象类有什么意义:不被实例化
抽象方法修饰符不能为private,final,static,原因:
private:不能被重写,与抽象概念冲突;
final:不能被重写,与抽象概念冲突;
static: 无意义,为何要用类名调用一个抽象方法?

接口

对类的一组需求的描述,其实现必须依靠具体的类。

总的来说,接口与抽象类有本质差别:
成员:
抽象类有成员变量和常量,接口只能设置常量;
抽象类有成员方法也可以有抽象方法和静态方法,接口只能有抽象方法;
抽象类有构造方法,接口无;
关系:
抽象类可以单继承,接口可以多继承;
抽象类依然按照不能实例化的类来使用,接口是独立于类体系之外的作为继承体系的拓展功能

上一篇 下一篇

猜你喜欢

热点阅读