引言:
在 Java 编程中,有时候我们需要定义一个类,它作为其他类的基础,但本身并不能被实例化。这种情况下,抽象类就派上了用场。抽象类为我们提供了一种在类层次结构中定义通用行为和规范的方式,有助于提高代码的抽象性、灵活性和可扩展性。
1.基本概念:
1. 抽象类:使用 abstract 关键字修饰的类称为抽象类。
2. 抽象方法:在抽象类中,可以定义抽象方法。抽象方法只有方法声明,没有方法体,使用 abstract 关键字修饰。
3. 不能实例化:由于抽象类可能包含未完全定义的方法,所以不能直接创建抽象类的对象。
4. 子类实现:抽象类的子类必须实现父类中的所有抽象方法,除非子类本身也是抽象类。
5. 部分实现:抽象类可以包含普通方法(有方法体的方法)和成员变量,为子类提供部分实现和共享的属性。
2.主要特点:
1. 包含抽象方法:抽象类中可以包含抽象方法,即只有方法声明,没有方法体的方法。这些抽象方法必须在子类中被实现,除非子类也是抽象类。
2. 不能被实例化:不能使用 new 关键字创建抽象类的对象。因为抽象类可能包含未完全定义的行为,不具备完整的对象实例化条件。
3. 提供通用属性和方法:可以包含非抽象的成员变量、普通方法和构造方法,为子类提供一些通用的实现和初始化逻辑。
4. 强制子类实现:子类继承抽象类后,必须实现父类中的所有抽象方法,否则子类也必须声明为抽象类。
5. 实现代码复用和框架定义:有助于在类层次结构中定义通用的行为框架,提高代码的复用性和可维护性。
6. 支持多态性:可以通过抽象类的引用指向子类对象,实现多态。
7. 强调共性和抽象:用于描述一类事物的共同特征和行为的抽象概念,而具体的实现细节由子类完成。
3。用实际问题探究Java父类的继承
一、问题:
二、建立类:
首先建立一个计算电费的抽象类
public abstract class ElectricityCharge
再建立一个丰水期的电费类并继承计算电费的抽象类
public class ElectricityChargeOfRain extends ElectricityCharge
其次建立枯水期的电费类并继承计算电费的抽象类
public class ElectricityChargeLackRain extends ElectricityCharge
最后建立测试类(测试类不需要继承)
public class use_ElectricityCharge
三、建立成员变量,构造方法,get方法,set方法,普通方法(抽象类的定义格式,无main方法)
抽象类中可以包含有一般方法,也可以包含有抽象方法。抽象类只能作为基类,它本身不能实例化。如果抽象类的子类不能实现所有的抽象方法,那么子类也必须定义为抽象类。即抽象类派生的非抽象子类,必须实现所有抽象方法。
1.首先设计计算电费的抽象类的成员变量,构造方法,get方法,set方法,普通方法(抽象方法)
成员变量:
private int dianfei;
get方法:
public int getDianfei() {
return dianfei;
}
set方法:这里要考虑电费不能为复数的情况
public void setDianfei(int dianfei) throws Exception{
if (dianfei >= 0){
this.dianfei = dianfei;
}else {
throw new Exception("电费不能为复数");
}
}
构造方法:
public ElectricityCharge(int dianfei) throws Exception{
setDianfei(dianfei);
}
抽象方法:(抽象方法里可以不写东西)
public abstract double playElect();
2.设计丰水类(继承类可以没有成员变量,get方法,set方法):
构造方法:(这里有可能会报错,所以要抛出可能会报错的代码throws Exception)
public ElectricityChargeOfRain(int dianfei)throws Exception{
super(dianfei);
}
抽象方法的重写:(这里让他不在成为抽象类,需要重写前面父类的抽象方法)
从重写的抽象方法中计算丰水期的电费
public double playElect(){
if(getDianfei() > 200){
return (getDianfei() -200) * 2.25 * 0.9 + 200 * 2.25;
}else {
return getDianfei() * 2.25;
}
}
到此丰水期类的设计就结束了,枯水期类同理即可,丰水期类与枯水期类完整代码如下:
丰水期类:
枯水期类:
3.在测试类中测试:(这里有main方法)
引用计算电费的抽象类等于丰水期类为e1
ElectricityCharge e1 = new ElectricityChargeLackRain(300);
引用丰水期等于枯水期为e2
ElectricityChargeLackRain e2 = new ElectricityChargeLackRain(250);
最后是代码的输出:
System.out.println("丰水期的电量为:"+""+e1.playElect());
System.out.println("苦水期的电量为:"+""+e2.playElect());
运行程序结果:
四:Java常用的快捷键:
1. 全局操作
打开资源:Ctrl+Shift+R
后退历史记录:Alt+←
前进历史记录:Alt+→
上一个:Ctrl+,
下一个:Ctrl+.
2. Java编辑器操作
显示大纲:Ctrl+O
在层次结构中打开类型:Ctrl+Shift+H
转至匹配的括号:Ctrl+Shift+P
转至上一个编辑位置:Ctrl+Q
转至上一个成员:Ctrl+Shift+↑
转至下一个成员:Ctrl+Shift+↓
3. 文本编辑器操作
转至行:Ctrl+L
改写切换:Insert
上滚行:Ctrl+↑
下滚行:Ctrl+↓
4. 文件操作
保存:Ctrl+S
打印:Ctrl+P
关闭:Ctrl+F4
全部保存:Ctrl+Shift+S
全部关闭:Ctrl+Shift+F4
新建:Ctrl+N
5. 项目操作
全部构建:Ctrl+B
6. 源代码操作
格式化:Ctrl+Shift+F
取消注释:Ctrl+\
注释:Ctrl+/
添加导入:Ctrl+Shift+M
组织导入:Ctrl+Shift+O
7. 快捷键拓展与提示
自动补全代码:Alt+/,例如在输入“syso”后,按Alt+/可自动补全为“System.out.println();”
重命名:Alt+Shift+R,可用于快速重命名类名或包名
快速删除当前行:Ctrl+D
快速导入包:Ctrl+Shift+O
上下移动内容:Alt+上下,可将当前行的内容向上或向下移动
五、主要注意事项:
1. 抽象类不能被实例化,不能使用 new 关键字创建抽象类的对象。
2. 抽象类可以包含抽象方法和非抽象方法。
3. 抽象方法没有方法体,只有方法声明,以 abstract 关键字修饰。
4. 子类继承抽象类时,如果子类不是抽象类,则必须实现父类中的所有抽象方法。
5. 抽象类可以有构造方法,用于被子类调用进行初始化操作。
六、常见问题:
1. 忘记在子类中实现父类的抽象方法,这会导致编译错误。
2. 错误地认为抽象类不能包含有具体实现的方法。
3. 对抽象类的构造方法的使用和作用理解不清晰,导致初始化逻辑错误。
4. 在多态场景中,对于抽象类和子类对象的类型转换理解不准确,可能导致运行时错误。