抽象类(abstract class)
1. 为什么使用抽象类:
父类知道子类一定要完成某个功能,但是每个子类实现的情况都不一样而且子类都会用自己的功能了,父类的该功能就可以定义成抽象的方法。拥有抽象方法的类必须定义成抽象类。
2. 什么是抽象方法?
没有方法体,只有方法签名,只声明但不实现,必须用abstract修饰的方法就是抽象方法。
3. 什么是抽象类?
拥有抽象方法的类必须定义成抽象类。
抽象类必须用abstract关键字修饰。
注意:一个类继承了抽象类,必须重写完抽象类的全部抽象方法,否则这个类必须定义成抽象类!
4. 抽象类的特征
特征:有得有失
有得:抽象类拥有创建抽象方法的能力。
有失:抽象类失去了创建对象的能力。
抽象类虽然有构造器,但是抽象类绝对不能创建对象。
抽象类中可能存在抽象方法,但抽象方法不能执行。
抽象(abstract)在学术上本身意味着不能实例化。
抽象类除了有得有失之外,类的其他成分都具备!!
5.抽象类的存在意义
抽象类存在的意义有两点:
(1)被继承,抽象类就是为了被子类继承,否则抽象类将毫无意义。(核心意义)
(2)抽象类体现的是"模板思想":部分实现,部分抽象。
(拓展) – 可以使用抽象类设计一个模板模式。
下面给出一个设计模板案例:
public class ExtendsDemo {
public static void main(String[] args) {
Student XiaoMing= new Student();
XiaoMing.write();
Student2 XiaoMa= new Teacher();
LaoWang.write();
}
}
class Student extends Template{
@Override
public String writeMain() {
return "\t\t我爸就是好,有多好,做他儿子才能懂~~~";
}
}
class Student2 extends Template{
@Override
public String writeMain() {
return "\t\t我爸爸很牛,我爸爸是马云,有这个爸爸就是爽,很有钱~~~~";
}
}
// 1.写一个模板类:代表了作文模板。
abstract class Template{
private String title = "\t\t\t\t\t\t《我的爸爸》";
private String first= "\t\t我的爸爸很牛逼,到底有多牛呢,请看如下说明:";
private String last = "\t\t以上就是我的爸爸,简直太好了,下辈子还要做他儿子!";
// 2.提供一个写作文方法
public void write(){
System.out.println(title);
System.out.println(first);
System.out.println(writeMain());// 正文:正文部分模板是不知道怎么写的!应该把正文部分定义成抽象方法
// 交给使用模板的子类重写!
System.out.println(last);
}
// 这里正文部分定义成抽象方法,交给子类重写!!
public abstract String writeMain();
}
补充说明:
-
设计模式:
是前人(技术大牛,或者一些技术协会,或者一些大型知名的IT公司)已经研发好或者设计好或者在实战开发中发现的的优秀软件设计思想,开源出去后来者可以直接使用就能够得到很好的软件模式。 -
设计模式的目的:
得到优秀的软件架构,从而提升代码的可重用性,扩展性,维护性,可读性。 -
模板模式是一种设计模式思想
-
模板模式的作用:部分实现,部分抽象,可以极大的简化功能代码,提高开发效率
接口(interface)
1.什么是接口?
接口是更加彻底的抽象,接口中全都是抽象方法和常量,没有其他成分。
2.接口是干啥用的?
接口体现的是规范思想,实现接口的类必须重写完接口中全部的抽象方法。
规范 == 约束。
接口称为被实现类,实现接口的类称为实现类。
3.接口的特点
- 接口中没有构造方式(因为接口不是类)
- 接口中的方法必须是抽象的(不能实现)
- 接口中除了static、final变量,不能有其他变量
- 接口支持多继承(一个类可以实现多个接口)
4.接口存在的意义
接口就是用来用来被类实现的,实现接口的类称为实现类。
注意:
- 接口是用类被实现的,实现接口的类称为实现类。
- 实现接口的关键字是:implements。
- 接口是可以被类多实现的。
- 注意:一个类实现接口必须重写完接口中全部抽象方法,否则这个类必须定义成抽象类!!
5.接口的多实现
实现类实现接口的格式:
修饰符 class 实现类名称 implements 接口1,接口2,接口3,....{
}
类与类是单继承。
类与接口可以多实现。
实例如下:
public class InterfaceDemo {
public static void main(String[] args) {
PingPongMan zjk = new PingPongMan();
zjk.run();
zjk.win();
zjk.rule();
}
}
class PingPongMan implements SportMan , Law{
@Override
public void rule() {
}
@Override
public void run() {
}
@Override
public void win() {
}
}
interface Law{
void rule();
void run();
}
interface SportMan{
void run();
void win();
}
6.接口拓展
-
如果实现了多个接口,多个接口中存在同名的静态方法并不会冲突
原因是只能通过各自接口名访问静态方法。 -
当一个类,既继承一个父类,又实现若干个接口时,(重点)
父类中的成员方法与接口中的默认方法重名,子类就近选择执行父类的成员方法。 -
当一个类实现多个接口时,多个接口中存在同名的默认方法。
实现类必须重写这个方法。 -
接口中,没有构造器,不能创建对象。(重点)
接口是更彻底的抽象,连构造器都没有,自然不能创建对象!!