当前位置: 首页 > news >正文

Java基础第5天总结(final关键字,枚举,抽象类)

  • final 修饰类:该类被称为最终类,特点是不能被继承了。
  • final 修饰方法:该方法被称为最终方法,特点是不能被重写了。
  • final 修饰变量:该变量有且仅能被赋值一次。
  • final 修饰基本类型的变量,变量存储的数据不能被改变。
  • final 修饰引用类型的变量,变量存储的地址不能被改变,但地址所指向对象的内容是可以被改变的。
  • 使用了static final 修饰的成员变量就被称为常量。作用:常用语记录系统的配置信息。


  • 单例设计模式
  • 作用:确保某个类只能创建一个对象。
  • 写法,实现步骤(饿汉式单例):
  1. 把类的构造器私有。
  2. 定义一个类变量记住类的一个对象。
  3. 定义一个方法,返回对象。
package com.itheima.singleinstance;
//设计成单例设计模式(饿汉)
public class A {//2、定义一个静态变量,用于记住本类的一个唯一对象//public static final A a = new A();//用这种就不用写第三步了private static A a = new A();//1、私有化构造器,确保单例类对外不能创建太多对象private A(){}//3、提供一个公开的静态方法,返回这个类的唯一对象public static A getInstance(){return a;}
}
package com.itheima.singleinstance;public class Test {public static void main(String[] args) {A a1 = A.getInstance();//A a2 = A.a;用final就这么定义}
}
  • 写法,实现步骤(懒汉式单例):
  1. 把类的构造器私有
  2. 定义一个静态变量用于存储对象
  3. 提供一个静态方法,保证返回的是同一个对象
package com.itheima.singleinstance;
//懒汉式单例类
public class A {//2、私有化静态变量private static A a;//1、私有化构造器private A(){}//3、提供静态方法返回对象,用的时候才创建对象public static A getInstance(){if(a == null){a = new A();}return a;}
}
package com.itheima.singleinstance;public class Test {public static void main(String[] args) {A a1 = A.getInstance();A a2 = A.getInstance();System.out.println(a1 == a2);// true}
}


  • 枚举类
  1. 都是最终类,不可以被继承,枚举类都是继承java.lang.Enum类的。
  2. 枚举类的第一行只能罗列一些名称,这些名称都是常量,并且每个常量会记住枚举类的一个对象。
  3. 枚举类的构造器都是私有的,因此,枚举类对外不能创建对象。
package com.itheima.enumdemo;
//枚举类
public enum  A {//枚举类的第一行:只能罗列枚举对象的名称,这些名称本质是常量X,Y,Z;
}
package com.itheima.enumdemo;public class Test {public static void main(String[] args) {A a1 = A.X;System.out.println(a1);// XSystem.out.println(a1.name());// XSystem.out.println(a1.ordinal());//索引 输出0}
}
  • 枚举类很适合做信息分类和标志。
package com.itheima.enumdemo;public class Constant {public static final int UP = 0;public static final int DOWN = 1;public static final int LEFT = 2;public static final int RIGHT = 3;
}
package com.itheima.enumdemo;public enum Direction {UP, DOWN, LEFT, RIGHT;
}
package com.itheima.enumdemo;public class Test {public static void main(String[] args) {//枚举类的应用场景:做信息的分类和标志//需求:模拟上下左右移动//法一:常量做信息标志和分类:但是参数值不受约束(除了0,1,2,3还能输入其他值)。move(Constant.UP);//法二:枚举做信息标志和分类:参数值受枚举类约束(只能输入这几个)。move2(Direction.UP);}public static void move2(Direction direction){switch (direction)//就这几种情况,不需要default判断了{case UP:System.out.println("向上移动");break;case DOWN:System.out.println("向下移动");break;case LEFT:System.out.println("向左移动");break;case RIGHT:System.out.println("向右移动");break;}}public static void move(int direction){switch (direction){case Constant.UP:System.out.println("向上移动");break;case Constant.DOWN:System.out.println("向下移动");break;case Constant.LEFT:System.out.println("向左移动");break;case Constant.RIGHT:System.out.println("向右移动");break;default:System.out.println("无效的移动方向");}}
}


  • 抽象类、抽象方法:都是用abstract修饰的;抽象方法只有方法签名,不能写方法体(不写大括号和大括号里的东西)
  • 抽象类中可以不写抽象方法,但有抽象方法的类必须是抽象类
  • 类有的成员(成员变量,方法,构造器)抽象类都具备
  • 抽象类不能创建对象,仅作为一种特殊的父类,让子类继承并实现
  • 一个类继承抽象类,必须重写完抽象类的全部抽象方法,否则这个类也必须定义成抽象类
  • 父类知道每个子类都要做某个行为,但每个子类要做的情况不一样,父类就定义成抽象方法,交给子类去重写,我们抽出这样的抽象类,就是为了更好的支持多态。
package com.itheima.abstractdemo;public abstract class Animal {public abstract void cry();
}
package com.itheima.abstractdemo;public class Cat extends Animal{@Overridepublic void cry() {System.out.println("小猫喵喵叫");}
}
package com.itheima.abstractdemo;public class Dog extends  Animal{@Overridepublic void cry() {System.out.println("汪汪汪");}
}
package com.itheima.abstractdemo;public class Test {public static void main(String[] args) {Animal a1 = new Dog();a1.cry();Animal a2 = new Cat();a2.cry();}
}
  • 模板方法设计模式解决了方法中存在重复代码的问题。
  • 模版方法设计模式应该怎么写?
  1. 定义一个抽象类
  2. 在里面定义2个方法,一个是模板方法:放相同的代码,一个是抽象方法:具体实现交给子类完成
  • 模板方法建议使用final关键字修饰
package com.itheima.abstract1;public abstract class People {public final void write(){System.out.println("aaaaaaaaaaaaaaaa");writeMain();System.out.println("cccccccccccccccc");}public abstract void writeMain();
}
package com.itheima.abstract1;public class Teacher extends  People{@Overridepublic void writeMain() {System.out.println("老师写代码");}
}
package com.itheima.abstract1;public class Student extends  People{@Overridepublic void writeMain() {System.out.println("学生写代码");}
}
package com.itheima.abstract1;public class Test {public static void main(String[] args) {People s1 = new Student();s1.write();System.out.println("==========================");People t1 = new Teacher();t1.write();}
}
/*
输出结果:
aaaaaaaaaaaaaaaa
学生写代码
cccccccccccccccc
==========================
aaaaaaaaaaaaaaaa
老师写代码
cccccccccccccccc*/


http://www.dtcms.com/a/351032.html

相关文章:

  • Redis-数据类型与常用命令
  • Java数据结构——9.排序
  • 【OpenAI】ChatGPT-4o 全能AI-omni的详细介绍+API KET的使用教程!
  • Stream API 新玩法:从 teeing()到 mapMulti()
  • 多种“找不到vcruntime140.dll,无法继续执行代码”提示的解决方法:从原理到实操,轻松修复系统故障
  • 【Delphi】中通过索引动态定位并创建对应窗体类实例
  • CMake构建学习笔记20-iconv库的构建
  • MATLAB在生态环境数据处理与分析中的应用,生态系统模型构建与数值模拟等
  • 简述滚珠丝杆升降机的结构和原理
  • CSS 结构伪类选择器
  • 【BUG排查】调试瑞萨RH850F1KMS1时候随机出现进入到unused_isr
  • 一款基于 .NET 开源、功能强大的 Windows 搜索工具
  • GD32VW553-IOT开发板测评 搭建环境到电灯(QA分享)
  • 使用提供的 YAML 文件在 Conda 中创建环境
  • Conda的配置
  • 实时平台Flink热更新技术——实现不停机升级!
  • Caddy + CoreDNS 深度解析:从功能架构到性能优化实践(上)
  • webrtc音频QOS方法一.1(NetEQ之音频网络延时DelayManager计算补充)
  • 设计模式学习笔记-----抽象策略模式
  • 【Ansible】Ansible部署K8s集群--准备环境--配置网络
  • 主流的 AI Agent 开发框架
  • 论文阅读(四)| 软件运行时配置研究综述
  • 游戏玩家批量多开挂机如何选择:云手机还是模拟器
  • LabVIEW 场效应晶体管仿真实验平台
  • 工业自动化系统架构-(多动子磁悬浮生产流水线 规划调度执行与协调)
  • 从下载到运行:MySQL 详细安装配置完整教程
  • 【Vue3】Cesium实现卫星及无人机轨迹跟踪
  • 大模型入门实战 | 基于 YOLO 数据集微调 Qwen2.5-VL-3B-Instruct 的目标检测任务
  • 数字IC前端设计——DC综合篇(生成filelist.f)
  • ADB 安装教程:如何在 Windows、 Linux 上安装 Android Debug Bridge