抽象类
概述
引入:
父类知道子类一定要完成某个功能,但是每个子类实现的情况都不一样
而且子类都会用自己的功能了,父类的该功能就可以定义成抽象的方法。
拥有抽象方法的类必须定义成抽象类。
什么是抽象方法?
没有方法体,只有方法签名,必须用abstract修饰的方法就是抽象方法。
什么是抽象类?
拥有抽象方法的类必须定义成抽象类。
抽象类必须用abstract关键字修饰。
小结:
抽象方法:没有方法体,只有方法签名,必须用abstract修饰的方法就是抽象方法。
抽象类:拥有抽象方法的类必须定义成抽象类,必须用abstract修饰。
public static abstract class Animals{
public abstract void eat();
}
public static class cat extends Animals{
@Override
public void eat(){
System.out.println("还没呢");
}
}
类写上abstract
定义成抽象类,不用写方法体。
抽象类的使用
抽象类是为了被继承。
总结:
一个类继承了抽象类,必须重写完抽象类的全部抽象方法,否则这个类必须定义成抽象类。
因为拥有抽象方法的类必须定义成抽象类。
抽象类一般使用:每个动物都要吃饭,但吃的东西不一样。
public class demo {
public static void main(String[] args){
cat caibao = cat.createcat();
caibao.eat();
dog jincai = dog.createcat();
jincai.eat();
}
public static abstract class Animals{
public abstract void eat();
}
public static class cat extends Animals{
@Override
public void eat(){
System.out.println("吃猫粮~~");
}
public static cat createcat(){
return new cat();
}
}
public static class dog extends Animals{
@Override
public void eat(){
System.out.println("吃狗粮~~");
}
public static dog createcat(){
return new dog();
}
}
}
抽象类特征
抽象类的特征:有得有失。
有得:抽象类拥有了得到抽象方法的能力。
失去:抽象类失去了创建对象的能力。面试题:抽象类是否有构造器,是否可以创建对象,为什么?
答:抽象类作为类一定有构造器,而且必须有构造器。
提供给子类继承后调用父类构造器使用的。抽象类虽然有构造器,但是抽象类绝对不能创建对象。
抽象类中可能存在抽象方法,抽象方法不能执行。
抽象在学术上本身意味着不能实例化。抽象类除了有得有失之外,类的其他成分人家都具备!!
小结:
抽象类不能创建对象。
抽象类除了不能创建对象之外,类的其他成分它都具备!
抽象类中也可以没有抽象方法!!
抽象类可以定义方法属性,但不能有对象!!!!!!!!!
abstract class Animal{
private String name;
private int age ;
public static String schoolName = "黑马";
public Animal(){
}
public abstract void run();
//普通方法
public void go(){
}
public static void test(){
}
}
抽象类存在的意义
抽象类存在的意义有两点:
(1)被继承,抽象类就是为了被子类继承,否则抽象类将毫无意义。(核心意义)
(2)抽象类体现的是"模板思想":部分实现,部分抽象。(拓展)
– 可以使用抽象类设计一个模板模式。
抽象类设计模板模式
设计模式:是前人(技术大牛,或者一些技术协会,或者一些大型知名的IT公司) 已经研发好或者设计好或者在实战开发中发现的的优秀软件设计思想,开源出去后来者可以直接使用就能够得到很好的软件模式。
设计模式的目的:得到优秀的软件架构,从而提升代码的可重用性,扩展性,维护性,可读性。
模板模式是一种设计模式思想:
模板模式的作用:部分实现,部分抽象,可以极大的简化功能代码,提高开发效率
写一个模板模式的案例:作文模板。
作文模板:
标题和第一段 以及最后一段是固定的,
正文部分交给使用模板的人自己来实现。
小结:
抽象类是部分实现,部分抽象的含义,所以可以设计模板模式。
好处:模板可以确定的模板自己实现,模板不能确定的定义成抽象方法交给使用模板的人重写。
可以设计出优秀的设计模式,提升开发效率,提高代码的重用性!
package src;
public class demo {
public static void main(String[] args){
Student yangyang = Student.createstudent();
yangyang.write();
}
public abstract static class Template{
private static final String Title = "\t\t\t\t\t《文章题目》"; //固定的模板,不变
private static final String one = "\t\t文章第一段";
//正文,模板不确定,交给模板子类来写!!!!
public void write(){
System.out.println(Title);
System.out.println(one);
// 正文:正文部分模板是不知道怎么写的!应该把正文部分定义成抽象方法
// 交给使用模板的子类重写!
System.out.println(writeMain());
System.out.println(last);
}
private static final String last = "\t\t文章最后一段";
public abstract String writeMain();
}
static class Student extends Template{
@Override
public String writeMain(){
return "\t\t正文部分";
}
public static Student createstudent(){
return new Student();
}
}
}
看的出来,模板中不需要修改的定义在抽象类中,将要写的放在子类中编写即可使用。
总结
抽象类不能创建对象,如果创建,编译无法通过而报错。只能创建其非抽象子类的对象。
理解:假设创建了抽象类的对象,调用抽象的方法,而抽象方法没有具体的方法体,没有意义。抽象类一定有而且是必须有构造器,是供子类创建对象时,初始化父类成员使用的。
理解:子类的构造器中,有默认的super(),需要访问父类构造器。抽象类中,不一定包含抽象方法,但是有抽象方法的类必定是抽象类。
抽象类的子类,必须重写抽象父类中所有的抽象方法,否则子类也必须定义成抽象类。
抽象类存在的意义是为了被子类继承,抽象类体现的是模板思想。
理解:抽象类中已经实现的是模板中确定的成员,
抽象类不确定如何实现的定义成抽象方法,交给具体的子类去实现。
笔记鸣谢
https://www.bilibili.com/video/BV1TE41177mP?p=33&spm_id_from=pageDriver&vd_source=eddd1a6c8490ec4358db736f38ae13e6