本文主要是介绍【愚公系列】2023年10月 Java教学课程 032-抽象类,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
🏆 作者简介,愚公搬代码
🏆《头衔》:华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,阿里云专家博主,腾讯云优秀博主,掘金优秀博主,51CTO博客专家等。
🏆《近期荣誉》:2022年CSDN博客之星TOP2,2022年华为云十佳博主等。
🏆《博客内容》:.NET、Java、Python、Go、Node、前端、IOS、Android、鸿蒙、Linux、物联网、网络安全、大数据、人工智能、U3D游戏、小程序等相关领域知识。
🏆🎉欢迎 👍点赞✍评论⭐收藏
文章目录
- 🚀一、抽象类
- 🔎1.抽象类的概述
- 🔎2.抽象类的特点
- 🔎3.抽象类的案例
- 🔎4.模板设计模式
- 🔎5.final
- 🔎6.枚举
- 🚀感谢:给读者的一封信
🚀一、抽象类
🔎1.抽象类的概述
抽象类是Java中一种特殊类型的类,它无法被实例化,只能被用作父类被继承。抽象类通常用于定义一组类的共同结构,但是具体实现则需要子类负责完成。抽象类的特点如下:
-
抽象类不能被实例化:抽象类只能被用作父类被继承,不能被用来创建对象。
-
抽象类可以包含方法的定义:抽象类中可以定义抽象方法和具体方法(非抽象方法)。
-
抽象方法没有方法体:抽象方法只有函数原型,没有具体的实现代码。具体的实现需要在子类中完成。
-
子类必须实现抽象方法:如果一个子类继承了抽象类,那么它必须实现所有抽象方法,否则,子类也必须被定义为抽象类。
-
抽象类可以有属性:抽象类中可以定义属性,和其他类一样,这些属性可以被继承和覆盖。
抽象类的使用可以使得代码更加简洁和易于维护。通过抽象类,我们可以定义一组相关的类的结构,并在其中包含方法的定义,同时还可以强制子类实现我们所期望的方法。
🔎2.抽象类的特点
抽象类和抽象方法必须使用 abstract 关键字修饰
//抽象类的定义
public abstract class 类名 {}//抽象方法的定义
public abstract void eat();
Java中的抽象类有以下特点:
-
抽象类不能被实例化,只能被子类继承。
-
抽象类可以包含普通方法和抽象方法。抽象方法是没有方法体的方法,只有方法声明,要求子类必须实现。
-
如果一个类包含抽象方法,那么该类必须被声明为抽象类。
-
抽象类可以拥有构造器,但是不能被用来创建对象。
-
抽象类可以包含成员变量、静态块、静态方法、final方法等。
-
抽象类的子类必须实现其父类中的所有抽象方法,否则子类也必须声明为抽象类。
🔎3.抽象类的案例
-
案例需求
定义猫类(Cat)和狗类(Dog)
猫类成员方法:eat(猫吃鱼)drink(喝水…)
狗类成员方法:eat(狗吃肉)drink(喝水…)
-
实现步骤
- 猫类和狗类中存在共性内容,应向上抽取出一个动物类(Animal)
- 父类Animal中,无法将 eat 方法具体实现描述清楚,所以定义为抽象方法
- 抽象方法需要存活在抽象类中,将Animal定义为抽象类
- 让 Cat 和 Dog 分别继承 Animal,重写eat方法
- 测试类中创建 Cat 和 Dog 对象,调用方法测试
-
代码实现
- 动物类
public abstract class Animal {public void drink(){System.out.println("喝水");}public Animal(){}public abstract void eat(); }
- 猫类
public class Cat extends Animal {@Overridepublic void eat() {System.out.println("猫吃鱼");} }
- 狗类
public class Dog extends Animal {@Overridepublic void eat() {System.out.println("狗吃肉");} }
- 测试类
public static void main(String[] args) {Dog d = new Dog();d.eat();d.drink();Cat c = new Cat();c.drink();c.eat();//Animal a = new Animal();//a.eat();}
🔎4.模板设计模式
1、设计模式
设计模式是针对软件设计问题的一种通用解决方案,即在特定场景下应用的最佳实践。设计模式是在软件开发领域中形成的一套跨越语言和平台的通用模板,它们可以帮助开发人员解决在软件设计和开发中经常遇到的问题。设计模式一般包含两个部分:模式名称和一般模式描述,以及在某种特定的环境中实现该模式的具体解决方案。设计模式涉及到面向对象编程中的各种概念,包括接口、抽象类、继承、封装、多态等。常用的设计模式有单例模式、工厂模式、装饰器模式、观察者模式、策略模式等。设计模式对于提高代码可读性、可维护性、可扩展性非常有帮助,并且可以避免不必要的代码重复。
2、模板设计模式
模板设计模式是一种行为设计模式,用于定义算法的框架,并允许子类在不改变算法结构的情况下重新定义算法的某些步骤。模板设计模式的实现方式是将算法结构定义在抽象基类中,将算法的具体实现步骤留给具体子类去实现。这样可以实现代码复用和代码的扩展性,因为算法的结构是固定的,但每个具体子类可以实现自己的具体实现步骤。模板设计模式是一种很常用的设计模式,在模板方法中定义的算法结构可以是一个复杂的系统或一个简单的方法。
3、模板设计模式的优势
模板设计模式的优势如下:
-
提高代码的重用性:通过在模板方法中定义算法的骨架,将具体步骤交给子类去实现,可以极大地提高代码的重用性。
-
提高系统灵活性:模板方法中定义的算法骨架是稳定不变的,但是具体实现可以由子类来决定,达到了系统灵活性和扩展性的目的。
-
简化代码逻辑:将相同的代码放入抽象父类中来实现,可以减少代码的重复,使代码更加简洁易懂。
-
保证代码的一致性:模板方法中定义了算法的流程,可以保证子类实现的一致性,也就是说,所有的子类实现都将按照同样的流程进行,可以减少代码维护的成本。
-
降低系统的耦合度:模板方法可以将算法的实现和具体的子类解耦,降低了系统的耦合度,提高了代码的可维护性。
4、示例代码
模板类
/*作文模板类*/
public abstract class CompositionTemplate {public final void write(){System.out.println("<<我的爸爸>>");body();System.out.println("啊~ 这就是我的爸爸");}public abstract void body();
}
实现类A
public class Tom extends CompositionTemplate {@Overridepublic void body() {System.out.println("那是一个秋天, 风儿那么缠绵,记忆中, " +"那天爸爸骑车接我放学回家,我的脚卡在了自行车链当中, 爸爸蹬不动,他就站起来蹬...");}
}
实现类B
public class Tony extends CompositionTemplate {@Overridepublic void body() {}/*public void write(){}*/
}
测试类
public class Test {public static void main(String[] args) {Tom t = new Tom();t.write();}
}
🔎5.final
"final"关键字在Java中的作用是用于声明变量、方法或类,表示它们是不可变的,即不允许被修改。具体作用如下:
-
声明final变量时,变量的值只能被赋值一次,之后不能被修改。
-
声明final方法时,该方法不能被子类覆盖重写。
-
声明final类时,该类不能被继承。
-
final变量、方法或类的值或实现都是不可变的,这样可以提高安全性和可靠性。
-
对于基本类型的final变量,其实质是声明了一个常量,对于引用类型的final变量,其引用地址不可变,但其内部属性可以修改。
public static void main(String[] args){final Student s = new Student(23);s = new Student(24); // 错误s.setAge(24); // 正确
}
🔎6.枚举
枚举(Enumeration)是Java中一种特殊的数据类型,用于定义一组常量。
使用枚举可以将一组相关的常量组织在一起,方便程序员进行引用和管理,同时也增强了程序的可读性。在Java中,枚举类型是通过关键字enum定义的,枚举类型中的每个常量都是该枚举类型的一个实例。
枚举常量除了是固定的,还可以有自己的属性和方法。在Java中,枚举类型还可以实现接口,从而具有接口的特性。
以下是Java中枚举的使用示例:
public enum WeekDay {Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday
}// 访问枚举常量
WeekDay today = WeekDay.Tuesday;// 枚举常量属性和方法
public enum WeekDay {Monday("星期一"), Tuesday("星期二"), Wednesday("星期三"), Thursday("星期四"), Friday("星期五"), Saturday("星期六"), Sunday("星期日");private final String desc; // 枚举常量属性private WeekDay(String desc) {this.desc = desc;}public String getDesc() {return desc;}
}// 遍历枚举类型
for (WeekDay day : WeekDay.values()) {System.out.println(day + ":" + day.getDesc());
}
枚举类型在Java中广泛用于状态码、单例模式、工厂模式等场景中,可以提高代码的可读性和可维护性。
🚀感谢:给读者的一封信
亲爱的读者,
我在这篇文章中投入了大量的心血和时间,希望为您提供有价值的内容。这篇文章包含了深入的研究和个人经验,我相信这些信息对您非常有帮助。
如果您觉得这篇文章对您有所帮助,我诚恳地请求您考虑赞赏1元钱的支持。这个金额不会对您的财务状况造成负担,但它会对我继续创作高质量的内容产生积极的影响。
我之所以写这篇文章,是因为我热爱分享有用的知识和见解。您的支持将帮助我继续这个使命,也鼓励我花更多的时间和精力创作更多有价值的内容。
如果您愿意支持我的创作,请扫描下面二维码,您的支持将不胜感激。同时,如果您有任何反馈或建议,也欢迎与我分享。
再次感谢您的阅读和支持!
最诚挚的问候, “愚公搬代码”
这篇关于【愚公系列】2023年10月 Java教学课程 032-抽象类的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!