目录
final关键字
- final关键字是最终的意思,可以修饰(类、方法、变量)
- 修饰类:该类被称为最终类,特点是不能被继承了。(常见于为工具类修饰)
- 修饰方法:该方法被称为最终方法,特点是不能被重写了。
- 修饰变量:该变量只能被赋值一次。(用于局部变量,成员变量;其中修饰静态成员变量我们称为常量)
final修饰变量的注意事项
- final修饰基本类型的变量,变量存储的数据不能被改变。
- final修饰引用类型的变量,变量存储的地址不能被改变,但地址所指向对象的内容是可以被改变的。
常量
- 使用了staticfinal修饰的成员变量就被称为常量。
作用:通常用于记录系统的配置信息。
例如:
public class Constant{
public static final String SCHOOL_NAME = "**大学";
}
注意常量名的命名规范:建议使用大写英文单词,多个单词使用下划线连接起来。
使用常量记录系统配置信息的优势、执行原理
- 代码可读性更好,可维护性也更好。
- 程序编译后,常量会被“宏替换”:出现常量的地方全部会被替换成其记住的字面量,这样可以保证使用常量和直接用字面量的性能是一样的。
抽象类
认识抽象类
- 在Java中有一个关键字叫:abstract,它就是抽象的意思,可以用它修饰类、成员方法。
- abstract修饰类,这个类就是抽象类;修饰方法,这个方法就是抽象方法。
修饰符 abstract class 类名{
修饰符 abstract 返回值类型 方法名称(形参列表);
}
例如:
public abstract class A{
//抽象方法:必须只有方法签名,不能有方法体
public abstract void test();
/*
public abstract void test(){
} 这样就会报错
*/
}
抽象类的注意事项、特点
- 抽象类中不一定有抽象方法,有抽象方法的类一定是抽象类。
- 类该有的成员(成员变量、方法、构造器)抽象类都可以有。
- 抽象类最主要的特点:抽象类不能创建对象,仅作为一种特殊的父类,让子类继承并实现。
- 一个类继承抽象类,必须重写完抽象类的全部抽象方法,否则这个类也必须定义成抽象类。
抽象类的好处
- 父类知道每个子类都要做某个行为,但每个子类要做的情况不一样,父类就定义成抽象方法,交给子类去重写实现,我们设计这样的抽象类,就是为了更好的支持多态。
例如下面的案例:
需求:
某宠物游戏,需要管理猫、狗的数据。
猫的数据有:名字;
行为是:喵喵喵的叫~
狗的数据有:名字;
行为是:汪汪汪的叫~
请用面向对象编程设计该程序。
运行结果:
应用场景-模板方法设计模式
- 解决方法中存在重复代码的问题。
例如:
public class A{ public class B{
代码一样 代码一样
代码不同 代码不同
代码一样 代码一样
} }
模板方法设计模式的写法
- 定义一个抽象类。
- 在里面定义2个方法。
- 一个是模板方法:把相同代码放里面去。
- 一个是抽象方法:具体实现交给子类完成。
例如:
需求:
现要求老师和学生写都要写一篇题目为的《我的父亲》作文,开头和结尾都已经给定了,设计模板方法让老师和学生完成正文部分的内容。
实现:
public abstract class People {
/*
设计模板方法设计模式
1.定义一个抽象类出来
*/
//2.把正文的模板方法写出来
public final void write(){
System.out.println("\t\t\t\t\t《我的父亲》");
//开头部分
System.out.println("\t\t在我的世界里,有这样一个男人,他用坚定的双臂为我撑起了一个遮风避雨的天空。他是我的老师,也是我的父亲,一个普通而伟大的角色。");
//3.定义抽象方法,让子类来完成正文内容
System.out.println(writeMain());
//结尾部分
System.out.println("\t\t岁月流转,父亲的教诲如同那不灭的星光,永远照耀着我的心灵。他的身影,不仅在教室里留下了深刻的印记,在我的人生道路上也刻下了不可磨灭的痕迹。我的父亲,一位教师,一位引路人,一个永远值得我敬仰和爱戴的男人。");
}
public abstract String writeMain();
}
public class Teacher extends People{
@Override
public String writeMain() {
return "作为教师,他总是以身作则,用知识的光芒照亮学生们前行的道路。在课堂上,他的每一个字、每一个动作都透露着对学生深深的爱与责任。他教会了他们如何面对困难和挑战,如何在知识的海洋中翱翔。课下的他更是孩子们的朋友,倾听他们的心声,引导他们成长。他用自己的行动诠释了一个教师父亲的形象,既是严师又是慈父。";
}
}
public class Student extends People
{
@Override
public String writeMain() {
return "父亲是那个总是鼓励我追求梦想的人。每当我遇到挫折,他总是耐心地听我倾诉,给予我最真诚的建议和最温暖的拥抱。在学习上,他不仅是我的榜样,更是我坚强的后盾。他教会了我坚持与努力的意义,让我明白了无论何时都不应放弃希望。在我眼中,他是最棒的父亲,也是最好的老师。";
}
}
public class Test {
public static void main(String[] args) {
People p1 = new Teacher();
People p2 = new Student();
p1.write();
p2.write();
}
}
运行结果:
补充小知识:建议使用final关键字修饰模板方法。
- 模板方法是给对象直接使用的,不能被子类重写。
- 一旦子类重写了模板方法,模板方法就失效了。
1、模板方法设计模式解决了什么问题?
- 解决方法中存在重复代码的问题。
2、模板方法设计模式应该怎么写?
- 定义一个抽象类。
- 在里面定义2个方法,一个是横板方法:放相同的代码里;一个是抽象方法:具体实现交给子类完成。
3、模板方法建议使用什么关键字修饰?为什么?
- 建议使用final关键字修饰模板方法。
因为:
- 模板方法是给对象直接使用的,不能被子类重写。
- 一旦子类重写了模板方法,模板方法就失效了。
END
学习自:黑马程序员——JavaSE课程