继承
说明:多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那个类即可。
A:继承的特点
子类只允许有一个父类(基类/超类)
父类可以多个子类
子类是对父类的扩展;子类继承了父类的属性和方法
具有层次的结构
B:继承的优点与弊端:
1、优点
说明:继承是面向对象中代码重用的最佳方法,采用继承的机制来组织设计系统中的类,可以提高程序的抽象的程度,使之更接近人 类的思维方式,采用继承编写的程序机构清晰,节约了编程的时间,因为代码的编写减少,因此也降低了维护的工作量
代码的可重用性
父类的属性和方法可用于子类
设计应用程序变得更加简单
可以轻松地自定义子类
2、弊端
A:让类的耦合性增强。这样某个类的改变,就会影响其他和该类相关的类。
设计程序的原则:低耦合,高内聚。
耦合:类与类的关系
内聚:自己完成某件事情的能力
B:打破了封装性
C:父类(基类,和超类)
子类(派生类)
说明:父类是所有子类的公共属性及方法的集合,子类则是父类的特殊化
实质:子类是对父类功能的扩展
D:继承的语法
修饰符 子类 extends 父类{
}
说明:继承关键字:extends===》父类初始化信息加载,父类的所有信息都可以通过子类去完成;子类有权调用但没权修改
特别注意只要使用关键字,就意味着相同调用父类的无参构造方法(super())
F:Java继承中的成员关系
1:成员变量
a:子类的成员变量名称和父类中的成员变量名称不一样,调用就是子类中成员变量
b:子类的成员变量名称和父类中的成员变量名称一样时的访问方法
子类的方法访问变量的查找顺序:
在子类方法的局部范围找,有就使用。
在子类的成员范围找,有就使用。
在父类的成员范围找,有就使用。
找不到,就报错。
2:构造方法
a:子类的构造方法
1、先调用父类构造方法,再调用子类构造方法
说明:子类的构造方法默认会去访问父类的无参构造方法是为了子类访问父类数据的初始化
父类中如果没有无参构造方法,怎么办?
子类通过super去明确调用带参构造
子类通过this调用本身的其他构造,但是一定会有一个去访问了父类的构造
让父类提供无参构造
2、子类构造方法的名称与类的名称相同
3、要调用父类构造方法,使用关键字 super
4、说明:
调用父类构造方法的语法为:
super() 或 super(参数列表) ;
super () 方法始终指向调用类的父类
5、super关键字来访问父类的成员
super只能出现在子类的方法和构造方法中
super调用构造方法时,只能是第一句
super不能访问父类类的private成员
6、this与super的区别
操作属性
this.属性:表示调用本类中的属性,如果本类中的属性不存在,则从父类查找
super.属性:表示调用父类中的属性
操作方法
this.方法():表示调用本类中的方法,如果本类中的方法不存在,则从父类查找
super.方法():表示调用父类中的方法
调用构造
this()调用本类中的其他构造方法
super():由子类调用父类中的构造方法
说明:在调用构造方法时,因为两个都要在第一行,所以只能出现一个
查找范围
this:先从子类中查找,如果没有从父类中查找
super:不查子类直接查找父类
特殊
this:当前对象
super:父类对象
3:成员方法
a:子类的成员方法和父类中的成员方法名称不一样,
b:子类的成员方法和父类中的成员方法名称一样,?
通过子类对象访问一个方法的查找顺序:
在子类中找,有就使用
在父类中找,有就使用
找不到,就报错
访问修饰符
A、
public:该类或非该类均可访问
protected:该类及其子类的成员可以访问,同一个包中的类也可访问
默认:相同数据包中的类可以访问
private:只有该类可以访问
B:访问修饰符的范围
位置 private 默认 protected public
同一个类 是 是 是 是
同一个包内的类 否 是 是 是
不同包内的子类 否 否 是 是
不同包并且不是子类 否 否 否 是
说明:public虽然是权限最大,但是却是最不完全的
private权限最小,但是最安全
方法的重写与重载
A:方法的重载(Overload)
说明:方法名相同;方法参数列表不同;与方法的返回值无关与访问修饰也无关;同一个类中
B:方法的重写(Override)
说明:子类与父类的方法签名相同的现象(返回类型,方法名,参数列表相同叫签名相同)
1、 重写是子类的方法覆盖父类的方法,要求方法名和参数都相同
2、 重写只能出现在继承关系之中。当一个类继承它的父类方法时,都有机会重写该父类的方法。
C:重写与重载的区别
重载是在同一个类中的两个或两个以上的方法,拥有相同的方法名,但是参数却不相同,方法体也不相同,最常见的重载的例子就 是类的构造方法
重写是在至少两个类中进行重写:方法名相同;参数列表也相同;返回类型也相同的
注意:在重写时子类的访问权限不能小于父类
代码块
2、代码块
含义:在Java中用{}扩起来的代码叫代码块;
根据位置不同分为:
a、局部方法块:局部位置,用于限定变量的生命周期。位置在方法里;
b、构造方法块:在类中的成员位置,用{}括起来的代码。每次调用构造方法执行前,都会先执行构造代码块。
作用:可以把多个构造方法中的共同代码放到一起,对对象进行初始化。
c、静态方法快:在类中的成员位置,用{}括起来的代码,只不过它用static修饰了。
作用:一般是对类进行初始化。
* 问题:静态代码块,构造代码块,构造方法的执行顺序?
静态代码块 -- 构造代码块 -- 构造方法
静态代码块:只执行一次
构造代码块:每次调用构造方法都执行
抽象类:
A、把多个共性的东西提取到一个类中,这是继承的做法。
但是呢,这多个共性的东西,在有些时候,方法声明一样,但是方法体。
也就是说,方法声明一样,但是每个具体的对象在具体实现的时候内容不一样。
所以,我们在定义这些共性的方法的时候,就不能给出具体的方法体。
而一个没有具体的方法体的方法是抽象的方法。
在一个类中如果有抽象方法,该类必须定义为抽象类。
抽象类的概述:
动物不应该定义为具体的东西,而且动物中的吃,睡等也不应该是具体的。
我们把一个不是具体的功能称为抽象的功能,而一个类中如果有抽象的功能,该类必须是抽象类。
B、抽象类的特点
A:抽象类和抽象方法必须用关键字abstract修饰
说明:由abstract修饰的方法叫抽象方法;由abstract修饰的类叫抽象类
B:抽象类中不一定有抽象方法,但是有抽象方法的类一定是抽象类
C:抽象类不能实例化,但是可以继承抽象类的方法
D:抽象类的子类
a:是一个抽象类。不需要重写父类的抽象方法
b:是一个具体类。这个类必须重写抽象类中的所有抽象方法。
C:抽象类的成员特点:
A:成员变量
有变量,有常量
B:构造方法
有构造方法
抽象类的成员方法特性:
A:抽象方法 强制要求子类做的事情。
B:非抽象方法 子类继承的事情,提高代码复用性
C:成员方法
有抽象,有非抽象
D、
1、抽象类的语法:
public abstract class name{…… }
2、 抽象方法语法:
public abstract 返回类型 method_name(parameter_list);
说明:抽象方法必须声明在抽象类中
抽象方法具有强制性;非抽象的方法则无需强制性
抽象类的方法必须出现在抽象类中;但是抽象类还可以有非抽象的方法
3、使用:父类中的某些抽象不包含任何逻辑,并需要在子类中重写,子类提供这种抽象方法的实现细节
4、抽象类可以具有指向子类对象的对象引用
抽象类不能被实例化
构造方法 和 static 方法不能是抽象的
父类的抽象方法往往在子类中实现
抽象类的构造方法用来给与给子类对象进行初始化
抽象类和一般类的异同点
1:一般类有足够的信息描述类,
抽象类的描述就不足
2:一般类中不能定义抽象方法,只能定义非抽象方法
抽象类中可以定义抽象方法,也可以定义非抽象方法
3:一般类可以被实例化,而抽象类不可以被实例化
abstract不能和哪些关键字共存?
private 冲突
final 冲突
static 无意义
final关键字:
含义:最终的意思
特点:
1:它修饰的类,不能被继承。
2:它修饰的方法,不能被重写。不能被覆盖
3:它修饰的变量,是一个常量:只能赋值一次
含义:固定的;不变的
修饰类:
语法:public final class 类名(){}
说明:这样的类叫:终止类;可以实例化;但是不可以继承
修饰方法:
语法::public final 类型 方法名(){}
说明:方法不会被重写
修饰变量:
语法:public final 类型 变量名;
说明:一般都是定义常量;其值是固定不变的
说明:final:不能默认初始化必须显示初始化;如果程序中有个固定的值,那么直接使用就好了,但是阅读性差,所以加 上/final固定,在实例化对象前加上final修饰的话,不允许二次复制但是允许修改属性值
写法规范:常量所有字母都大写,如果两个词中间加下划线
总结:
A:继承的结果
父类有 子类有 调用显示子类
父类有 子类有 调用显示父类
子类有 父类有 调用显示子类
注意:继承的优点对于父类的扩展;子类有优先的原则
模块方法
含义: 模板方法模式准备一个抽象类,将部分逻辑以具体方法以及具体构造子的形式实现,然后声明一些抽象方法来迫使子类实现 剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。先制定一个顶级逻辑框架 ,而将逻辑的细节留给具体的子类去实现。开闭原则是指一个软件实体应该对扩展开放,对修改关闭。也就是说软件实体必 须是在不被修改的情况下被扩展。模板方法模式意图是由抽象父类控制顶级逻辑,并把基本操作的实现推迟到子类去实现,这 是通过继承的手段来达到对象的复用,同时也遵守了开闭原则!
A、一次性实现一个算法的不变部分,并将可变的行为留给子类实现
B、如何提取:各子类公共的行为应该被提取出来并集中到一个公共类以继承的方式代码重复,首先识别有些代码中的不同之处,并将 不同之处分离为新的操作,最后用一个调用这些新的操作的模块方法来代替这些不同的代码
C、作用:控制子类的扩展
D、应用条件
具有统一的操作步骤或操作过程
具有不同的操作细节
存在多个具有同样操作步骤的应用场景,但某些具体的操作细节却各不相同