什么叫继承?
子类(this)继承父类(super)的因素(成员变量和方法) 子类继承父类的特征 一个子类只能继承一个父类 一个父类可以被多个子类所继承,子类具有可拓展性,继承提高了代码的可重复利用性
可以看到:我们可以将相同重复的代码放在父类,然后在将自己独有的方法属性放在子类里面。
例如:老师、学生 都属于人类
小结:
继承:
当子类继承有一个父类,且创建一个子类对象后 这个对象分为(父类空间、子列空间)都指向一个对象。 super+this getter()、setter()......
继承的特点:
注意事项:
子类是否可以继承父类的构造器?
不可以,子类有自己的构造器,父类构造器适用于初始化父类对象 不能交换构造权利!
子类是否可以继承父类的私有成员?
可以,但是不能访问!!!
争议点:
子类是否可以继承父类的静态成员?不能 静态的数据 不管是变量还是方法都是可以使用类名.(变量/方法)访问的 支持共享
显然:共享!=继承(需要满足父子关系)
子类可使用父类静态东西 但是:绝非继承!!!
注意事项:
在子类方法中访问成员(成员变量、成员方法) 满足:就近原则
- 先在子类局部范围查找
- 然后到子类成员范围查找
- 然后到父类成员范围找,如果父类范围还没找到就直接报错
如果子父类,出现了重名的成员,会优先使用子类自身的,此时如果一定要在子类中使用父类怎么办?
使用super关键字 指定访问父类的成员
格式:super.父类方法名/父类成员变量 需要在子类里面写,才能访问父类数据
<方法重写> 在父类的基础上继续增加功能
在子类方法中访问成员(变量和方法)满足:
如果子父类中出现了重名的成员,此时如果一定要在子类中使用父类怎么办呢?
什么是方法重写?
方法重写场景:
案例:
旧手机功能:打电话、发信息
新手机:在旧手机的基础上 可以使用视频通话 可以发图片和音频
@Override 重写方法校验 + 子类需要重写的方法必须和父类对应的方法一模一样!!!
特点:子类的全部构造器默认先会访问父类的无参构造器 (先有父亲后有儿子)
注意事项:
子类继承后构造器的特点:
- 子类中所有的构造器默认先访问父类的无参构造器
为什么?
- 子类在初始化的时候,有可能用到父类的数据 所以要提前让父类初始化
- 子类初始化之前,一定要调用父类构造器先完成父类数据的初始化
怎么调用父类构造器?
- 子类构造器第一行默认有super() 不写也存在
利用父类的有参构造器初始化对象的数据:
注意事项:
super调用父类有参构造器的作用:
- 初始化继承自父类的数据
如果父类中没有无参构造器,只有有参构造器,会出现什么现象呢?
- 因为创建对象时,如果有继承的父类 他会先访问父类的无参构造器初始化再轮到自己。
- 如果父类没有无参构造器,则会报错!!! 所以必须要对父类定义构造器和各个方法。
解决方法?
- 子类构造器(必须是有参构造器!!!)里写: super(初始化数据) 手动调用。
this和super详情:
关键字 | 访问成员变量 | 访问成员方法 | 访问构造方法 |
this | this.成员变量 访问本类成员变量 | this.方法 访问本类成员方法 | this(...) 访问本类构造器 |
super | super.成员变量 | super方法 访问父类成员方法 | super(...) 访问父类构造器 |
至此我们就差this(...) 没有应用过了,接下来看看他的内容:
this()主要设置默认值 在构造器里面写 this(...)相当于兄弟构造器
this(...)和super(...)使用注意点:
包:
例如:package com.cqie.javabean;
下面的语句-表述类
导包
权限设置修饰符:
权限修饰符分类和具体作用范围:
privarte: 在同一个类可以访问
缺省:同一个类或者同一个包下可以访问
protected:同一个类或者同一个包下或者不同包下的子类里面需要继承)可以访问
public: 以上三种外加不同包下的无关类
定义成员(方法,成员变量,构造器等)满足如下条件:
final的作用:
回忆之前的工具类:里面私有构造器 定义静态方法(验证码的例子)可以在方法类型前加final不能对该方法重写(变量分为:局部变量和成员变量(静态变量,实例变量))
注意:
final修饰变量有且只能赋值一次,对于引用类型来说使用final 不能约束成员变量的赋值情况
final修饰变量的注意事项:
常量:
常量命名规则:
英文单词大写,多个单词使用_下划线连接
常量的执行原理:
拓展:信号标志
假设我们要做一个游戏,用户按上下左右,调用对应的函数实现,我们可以使用常量做信息标志
先定义常量然后关联程序流程实现效果,可以构造一个公开的静态方法,然后结合switch值匹配。
枚举的概述:
定义枚举类的格式:
修饰符 enum 枚举名称{
实例名称
}
枚举的特征:
枚举做信息标志和分类:
代码可读性好,入参约束谨慎,代码优雅,是最好的信息分类技术 关联:Orientation o
抽象类:
修饰符 abstract 方法类型 类名{
修饰符 abstract 返回值类型 方法名 (形参列表);
}
注意事项:
抽象类的使用场景:
小结:
1、抽象类,抽象方法是怎样的?
2、抽象类基本作用?
3、继承抽象类有哪些要注意的?
案例分析:
某健身房,一种是预存1000金卡(8折优惠),另一种是预存100的银卡(9折优惠)
请分别实现两种卡片进入收银系统后的逻辑,卡片包括主人明名称、余额、支付功能
补充:
类具有的东西,抽象类都有。
抽象类可以没有抽象方法,但是,抽象方法必须在抽象类里。
一个类(实现类)继承了抽象类,必须重写抽象类的全部方法,否则这个类定义为抽象类。
不能使用abstract修饰变量、代码块、构造器。
最重要的特征:得到了抽象方法,失去了创建对象的能力(实现类继承抽象类方法重写)
final和abstract是什么关系?
什么的时候使用模板方法模式:
场景:当系统中出现同一功能,而该功能大多一样,一种部分可能不同时。
模板方法的步骤:
案例:写作文
需求:两类学生一类大学本科生,另一类研究生,现在需要两类学生完成一篇编程知识的文章。开始和结尾部分内容必须一样,中间内容任意发挥。选择最优的面向对象方案设计。
方法模板:
实现代码的复用性,写好抽象类,再子类里写好不同的方法,写一个函数在里面调用这个抽象类,关联,最终达到我们想要的。模板方法最好添加final修饰,使得模版(相同的代码部分)不能改变,可读性更好。并且防止子类重写模板方法,更加专业、安全。
模板方法解决什么问题:
接口的定义与特点:
JDK8只能写常量和方法
接口使用interface接口名
public interface 接口名{
//常量
//方法
}
接口就是一种规范,定义方法,然后实现类重写方法内容,简化代码,满足接口设计。
接口定义后被实现类实现,再利用实现类创建实现类对象。
接口的用法:
修饰符 class 实现类 implements 接口1,接口2...{
接口内方法重写(所有接口包含的方法都要实现)
}
接口实现的注意事项:
小结:
接口多继承的作用:
JDK8开始后新增了哪些方法?
JDK新增的三种方法开发中很少使用,通常涉及Java源码,这为以后我们学习Java源码打下了基础。我列出了这些语法,了解即可,真实开发中没有这么杂。
接口注意事项:
重点:类只能单继承,可以创建对象,可以实现多接口;接口可以多继承接口,不能创建对象。
多态:
多态常见的形式:
父类类型 对象名=new 子类构造器;
接口 接口名=new 实现类构造器;
多态中成员访问特点:
多态的前提:
优势:
多态下会产生一个问题:
自动类型转换:从子到父 复合多态策略 子类对象赋值给父类类型的变量指向。
强制类型转换:从父到子 实现类对象可以触发独有方法
Java建议强转前使用关键字instanceof判断当前对象的真实类型,再进行强制转换,再调用方法独有方法。
格式:变量名 instanceof 真实类型 返回boolean类型
1、引用数据类型的类型转换,有几种方式?
2、强制类型能解决什么问题?需要注意的事项?
案例:
设计一个电脑对象、可以安装两个USB设备。鼠标和键盘(安装时有接入、点击、拔出功能)。
使用多态的设计,创建电脑对象、创建两个USB实现对象,分别安装到电脑中触发功能的执行。
内部类的使用场景:
内部类的分类:
静态内部类:
静态内部类创建对象的格式:
格式:外部类名.内部类名 对象名=new 外部类名.内部类名() 相当于单独创建内部对象
例子:Outer.Inner in=new Outer().Inner();
静态内部类的使用场景、特点、访问总结:
成员内部类:
成员内部类创建对象的格式:
格式:外部类名.内部类名 对象名=new 外部构造器.new 内部构造器;
范例:Outer.Inner in=new Outer().new Inner();
成员内部类的拓展:
1、成员内部类是否可以直接访问外部类的静态成员变量?
可以,外部类的静态成员只有一份被共享
2、成员内部类的实例方法是否可以直接调用外部类的实例成员?
可以的,因为必须先有外部类对象,才有成员内部对象,所以可以直接访问外部类对象的实例成员
注意:在成员内部类中访问所在外部类对象,格式:外部类 this
局部内部类:
局部内部类(鸡肋语法,了解即可)
匿名内部类:
格式:
new 类|抽象名|或者接口名(){
重写方法
};
特点总结:
案例:某个学校让老师和同学一起参加游泳比赛
多态的设计 对象回调!!!
总结:内部类可以作为方法的实际参数进行传输
匿名内部类的真实使用场景演示:
给按钮绑定一个点击事件
使用总结:开发中不是我们主动去定义匿名函数,而是别人需要我们写或者我们可以写的时候才用
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
本篇文章暂时告一段落,谢谢大家的阅读,希望对你有帮助,感谢大家!!!
评论区欢迎评论留言,如有问题,欢迎指正!!!