JavaSE——面向对象高级二(2/4)-final关键字、常量、抽象类(认识抽象类、抽象类的好处、应用场景-模板方法设计模式)

目录

final关键字

常量

抽象类

认识抽象类

抽象类的好处

应用场景-模板方法设计模式


final关键字

  • final关键字是最终的意思,可以修饰(类、方法、变量)
  • 修饰类:该类被称为最终类,特点是不能被继承了。(常见于为工具类修饰)
  • 修饰方法:该方法被称为最终方法,特点是不能被重写了。
  • 修饰变量:该变量只能被赋值一次。(用于局部变量,成员变量;其中修饰静态成员变量我们称为常量)

final修饰变量的注意事项

  1. final修饰基本类型的变量,变量存储的数据不能被改变。
  2. 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{

        代码一样                                        代码一样

        代码不同                                        代码不同

        代码一样                                        代码一样

}                                                      }

模板方法设计模式的写法

  1. 定义一个抽象类。
  2. 在里面定义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课程

  • 28
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值