Java基本数据类型、抽象类和接口、枚举、时间类、String类全面介绍

news2025/6/4 4:22:10

JAVA基本数据类型知识总结

基本数据类型(Primitive Types)

类型占用字节默认值范围示例
byte10-128 ~ 127byte a = 100;
short20-32,768 ~ 32,767short b = 2000;
int40-2³¹ ~ 2³¹-1int c = 100000;
long80L-2⁶³ ~ 2⁶³-1long d = 10000000000L;
float40.0f~7位小数float e = 3.14f;
double80.0~15位小数double f = 3.1415926;
char2'\u0000'0 ~ 65535char g = 'A';
boolean1bit(实际依赖JVM)falsetrue / falseboolean h = true;

引用数据类型(Reference Types)

  • 类(Class)

  • 接口(Interface)

  • 数组(Array)

  • 枚举(Enum)

  • 字符串(String)

数据类型之间的转换

自动类型转换(隐式转换)

小范围 → 大范围(安全)

Java 会自动完成的转换:

byte → short → int → long → float → double
      char  ↗

示例:

int a = 10;
long b = a; // int自动转为long
double c = b; // long自动转为double

强制类型转换(显式转换)

大范围 → 小范围(可能丢失精度或溢出)

语法:目标类型 变量名 = (目标类型) 原始值;

示例:

double d = 3.14;
int i = (int) d; // 强制类型转换,结果为3(小数部分丢失)
​
long l = 10000000000L;
int i2 = (int) l; // 强制转换,有可能溢出

代码展示:

package com.hyh;
​
​
/*
 * 基本数据类型转换
 */
public class BaseData {
    private final static  int a = 10; // 整型 4个字节
    private final static  long b = 100L; // 长整型 8个字节
    private final static  short c = 5; // 短整型 2个字节
    private final static  byte d = 1; // 字节型 1个字节
    private final static  char e = 'A'; // 字符型 2个字节
    private final static  boolean f = true; // 布尔型 1个字节(Java中布尔类型的大小并不固定,通常为1字节,但在实际内存中可能会有不同的实现方式)
    private final static  float g = 30.5f; // 单精度浮点型 4个字节
    private final static  double h = 20.5; // 双精度浮点型 8个字节
​
    public static void main(String[] args) {
        //隐示转换 小范围 -> 大范围 byte → short → int → long → float → double
        long x = a;
        //显示转换 强制类型转换
        int y = (int) b; // long 转 int
        //包装数据类型转换 除了包装数据类型以外 其它类型不能直接转换 需借助包装类的构造方法或静态方法
        Integer intValue = 100; // int 转 Integer
        int z = intValue; // Integer 转 int
​
        //使用引用类型的方法进行转换
        String str = String.valueOf(a); // int 转 String
        int num = Integer.parseInt(str); // String 转 int
        // 输出结果
        System.out.println("隐式转换后的值: " + x);
        System.out.println("显示转换后的值: " + y);
        System.out.println("包装类型转换后的值: " + intValue);
        System.out.println("转换后的字符串: " + str);
        System.out.println("从字符串转换回整数: " + num);
        // 输出基本数据类型的值
        System.out.println("整型 a: " + a);
        System.out.println("长整型 b: " + b);
        System.out.println("短整型 c: " + c);
        System.out.println("字节型 d: " + d);
        System.out.println("字符型 e: " + e);
        System.out.println("布尔型 f: " + f);
        System.out.println("单精度浮点型 g: " + g);
        System.out.println("双精度浮点型 h: " + h);
    }
}

抽象类和接口

抽象类的定义

抽象类是使用 abstract 关键字修饰的类,用于被继承,不能被实例化,通常作为父类使用

特点:

不能创建抽象类的对象

可以包含:抽象方法 + 普通方法 + 构造方法 + 成员变量

必须由子类继承并实现其全部抽象方法,否则子类也必须是抽象类

接口的定义

接口是一种特殊的类,用于定义一组“规范”或“能力”,使用 interface 关键字定义。

  • 接口中默认所有方法是 public abstract(可省略)

  • 不能包含构造方法

  • 从 Java 8 开始,可以包含:

    • 默认方法(default)

    • 静态方法(static)

  • 从 Java 9 开始,可以有 私有方法(private)

抽象类和接口的区别

抽象类 vs 接口的语法规则对比

特性抽象类接口
关键字abstract classinterface
是否可以有抽象方法
是否可以有普通方法✅(Java 8 开始用 default
是否可以有构造函数
是否可以有成员变量✅(可以任意类型)✅(只能是 public static final 常量)
多继承支持❌(单继承)✅(多实现)
是否可以被实例化
修饰符类用 abstract,方法可加 public/protected接口默认 public,方法默认 public abstract

代码

/*
 * 抽象类
 */
public abstract class Animal {
    //抽象方法
    public abstract void run();
​
    //普通方法 可以存在普通方法
    public void speak(){};
​
    //构造方法
    public Animal(){};
​
    //静态成员变量
    public static Integer a = 10;
}
​
 
/*
 * 接口 多实现
 */
public interface Flyable {
    //成员变量
    public static int a = 10;
​
    //抽象方法 默认含有 public和abstract修饰符
    void run();
​
    //普通方法 含有方法体
    default void speak(){};
​
    //静态方法
    static void fly() {
        System.out.println("Flying...");
    }
}
​

JAVA常用时间类

旧版时间类(java.utiljava.text 包)

这些类在 Java 8 之前使用广泛,但存在线程不安全、设计混乱的问题。

类名说明
java.util.Date表示某一个时间点(不包含时区)
java.util.Calendar更加灵活的日期时间类(可对年月日等操作)
java.text.SimpleDateFormat用于格式化和解析日期字符串
System.currentTimeMillis()返回当前时间戳(毫秒值)
//JAVA 8之前
Date date = new Date();
System.out.println("当前时间(JAVA 8之前): " +
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String format = sdf.format(date);
System.out.println("格式化后的时间(JAVA 8之前): " + f
// 当前时间戳
long timeMillis = System.currentTimeMillis();
System.out.println("当前时间戳(毫秒): " + timeM
//时间戳转换为日期
Date dateFromMillis = new Date(timeMillis);
System.out.println("时间戳转换为日期(JAVA 8之前): " + sdf.format(dateFromMillis));

Java 8 新时间 API(推荐,java.time 包)

Java 8 引入了全新的时间 API,灵感来自 Joda-Time,属于现代化设计,线程安全且易用。

类名说明
LocalDate表示日期(年-月-日),无时间
LocalTime表示时间(时:分:秒),无日期
LocalDateTime表示日期+时间,无时区
ZonedDateTime日期时间 + 时区
Instant时间戳,代表某个瞬时点
Period用于计算日期间隔(年月日)
Duration用于计算时间间隔(时分秒)
DateTimeFormatter用于格式化/解析日期时间
ChronoUnit提供通用单位,如 DAYSMONTHS
//JAVA 8之后
LocalDate localDate = LocalDate.now();//只有日期
LocalTime localTime = LocalTime.now();//只有时间
LocalDateTime localDateTime = LocalDateTime.now();//日期+时间
Instant instant = Instant.now();
System.out.println("当前日期(JAVA 8之后)localDate: " + localDate);
System.out.println("当前时间(JAVA 8之后)localTime: " + localTime);
System.out.println("当前日期时间(JAVA 8之后)localDateTime: " + localDateTime);
System.out.println("当前时间戳(JAVA 8之后)instant: " + in
//格式化时间
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String formattedDateTime = localDateTime.format(dtf);
System.out.println("格式化后的时间(JAVA 8之后) DateTimeFormatter: " + formattedDat
//日期加减
LocalDate localDate1 = LocalDate.now().plusDays(1);// 加一天
LocalDate localDate2 = LocalDate.now().minusDays(1); // 减一天
System.out.println("加一天后的日期(JAVA 8之后): " + localDate1);
System.out.println("减一天后的日期(JAVA 8之后): " + localDate2);

场景推荐

场景建议类
获取当前日期LocalDate.now()
获取当前时间LocalTime.now()
获取当前时间戳Instant.now()System.currentTimeMillis()
时间加减LocalDateTime.plusX()
时间间隔Period(日/月/年)、Duration(时/分/秒)
格式化/解析DateTimeFormatter
与数据库交互java.sql.Timestamp ← 可用 LocalDateTime 替代

String常用类

在 Java 中,String 是最常用也是最重要的类之一,它属于 java.lang 包,不需要手动导入。String 提供了大量用于字符串操作的方法,是开发中处理文本的核心工具。

String 的基本特性

特性说明
不可变性一旦创建,内容不可更改(底层使用 final char[] 实现)
final 类不能被继承
常量池优化字符串字面量存在字符串常量池中,节省内存
支持重载的操作符如:+ 用于拼接字符串
实现了 Serializable、Comparable、CharSequence 接口支持序列化、比较和字符访问等功能

String 的常用构造方法

//字符串的创建
String s1 = "hello";                // 直接字面量(推荐,进入字符串常量池)
String s2 = new String("hello");    // 创建新对象(堆中新的 String 实例)
char[] chars = {'h', 'e', 'l', 'l', 'o'};
String s3 = new String(chars);      // 通过字符数组构造
byte[] bytes = {97, 98, 99};        //Ascii码对应的字节数组
String s4 = new String(bytes);      // 通过字节数组构造

创建方式对比

创建方式示例存储位置是否放入常量池是否新建对象对象可重用性比较方式 == 是否为 true
字面量创建String s1 = "hello";字符串常量池✅ 是❌ 否(已存在则重用)✅ 高✅ 如果常量池中已有
new 关键字创建String s2 = new String("hello");堆内存 + 常量池✅ 是(底层还是会引用常量池中的字符数组)✅ 是(总是新建堆对象)❌ 与字面量对象比较为 false
char数组构造String s3 = new String(new char[]{'h','e','l','l','o'});堆内存❌ 否✅ 是
byte数组构造String s4 = new String(new byte[]{97,98});堆内存❌ 否✅ 是
intern 方法String s5 = s2.intern();常量池✅ 是❌ 复用常量池中的对象✅ 若常量池中已有相同字面量

String 常用方法分类详解

🔎 基本判断类

方法示例说明
isEmpty()"".isEmpty()长度为0则返回true
isBlank()" ".isBlank()Java 11+,判断空格或空字符串
equals(String)str.equals("abc")判断内容是否相同
equalsIgnoreCase(String)忽略大小写比较
boolean empty = s1.isEmpty();
boolean equals = s1.equals(s2);// 比较内容是否相同
boolean equalsIgnoreCase = s1.equalsIgnoreCase(s2);
System.out.println("字符串s1是否为空: " + empty);
System.out.println("字符串s1和s2内容是否相同: " + equals);
System.out.println("字符串s1和s2内容是否相同(忽略大小写): " + equalsIgnoreCase);

📐 获取信息类

方法示例说明
length()str.length()返回字符串长度
charAt(int)str.charAt(0)获取指定索引的字符
indexOf(String)str.indexOf("a")获取第一次出现的下标
lastIndexOf(String)最后一次出现的下标
//获取信息方法
int length = s1.length();
char c = s1.charAt(0);// 获取第一个字符
int i = s1.indexOf("l");// 获取字符 'l' 的索引位置
int i1 = s1.lastIndexOf("l");// 获取字符 'l' 的最后一个索引位置
System.out.println("字符串s1的长度: " + length);
System.out.println("字符串s1的第一个字符: " + c);
System.out.println("字符 'l' 在字符串s1中的第一次出现位置: " + i);
System.out.println("字符 'l' 在字符串s1中的最后一次出现位置: " + i1);

✂️ 字符串截取与分割

方法示例说明
substring(begin)str.substring(5)截取从指定位置到末尾
substring(begin, end)str.substring(0, 5)左闭右开区间
split(String)str.split(",")根据正则表达式拆分成数组
 //字符串的切割
 String substring = s1.substring(2);// 从索引2开始到末尾
 String substring1 = s1.substring(1, 3); // 从索引1到索引3(不包括3)
 String[] ls = s1.split("l");// 按照字符 'l' 切割字符串
 System.out.println("字符串s1从索引2开始的子字符串: " + substring);
 System.out.println("字符串s1从索引1到索引3的子字符串: " + substring1);
 System.out.println("字符串s1按照字符 'l' 切割后的结果: " + ls.length);

⚠️ 注意:split("\\|") 要转义 |,它在正则中是特殊字符。


🔁 字符串替换与匹配

方法示例说明
replace(old, new)"a-b".replace("-", ":")替换字符或字符串
replaceAll(regex, new)正则替换
matches(regex)"123".matches("\\d+")是否匹配正则表达式
contains(String)str.contains("abc")是否包含子串
//字符串的替换与匹配
 String replace = s1.replace("l", "x");// 替换所有 'l' 为 'x'
 boolean he = s1.contains("he");// 检查字符串是否包含 "he"
 boolean startsWith = s1.startsWith("he");// 检查字符串是否以 "he" 开头
 boolean endsWith = s1.endsWith("lo");// 检查字符串是否以 "lo" 结尾
 System.out.println("字符串s1替换 'l' 为 'x': " + replace);
 System.out.println("字符串s1是否包含 'he': " + he);
 System.out.println("字符串s1是否以 'he' 开头: " + startsWith);
 System.out.println("字符串s1是否以 'lo' 结尾: " + endsWith);

🎨 大小写、去空格等

方法示例说明
toUpperCase()转大写
toLowerCase()转小写
trim()去除首尾空格
strip()Java 11+,支持 Unicode 空白字符的去除
repeat(n)Java 11+,重复字符串
//大小写 转空格
 String upperCase = s1.toUpperCase();// 转为大写
 String lowerCase = upperCase.toLowerCase();// 转为小写
 String trim = s1.trim(); // 去除首尾空格
 System.out.println("字符串s1转为大写: " + upperCase);
 System.out.println("字符串s1转为小写: " + lowerCase);
 System.out.println("字符串s1去除首尾空格: " + trim);

StringBuilder 与 StringBuffer

类名可变?线程安全?速度
String不可变安全慢(频繁拼接时效率低)
StringBuilder可变❌ 不安全快(推荐单线程使用)
StringBuffer可变✅ 安全稍慢(适用于多线程)

建议:频繁拼接字符串用 StringBuilder,例如拼接10000个字符串。

 StringBuffer sbf = new StringBuffer(s1);
 StringBuffer appendSbf = sbf.append("world!");
​
 System.out.println("StringBuilder追加字符串: " + appendSbd);
 System.out.println("StringBuffer追加字符串: " + appendSbf);

枚举类型

枚举的定义

枚举(enum)是 Java 中一种特殊的类,用于表示一组固定的常量值。它是一种类型安全的替代方案,通常用于代替 public static final 常量。

基本语法

public enum Day {
    MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;
}

枚举的特点

特性描述
类型安全不能传入无效值(编译时检查)
可用于 switch简化代码逻辑
本质是类枚举继承 java.lang.Enum
可定义构造方法、字段、方法和普通类一样扩展能力
默认 public static final所有枚举值都是常量对象
不可继承其他类因为已继承自 Enum

枚举属性和构造方法

/*
 * 用户状态枚举
 */
public enum UserStatus {
    ACTIVE("Active", "1"),
    INACTIVE("Inactive", "2"),
    DELETED("Deleted", "3"),
    SUSPENDED("Suspended", "4");
    // 构造方法
    UserStatus(String status, String code) {
        this.status = status;
        this.code = code;
    }
    // 获取状态
    public String getStatus() {
        return status;
    }
    public String getCode() {
        return code;
    }
    private final String status;
    private final String code;
}
​
/*
 * 枚举类型 星期
 */
public enum DayEnum {
    MONDAY,
    TUESDAY,
    WEDNESDAY,
    THURSDAY,
    FRIDAY,
    SATURDAY,
    SUNDAY;
}
​
import com.hyh.enums.UserStatus;
​
import static com.hyh.enums.DayEnum.*;
​
public class EnumTest {
    public static void main(String[] args) {
        //简单枚举打印
        System.out.println("枚举类型的星期: "+ FRIDAY+ " "+ " "+THURSDAY+" "+" "+WEDNESDAY +
               " " +" "+ TUESDAY+" "+" "+MONDAY+" "+" "+SUNDAY+" "+" "+SATURDAY);
        userStatusTest();
    }
    //用户状态枚举使用
    public static  void userStatusTest() {
        System.out.println("用户状态: " + UserStatus.ACTIVE.getStatus() + ", 代码: " + UserStatus.ACTIVE.getCode());
    }
}

枚举和常量类的区别

特性枚举static final 常量
类型安全❌(可能误传)
switch 支持
可扩展字段
面向对象
表达意义清晰相对不清晰

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2395844.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring Boot微服务架构(八):开发之初就引入APM工具监控

使用 APM(Application Performance Management)工具监控 Spring Boot 应用,可以帮助开发者实时追踪性能瓶颈、分析调用链路、监控资源使用情况,并快速定位故障。以下是详细的步骤和常用工具的选择指南: ​​一、常用 A…

大规模真实场景 WiFi 感知基准数据集

一段话总结 本文提出CSI-Bench,首个大规模真实场景WiFi感知基准数据集,覆盖26个室内环境、35名用户、16种商用设备,包含461小时有效数据,支持跌倒检测、呼吸监测、定位、运动源识别等单任务及用户身份、活动、 proximity联合标注的多任务学习。通过标准化评估协议和基线模…

Python实现HPSO-TVAC优化算法优化支持向量机SVC分类模型项目实战

说明:这是一个机器学习实战项目(附带数据代码文档),如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在当今数据驱动的时代,支持向量机(SVM)作为一种经典的机器学习算法,…

ck-editor5的研究 (3):初步使用 CKEditor5 的事件系统和API

前言 在上一篇文章中—— ck-editor5的研究(2):对 CKEditor5 进行设计,并封装成一个可用的 vue 组件 ,我已经把 CKEditor5 封装成了一个通用vue组件,并且成功在nuxt中运行,并具备一定的通用性&…

WPS快速排版

论文包括(按顺序):封面(含题目)、摘 要、关键词、Abstract(英文摘要)、Keywords、目录、正文、参考文献、在读期间发表的学术论文及研究成果,致 谢 题目(黑小一加粗&…

Java实现命令行图书管理系统(附完整源码)

一、项目概述 本文将介绍如何使用Java实现一个基于命令行的图书管理系统。系统支持管理员和普通用户两种角色,提供图书的增删改查、借阅归还等功能。项目采用面向对象设计原则,代码结构清晰,适合Java初学者学习。 二、系统功能架构 graph T…

【数据结构】顺序表和链表详解(上)

前言:上期我们介绍了算法的复杂度,知道的算法的重要性同时也了解到了评判一个算法的好与坏就去看他的复杂度(主要看时间复杂度),这一期我们就从顺序表和链表开始讲起。 文章目录 一,顺序表1,线性表2,顺序表…

唯创WT2606B TFT显示灵动方案,重构电子锁人机互动界面,赋能智能门锁全场景交互!

在智能家居的浪潮中,门锁搭载显示屏已成为行业创新的焦点。据行业数据显示,2023年全球智能门锁出货量中,搭载显示屏的型号占比已突破40%,且年复合增长率达25%。而2024年国内智能门锁销量突破2200万套,预计2025年市场规…

智能穿戴新标杆:SD NAND (贴片式SD卡)与 SOC 如何定义 AI 眼镜未来技术路径

目录 一、SD NAND:智能眼镜的“记忆中枢”突破空间限制的存储革命性能与可靠性的双重保障 二、SOC芯片:AI眼镜的“智慧大脑”从性能到能效的全面跃升多模态交互的底层支撑 三、SD NANDSOC:11>2的协同效应数据流水线的高效协同端侧…

node_modules包下载不下来

如果项目里面的package-lock.json有resolved ,就指向了包的下载来源,如果这个网址挂了,那npm i 就会一直卡着。而且,在终端去修改 npm的镜像是没有用的 解决办法是:把项目里面的 lock文件 .npmrc都删了 然后重新下载就可以了

yolo个人深入理解

卷积层的理解,通过云端服务器训练模型,模型构建的重要性,针对极低像素的处理,模型训练召回率提高技巧,卷积层2,4,8,16,32的小模型与大模型的理解 一.关于backbone,neck,head深入理解 1,backbone的主要组成部分是sppf和conv,这是backbone的核心,其中yolov5和yolov8…

从0开始学vue:Element Plus详解

一、核心架构解析二、技术实现指南三、高级特性实现四、性能优化方案五、生态扩展方案六、调试与测试七、版本演进路线 Element Plus 是专为 Vue 3 设计的桌面端 UI 组件库,基于 Vue 3 的 Composition API 重构,在保持与 Element UI 兼容性的同时&#x…

互联网向左,区块链向右

2008年,中本聪首次提出了比特币的设想,这打开了去中心化的大门。 比特币白皮书清晰的描述了去中心化支付的解决方案,并分别从以下几个方面阐述了他的理念: 一、由转账双方点对点的通讯,而不通过中心化的第三方&#xf…

Python6.1打卡(day33)

DAY 33 MLP神经网络的训练 知识点回顾: 1.PyTorch和cuda的安装 2.查看显卡信息的命令行命令(cmd中使用) 3.cuda的检查 4.简单神经网络的流程 1.数据预处理(归一化、转换成张量) 2.模型的定义 …

论文阅读笔记——Quo Vadis, Action Recognition? A New Model and the Kinetics Dataset

I3D 论文 UCF-101(13000多个视频)和 HMDB-51(7000多个视频)数据集过小,提出了 Kinetics 数据集,并且在其之上预训练之后能够迁移到其他小的数据集。 2DLSTM:使用2D CNN的好处是可以直接从 Ima…

vscode编辑器怎么使用提高开发uVision 项目的效率,如何编译Keil MDK项目?

用vscode编译uVision 项目只需要安装一个Keil Assistant插件,即可用vscode开发“keil 项目”。极大提高开发速度! 1.安装Keil Assistant插件 安装插件成功之后,应该会让安装一个东西,点击安装即可 2.配置安装包路径 3.打开 uVi…

AR测量工具:精准测量,多功能集成

在日常生活中,我们常常会遇到需要测量物体长度、距离或角度的情况。无论是装修房屋、制作家具,还是进行户外活动,一个精准的测量工具都能大大提高我们的工作效率。AR测量工具就是这样一款集多种功能于一体的实用测量软件,它利用增…

【Go-补充】Sync包

并发编程-Sync包 sync.WaitGroup 在代码中生硬的使用time.Sleep肯定是不合适的,Go语言中可以使用sync.WaitGroup来实现并发任务的同步。 sync.WaitGroup有以下几个方法: 方法名功能(wg * WaitGroup) Add(delta int)计数器delta(wg *WaitGroup) Done()…

设备驱动与文件系统:01 I/O与显示器

操作系统设备驱动学习之旅——以显示器驱动为例 从这一节开始,我要学习操作系统的第四个部分,就是i o设备的驱动。今天要讲的是第26讲,内容围绕i o设备中的显示器展开,探究显示器是如何被驱动的,也就是操作系统怎样让…

智慧充电桩数字化管理平台:环境监测与动态数据可视化技术有哪些作用?

随着新能源汽车的普及,智慧充电桩作为基础设施的重要组成部分,正逐步向数字化、智能化方向发展。环境监测与动态数据可视化技术的应用,为充电桩的高效管理和运维提供了全新解决方案。通过实时采集环境参数与运行数据,并结合可视化…