编程的时候会有这样的需求,你定义一个类,你知道必须有哪些方法但是你又不知道这些方法具体怎么实现。例如每个App都有安装、卸载和运行这些方法,但是具体App怎么安装、卸载和运行并不清楚。于是你希望父类App规定子类们必须有这些方法,但是父类本身不写具体实现,让子类们去写具体实现。
语法##
可以把类和方法定义为抽象的,语法是在类名或方法名前加abstract关键字。
概念##
- 抽象类只能被继承不能被实例化。
- 抽象方法没有方法体,且子类必须重写。
好处##
- 父类更抽象通用性更好,不能实例化但是可以用于声明,利用了多态的特性。
- 因为抽象方法必须重写可以避免遗漏的错误
注意##
- 因为抽象方法必须被子类重写,而构造方法不能被继承(只能在子类通过super关键字调用)。所以构造方法不能用abstract修饰。
- 因为final类不能被继承,所以不能final和abstract不能同时修饰一个类
- 因为final方法不能被重写,所以final和abstract不能同时修饰一个方法
- 如果子类要重写父类的抽象方法,那么子类必须能访问抽象方法,所以private和abstract不能同时修饰一个方法。
- 因为抽象方法是没有方法体的,而static修饰的方法可以不用实例化直接用类名调用。而调用一个没有方法体的方法没有意义,所以static和abstract不能同时修饰一个方法。
示例代码
抽象一个App父类,包含安装、卸载和运行。因为不知道具体实现,所以定义为抽象方法的。
public abstract class App {
protected String name; // 应用名称
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//安装
public abstract void install();
//卸载
public abstract void remove();
//运行
public abstract void run();
}
下面的Chrome类和WeiShi360类对App的继承与重写。
public class Chrome extends App {
public Chrome() {
this.name = "Chrome";
}
//安装
public void install() {
System.out.println("安装" + this.name);
}
//卸载
public void remove() {
System.out.println("卸载" + this.name);
}
//运行
public void run() {
System.out.println(this.name + "运行中。。。");
}
}
public class WeiShi360 extends App {
public WeiShi360() {
this.name = "360安全卫士";
}
//安装
public void install() {
System.out.println("安装" + this.name);
System.out.println("捆绑安装360全家桶");
System.out.println("设置开机启动项");
}
//卸载
public void remove() {
System.out.println("警告:卸载后电脑会变得很不安全,是否要卸载?");
System.out.println("询问:真的要卸载吗?");
System.out.println("询问:你确定要卸载吗?");
System.out.println("询问:你忍心卸载吗?");
System.out.println("卸载" + this.name);
}
//运行
public void run() {
System.out.println(this.name + "运行中。。。");
System.out.println("弹广告。。。");
System.out.println("提示:一键清理垃圾,清理后电脑运行速度显著提升哦");
System.out.println("提示:有软件可以更新");
System.out.println("提示:提示建议卸载XX软件");
System.out.println("偷偷黑一下竞争对手的软件进程");
System.out.println("偷偷收集点用户数据");
}
}
测试代码
App app1 = new Chrome();
App app2 = new WeiShi360();
app1.install();
app1.remove();
app1.run();
System.out.println("********************");
app2.install();
app2.remove();
app2.run();
运行结果:
<pre>
安装Chrome
卸载Chrome
Chrome运行中。。。
安装360安全卫士
捆绑安装360全家桶
设置开机启动项
警告:卸载后电脑会变得很不安全,是否要卸载?
询问:真的要卸载吗?
询问:你确定要卸载吗?
询问:你忍心卸载吗?
卸载360安全卫士
360安全卫士运行中。。。
弹广告。。。
提示:一键清理垃圾,清理后电脑运行速度显著提升哦
提示:有软件可以更新
提示:提示建议卸载XX软件
偷偷黑一下竞争对手的软件进程
偷偷收集点用户数据
</pre>
本文代码下载:百度网盘
网友评论