一:问曰篇
问:何为抽象类?
曰:包含抽象方法的类,用abstract修饰
//没错,我就是抽象类啦!
public abstract class BigLao{
}
问:何为抽象方法?
曰:只有方法声明,没有方法体的方法,也用abstract修饰
public abstract class BigLao{
//也没错,我就是抽象方法
public abstract void work();
}
问:抽象方法由来?
曰:当需要一个方法,却不明确方法的具体实现时,可以将该方法定义为抽象方法,具体实现由子类完成!
别找了,这里没有代码演示。
二:解析篇
1.抽象类的特点(very 重要!!!)
*必须用abstract修饰符修饰:
修饰符 abstract class 类名 {}
修饰符 abstract 返回类型 方法名 {}
*抽象类不能被实例化,只能创建子类对象:
*作为继承抽象父类的子类的去路:要么重写父类所有抽象方法,要么也定义为抽象类
System.out.println("自己敲代码验证一下试试");
*成员变量:
1.普通成员变量:
//抽象类也可以有普通成员变量:
String name;
2.成员常量:
//也可以有成员常量:
final int AGE = 250;
*可以有普通方法和抽象方法,抽象类不一定有抽象方法,有抽象方法的一定是抽象类(或接口)
//抽象类的普通方法
public static void sleep(String name){
if (name.equals("大佬")){
System.out.println(name+"休息中,请勿扰!");
}else {
System.out.println("滚去搬砖!立刻!马上!");
}
}
*可以有像普通类一样的构造方法,且可以重载哈!
有参构造:
//抽象父类也可以有有参构造方法且可以重载:
public BigLao(String name,int num){
System.out.println("类型:"+"大佬的小弟"+"\n"+"姓名:"+name+"\n"+"战斗力:"+num);
}
无参构造:
//抽象父类可以有无参构造方法:
public BigLao() {
}
三:展示篇
想到的都说差不多啦,接下来请欣赏完整代码演示:
*定义抽象父类:
package 面向对象.抽象类;/* *@Author:Tstr *@Date:2020/8/13 10:47 *@from:lenovo *@e-mail:x20135201314boy@126.com */
//定义一个抽象父类:大佬类
public abstract class BigLao {
//抽象类也可以有普通成员变量:
String name;
//也可以有成员常量:
final int AGE = 250;
//定义一个工作(work)的抽象方法:
public abstract void work();
//抽象父类可以有无参构造方法:
public BigLao() {
}
//抽象父类也可以有有参构造方法且可以重载:
public BigLao(String name,int num){
System.out.println("类型:"+"大佬的小弟"+"\n"+"姓名:"+name+"\n"+"战斗力:"+num);
}
//抽象类的普通方法
public static void sleep(String name){
if (name.equals("大佬")){
System.out.println(name+"休息中,请勿扰!");
}else {
System.out.println("滚去搬砖!立刻!马上!");
}
}
}
*创建子类:小弟类
package 面向对象.抽象类;/* *@Author:Tstr *@Date:2020/8/13 10:58 *@from:lenovo *@e-mail:x20135201314boy@126.com */
//定义一个子类:小弟类,继承父类:大佬类
public class XiaoDi extends BigLao {
public XiaoDi() {
}
public XiaoDi(String name, int num) {
//super(name, num);
super.sleep("大佬");
System.out.println("类型:"+"大佬的小弟"+"\n"+"姓名:"+name+"\n"+"战斗力:"+num);
}
//子承父类必须重写父类的所有抽象方法
@Override
public void work() {
System.out.println();
System.out.println("工作内容:");
System.out.println(name+"为大佬跑腿!");
System.out.println(name+"给大佬点烟!");
System.out.println(name+"替大佬干架!!");
}
}
*创建子类:马子类
package 面向对象.抽象类;/* *@Author:Tstr *@Date:2020/8/13 11:09 *@from:lenovo *@e-mail:x20135201314boy@126.com */
//定义一个子类:马子类,继承父类:大佬类
public class MaZi extends BigLao {
public MaZi() {
}
public MaZi(String name, int num) {
// super(name, num);
System.out.println("类型:"+"大佬的马子"+"\n"+"姓名:"+name+"\n"+"战斗力:"+num);
}
//父类抽象方法重写
@Override
public void work() {
System.out.println();
System.out.println("工作内容:");
System.out.println(name+"正在给大佬倒酒!");
System.out.println(name+"给大佬揉肩,小拳拳锤他胸口!");
System.out.println(name+"在和大佬做不可描述的事....(坏笑ing)");
}
}
*创建抽象子类:司机类
package 面向对象.抽象类;/* *@Author:Tstr *@Date:2020/8/13 11:04 *@from:lenovo *@e-mail:x20135201314boy@126.com */
//定义一个子类:司机类,给大佬开车
//子类继承父类小弟类,的第二种情况:也定义为抽象
public abstract class Driver extends BigLao {
//子类的抽象方法:
public abstract void drive();
}
*创建测试类:
package 面向对象.抽象类;/* *@Author:Tstr *@Date:2020/8/13 11:16 *@from:lenovo *@e-mail:x20135201314boy@126.com */
public class BigLao_Test {
public static void main(String[] args) {
//测试普通方法
//1.抽象类不能被实例化,只能创建子类
//测试抽象类的构造方法
//2.利用多态测试小弟类
BigLao bigLao = new XiaoDi();
//子类实现父类的构造方法并调用
new XiaoDi("丁力",100000);
bigLao.name = "丁力";
bigLao.work();
System.out.println("---------华丽分割线------------");
new MaZi("冯程程",1000);
//3.利用多态测试马子类
BigLao bigLao1 = new MaZi();
bigLao1.name = "冯程程";
bigLao1.work();
System.out.println("---------华丽分割线------------");
//4.利用多态测试司机类
BigLao bigLao2 = new Driver() {
@Override
public void drive() {
System.out.println("司机正在开车,去干架的路上...");
}
@Override
public void work() {
System.out.println("司机已经开到点儿啦,正掏出斧头,干架中!");
}
};
//5.测试抽象子类:司机类
bigLao2.work();
System.out.println();
System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>");
System.out.println("那么问题来了,大佬是谁?");
System.out.println("->>评论区见! ");
System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>");
}
}
*测试结果展示: