@Transactional: 用于声明事务,可以应用于类或方法上。若应用于类,则类中所有方法均受事务管理;若应用于方法,则仅该方法受事务管理。value: 指定事务管理器的bean名称。transactionManager: 指定事务管理器。timeout: 设置事务超时时间。readOnly: 指定事务是否为只读。rollbackFor: 指定遇到指定异常时回滚事务。noRollbackFor: 指定遇到指定异常时不回滚事务。@Aspect: 定义一个切面。@Pointcut: 定义切点,用于指定哪些方法可以被通知。@Before: 在方法执行前执行通知。@After: 不论方法执行是否成功,都在方法执行后执行通知。@AfterReturning: 在方法成功执行后执行通知。@AfterThrowing: 在方法抛出异常后执行通知。@Around: 在方法执行前后执行通知,可以控制方法的执行。@Order: 指定切面的执行顺序。@EnableAspectJAutoProxy: 启用AspectJ自动代理,使切面生效。继承:允许子类复用父类的代码,并可以扩展或重写父类的方法。
接口:定义了一组方法,实现接口的类必须提供这些方法的具体实现。
多线程:允许程序同时执行多个任务,可以通过继承 Thread 类或实现 Runnable 接口来创建线程。
正则表达式是一种用于匹配和处理文本的强大工具。它可以用于验证输入、提取信息、替换文本等操作。
索引:用于提高数据库查询性能的一种数据结构。可以加速数据检索,减少磁盘 I/O。
三范式:数据库设计的基本原则,包括第一范式(确保每列都是原子性的)、第二范式(确保表中的每个非主属性完全依赖于主键)和第三范式(确保表中的每个非主属性不依赖于其他非主属性)。
Gbase:一种关系型数据库管理系统,具有高性能、高可用性和可扩展性。
大数据:指处理和分析大规模数据的技术和方法。大数据技术包括分布式计算、数据存储和分析等。
基础命令:包括文件和目录操作、进程管理、网络配置等。
vim操作:是一个强大的文本编辑器,用于编辑文本文件。
权限:Linux系统中的文件和目录权限控制,包括所有者、组和其他用户的读、写和执行权限。
要解决这个问题,我们可以通过遍历数组中的所有可能的三元组,计算它们的和,并找到其中的最大值。由于数组的长度可能很大,我们需要确保算法的效率。
暴力法:直接遍历所有可能的三元组,计算它们的和,并记录最大值。这种方法的时间复杂度为 O(n^3),适用于小规模数据。
排序法:先对数组进行排序,然后固定一个数,使用双指针法找到另外两个数,使得三数之和最大。这种方法的时间复杂度为 O(n^2),适用于大规模数据。
1 | public class MaxThreeSum { |
1 | import java.util.Arrays; |
暴力法:通过三重循环遍历所有可能的三元组,计算它们的和,并记录最大值。这种方法简单直接,但时间复杂度较高。
排序法:先对数组进行排序,然后直接取最后三个数相加,因为它们是数组中最大的三个数。这种方法的时间复杂度主要由排序决定,为 O(n log n),比暴力法更高效。
1 | public static void main(String[] args) { |
如果数组长度较小(例如小于 100),可以使用暴力法。
如果数组长度较大,建议使用排序法,因为它更高效。
文件和目录操作:
ls:列出目录中的文件和子目录。cd:改变当前工作目录。mkdir:创建新目录。rm:删除文件或目录。cp:复制文件或目录。mv:移动或重命名文件或目录。文件内容操作:
cat:显示文件内容。head:显示文件开头的内容。tail:显示文件结尾的内容。grep:在文件中搜索文本。sed:对文件进行编辑。进程管理:
ps:列出当前正在运行的进程。kill:终止进程。top:显示实时进程状态。bg:将后台进程置于前台运行。fg:将后台进程置于前台运行。网络配置:
ifconfig:显示网络接口信息。ping:测试网络连接。netstat:显示网络连接、路由表和网络接口状态。ssh:远程登录到另一台计算机。用户和权限:
whoami:显示当前用户。su:切换用户。chmod:更改文件或目录的权限。chown:更改文件或目录的所有者。系统信息:
uname:显示系统信息。uptime:显示free:显示系统内存使用情况。df:显示磁盘空间使用情况。文件压缩和解压:
tar:创建、提取和压缩文件。gzip:压缩文件。gunzip:解压缩文件。文件搜索:
find:在文件系统中搜索文件。locate:快速查找文件。系统管理:
reboot:重启系统。shutdown:关闭系统。系统日志:
dmesg:显示系统启动信息。journalctl:显示系统日志。磁盘管理:
fdisk:管理磁盘分区。mkfs:格式化磁盘分区。mount:挂载文件系统。服务管理:
systemctl:管理系统服务。service:管理系统服务(旧版)。包管理:
apt:Ubuntu 和 Debian 系统的包管理工具。yum:Red Hat 和 CentOS 系统的包管理工具。系统更新:
apt-get update:更新软件包列表。apt-get upgrade:升级已安装的软件包。yum update:更新软件包列表。yum upgrade:升级已安装的软件包。系统监控:
top:显示实时进程状态。htop:交互式进程查看器。vmstat:显示虚拟内存统计信息。iostat:显示磁盘 I/O 统计信息。系统优化:
sysctl:调整系统内核参数。tune2fs:调整文件系统参数。sysbench:性能测试工具。系统安全:
firewall-cmd:管理防火墙。iptables:管理防火墙规则。auditd:系统审计。Spring 和 Spring Boot 提供了大量的注解来简化开发,以下是一些常见的注解及其用途:
@Component
@Service
@Repository
@Controller
@Autowired
@Qualifier
@Configuration
@Bean 注解一起使用。@Bean
@Value
@Scope
singleton、prototype 等。@PostConstruct
@PreDestroy
@RequestMapping
@RequestParam
@PathVariable
@ResponseBody
@RequestBody
@Transactional
@SpringBootApplication
@Configuration、@EnableAutoConfiguration 和 @ComponentScan 的组合。@EnableAutoConfiguration
@ComponentScan
@RestController
@Controller 和 @ResponseBody 的组合。@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@ConfigurationProperties
@ConditionalOnProperty
@ConditionalOnMissingBean
@ConditionalOnClass
@ConditionalOnMissingClass
@EnableConfigurationProperties
@ConfigurationProperties 注解的功能。@EnableScheduling
@Scheduled
@Async
@EnableCaching
@Cacheable
@CacheEvict
@CachePut
@EnableWebSecurity
@EnableGlobalMethodSecurity
@PreAuthorize
@PostAuthorize
@EnableJpaRepositories
@Entity
@Table
@Id
@GeneratedValue
@Column
@Query
@EnableTransactionManagement
@EnableAspectJAutoProxy
@Aspect
@Pointcut
@Before
@After
@Around
@AfterReturning
@AfterThrowing
@EnableDiscoveryClient
@EnableFeignClients
@EnableCircuitBreaker
@HystrixCommand
@EnableZuulProxy
@EnableConfigServer
@EnableEurekaServer
@EnableHystrixDashboard
@EnableTurbine
这些注解可以帮助开发者更高效地构建 Spring 和 Spring Boot 应用。
重写(Override) 和 重载(Overload) 是 Java 中两个重要的概念,它们都与方法有关,但用途和行为完全不同。
重写是指子类重新定义父类中已有的方法,以满足子类的特定需求。重写的方法必须与父类方法具有相同的 方法签名(方法名、参数列表和返回类型)。
发生在继承关系中:子类重写父类的方法。
方法签名必须一致:方法名、参数列表和返回类型必须相同。
访问权限不能更严格:子类方法的访问权限不能比父类方法更严格(例如,父类方法是 protected,子类方法可以是 public,但不能是 private)。
异常不能更宽泛:子类方法抛出的异常不能比父类方法抛出的异常更宽泛。
使用 @Override 注解:建议在重写方法上添加 @Override 注解,以便编译器检查是否正确重写。
1 | class Animal { |
重载是指在同一个类中定义多个方法,它们具有相同的名字但不同的参数列表(参数类型、参数数量或参数顺序不同)。重载的方法可以根据传入的参数自动调用合适的方法。
发生在同一个类中:方法名相同,但参数列表不同。
返回值类型可以不同:重载不关心返回值类型,只关心参数列表。
访问权限可以不同:重载方法的访问权限可以不同。
与继承无关:重载不涉及继承关系。
1 | class Calculator { |
| 特性 | 重写(Override) | 重载(Overload) |
|---|---|---|
| 定义位置 | 子类重写父类的方法 | 同一个类中定义多个同名方法 |
| 方法签名 | 必须相同(方法名、参数列表、返回类型) | 必须不同(参数列表不同) |
| 访问权限 | 不能比父类方法更严格 | 可以不同 |
| 返回值类型 | 必须相同 | 可以不同 |
| 异常 | 不能抛出更宽泛的异常 | 可以不同 |
| 作用 | 实现多态,子类定制父类行为 | 提供方法的多版本,适应不同的参数需求 |
重写 用于子类重新定义父类方法,实现多态。
重载 用于在同一个类中提供多个方法版本,适应不同的参数需求。
两者都是 Java 中实现代码复用和灵活性的重要机制。
接口(Interface) 和 抽象类(Abstract Class) 是 Java 中两种重要的抽象机制,它们都可以用来定义规范和约束子类的行为,但它们在设计目的和使用场景上有显著的区别。
接口是一种完全抽象的类,用于定义一组方法规范,但不提供具体的实现。接口的核心目的是定义 “能做什么”,而不是 “怎么做”。
方法默认是抽象的:接口中的方法默认是 public abstract 的(Java 8 之前)。
不能包含具体实现:Java 8 之前,接口中的方法不能有方法体;Java 8 之后,可以使用 default 方法提供默认实现。
支持多继承:一个类可以实现多个接口。
字段默认是常量:接口中的字段默认是 public static final 的(即常量)。
用于定义行为规范:接口通常用于定义一组相关的行为规范,例如 Runnable、Comparable 等。
1 | interface Animal { |
抽象类是一种介于普通类和接口之间的类,它可以包含抽象方法(没有方法体)和具体方法(有方法体)。抽象类的核心目的是定义 “是什么” 和 “能做什么”。
可以包含抽象方法和具体方法:抽象类可以定义抽象方法(子类必须实现),也可以定义具体方法(子类可以直接继承)。
不能实例化:抽象类不能直接创建对象,必须通过子类实例化。
单继承:一个类只能继承一个抽象类。
可以包含字段和构造方法:抽象类可以定义字段和构造方法,用于初始化状态。
用于定义通用逻辑:抽象类通常用于定义一些通用的逻辑,供子类复用。
1 | abstract class Animal { |
| 特性 | 接口(Interface) | 抽象类(Abstract Class) |
|---|---|---|
| 方法实现 | Java 8 之前只能有抽象方法;Java 8 之后可以有默认方法和静态方法 | 可以包含抽象方法和具体方法 |
| 字段 | 只能是常量(public static final) |
可以是普通字段 |
| 构造方法 | 不能有构造方法 | 可以有构造方法 |
| 继承 | 支持多继承(一个类可以实现多个接口) | 单继承(一个类只能继承一个抽象类) |
| 设计目的 | 定义行为规范(“能做什么”) | 定义通用逻辑和部分实现(“是什么”和“能做什么”) |
| 实例化 | 不能实例化 | 不能实例化 |
| 适用场景 | 定义一组行为规范,例如 Runnable、Comparable |
定义通用逻辑,例如模板方法模式 |
使用接口的场景:
使用抽象类的场景:
接口 更注重行为规范,适合定义“能做什么”。
抽象类 更注重通用逻辑,适合定义“是什么”和“能做什么”。
在实际开发中,接口和抽象类可以结合使用,例如通过抽象类实现接口的部分方法,再由子类完成剩余的实现。
构造方法(Constructor) 是 Java 中用于创建和初始化对象的特殊方法。它的名称必须与类名完全相同,且没有返回值类型(连 void 也没有)。构造方法在对象创建时自动调用,用于初始化对象的状态(例如为字段赋值)。
名称与类名相同:
没有返回值类型:
void。自动调用:
new 关键字创建对象时,构造方法会自动调用。可以重载:
默认构造方法:
可以调用其他构造方法:
this() 可以在一个构造方法中调用同一个类的其他构造方法。不能被继承:
1 | public class ClassName { |
1 | public class Dog { |
1 | public class Dog { |
1 | public class Dog { |
this() 调用其他构造方法1 | public class Dog { |
初始化对象状态:
强制初始化:
代码复用:
this() 可以在构造方法中调用其他构造方法,避免重复代码。默认构造方法:
继承中的构造方法:
super())。私有构造方法:
private,则该类不能通过 new 关键字实例化。通常用于单例模式或工具类。构造方法是用于创建和初始化对象的特殊方法。
构造方法可以重载,支持多种初始化方式。
使用 this() 可以在构造方法中调用其他构造方法,实现代码复用。
构造方法在对象创建时自动调用,是初始化对象状态的关键机制。
在 Java 中,静态类(Static Class) 并不是一个独立的概念,但可以通过以下两种方式实现类似的功能:
静态内部类(Static Nested Class):
工具类(Utility Class):
下面分别详细介绍这两种方式。
静态内部类是定义在另一个类内部的静态类。它与外部类的实例无关,可以直接通过外部类名访问。
不依赖外部类实例:静态内部类不持有外部类的引用,因此可以直接创建。
可以直接访问外部类的静态成员:静态内部类可以访问外部类的静态字段和方法。
不能访问外部类的非静态成员:静态内部类不能直接访问外部类的实例字段和方法。
1 | public class OuterClass { |
工具类是一种常见的静态类实现方式。它通常包含一组静态方法和静态字段,用于提供通用的功能。工具类的构造方法通常是私有的,防止实例化。
构造方法私有化:防止工具类被实例化。
所有方法和字段都是静态的:工具类的方法和字段通常都是静态的,可以直接通过类名调用。
不可继承:工具类通常被声明为 final,防止被继承。
1 | public final class MathUtils { |
静态内部类的使用场景:
工具类的使用场景:
静态内部类与普通内部类的区别:
工具类的设计原则:
final,防止被继承。静态内部类:不依赖外部类实例,可以直接访问外部类的静态成员。
工具类:提供一组静态方法,构造方法私有化,防止实例化。
静态类和工具类是 Java 中实现代码复用和模块化的重要方式,适合用于封装通用功能。
在 Java 中,权限修饰符(Access Modifiers) 用于控制类、方法、字段和构造方法的访问权限。Java 提供了四种权限修饰符,分别是:
public:公开的,任何地方都可以访问。
protected:受保护的,同一包内或子类中可以访问。
default(包私有):默认的,同一包内可以访问。
private:私有的,只有本类中可以访问。
下面详细介绍这些权限修饰符的使用场景和规则。
public作用范围:任何地方都可以访问。
适用场景:
1 | public class Animal { |
protected作用范围:
适用场景:
1 | package com.example; |
default(包私有)作用范围:同一包内的类可以访问。
适用场景:
1 | package com.example; |
private作用范围:只有本类中可以访问。
适用场景:
1 | public class Animal { |
| 修饰符 | 类内部 | 同一包内 | 子类(不同包) | 其他包 |
|---|---|---|---|---|
public |
✔️ | ✔️ | ✔️ | ✔️ |
protected |
✔️ | ✔️ | ✔️ | ❌ |
default |
✔️ | ✔️ | ❌ | ❌ |
private |
✔️ | ❌ | ❌ | ❌ |
final 修饰符作用:用于修饰类、方法或字段,表示不可改变。
final 类:不能被继承。final 方法:不能被子类重写。final 字段:常量,值不能被修改。1 | public final class MathUtils { // final 类,不能被继承 |
static 修饰符作用:用于修饰类、方法或字段,表示与类相关,而不是与实例相关。
static 方法:可以直接通过类名调用。static 字段:类的所有实例共享同一个字段。static 内部类:不依赖外部类的实例。1 | public class Counter { |
abstract 修饰符作用:用于修饰类或方法,表示抽象。
abstract 类:不能实例化,只能被继承。abstract 方法:没有方法体,必须由子类实现。1 | public abstract class Animal { // 抽象类 |
权限修饰符:控制类、方法、字段和构造方法的访问权限。
final:表示不可改变。
static:表示与类相关,而不是与实例相关。
abstract:表示抽象,需要子类实现。
合理使用这些修饰符可以提高代码的安全性、可维护性和可扩展性。
见 8、spring与springboot注解
Java中的线程命令主要包括以下方法:
1 | start() |
这些方法用于创建、启动、控制和监控线程,以及管理线程的状态和属性。
其中,
start()方法用于启动线程,
run()方法包含线程的执行代码。
join()方法使当前线程等待另一个线程完成执行,
sleep()方法用于暂停当前线程的执行指定时间。
yield()方法则用于暂停当前线程,让其他线程有机会执行。
interrupt()方法用于中断线程的执行,而isInterrupted()方法用于检查线程是否被中断。
currentThread()方法返回当前执行的线程,getName()和setName(String name)方法用于获取和设置线程的名字。getPriority()和setPriority(int priority)方法用于获取和设置线程的优先级。
isDaemon()和setDaemon(boolean on)方法用于检查和设置线程是否为守护线程。
getId()方法返回线程的ID,isAlive()方法检查线程是否还在执行。
getStackTrace()方法获取线程的堆栈跟踪,holdsLock(Object obj)方法检查线程是否持有指定对象的监视器锁。
enumerate(Thread[] tarray)和activeCount()方法用于枚举和计数活动的线程,但它们已过时。
stop()、suspend()和resume()方法用于控制线程,但它们已废弃,不推荐使用。
LockSupport.park()和LockSupport.unpark(Thread thread)方法用于线程的阻塞和唤醒。
Java线程命令主要包括 start()、run()、join()、sleep()、yield()、interrupt()、isInterrupted()、currentThread()、getName()、setName(String name)、getPriority()、setPriority(int priority)、isDaemon()、setDaemon(boolean on)、getId()、isAlive()、getStackTrace()、holdsLock(Object obj),以及LockSupport类的park()和unpark(Thread thread)方法。
接口与抽象类是Java中实现抽象和多态的两种不同方式,它们在继承和实现方面有一些关键的区别。
定义:抽象类是用abstract关键字定义的类,它可以包含抽象方法(没有方法体的方法)和具体方法(有方法体的方法)。
继承:其他类可以通过extends关键字继承抽象类。如果一个类继承了抽象类,它必须实现抽象类中所有的抽象方法,除非它自己也是一个抽象类。
构造器:抽象类可以有构造器,子类在继承抽象类时必须调用父类的构造器。
实例化:抽象类不能被实例化,只能被继承。
单继承:Java中的类只能继承一个抽象类,因为Java不支持多继承。
定义:接口是用interface关键字定义的,它只包含抽象方法(默认是public abstract)和常量(默认是public static final)。
实现:类通过implements关键字实现接口。一个类可以实现多个接口。
方法体:接口中的方法默认是没有方法体的,但Java 8及以后版本允许接口中包含默认方法(default关键字)和静态方法(static关键字),这些方法有方法体。
构造器:接口不能有构造器。
实例化:接口不能被实例化,只能被实现。
多实现:一个类可以实现多个接口,从而实现多重继承的效果。
继承:一个类只能继承一个抽象类,继承关系表示“是一个”(is-a)的关系。
实现:一个类可以实现多个接口,实现关系表示“具有”(has-a)或“能够做”(can-do)的关系。
1 | // 抽象类示例 |
总结来说,抽象类和接口都是用于实现抽象和多态的工具,但它们在语法和使用场景上有一些重要的区别。抽象类更适合用于表示类的层次结构,而接口则更适合用于定义类的行为能力。
MySQL和Oracle是两种不同的关系型数据库管理系统(RDBMS),它们在架构、性能、可扩展性、成本和生态系统等方面都有所不同。以下是MySQL和Oracle的一些关键区别:
MySQL:MySQL是一个开源数据库,采用GNU通用公共许可证(GPL)发布。这意味着用户可以自由地使用、修改和分发MySQL软件。
Oracle:Oracle数据库是一个闭源商业数据库,用户需要购买许可证才能使用。Oracle提供了多种许可证选项,包括企业版、标准版和Express Edition等。
MySQL:MySQL以其高性能和可扩展性而闻名,特别适合Web应用和中小型应用。它支持多种存储引擎,如InnoDB和MyISAM,可以根据不同的需求选择合适的存储引擎。
Oracle:Oracle数据库以其强大的性能和可扩展性著称,能够处理非常大的数据集和高并发的事务处理。它在企业级应用中广泛使用,特别是在需要高可用性和复杂事务处理的环境中。
MySQL:由于MySQL是开源的,它的使用成本相对较低。除了软件本身免费外,还有大量的社区支持和第三方服务提供商。
Oracle:Oracle数据库的许可证费用较高,尤其是对于企业级用户。此外,还需要考虑硬件、支持和服务的成本。
MySQL:MySQL有一个活跃的社区,提供了大量的文档、教程和第三方工具。它也得到了许多开源项目和框架的支持。
Oracle:Oracle数据库拥有一个庞大的生态系统,包括各种工具、应用程序和专业服务。Oracle公司提供了全面的技术支持和咨询服务。
MySQL:MySQL提供了基本的关系型数据库功能,包括事务支持、存储过程、触发器等。它也支持JSON数据类型和全文搜索等功能。
Oracle:Oracle数据库提供了丰富的高级功能,包括复杂的查询优化、高级安全性、数据仓库、商务智能、云计算集成等。
MySQL:MySQL兼容多种操作系统,包括Linux、Windows、macOS等。它也支持多种编程语言和开发框架。
Oracle:Oracle数据库同样兼容多种操作系统,并且提供了广泛的编程语言和开发框架支持。
MySQL:由于其简单易用,MySQL的学习曲线相对较陡,适合初学者和小型项目。
Oracle:Oracle数据库功能强大,但也相对复杂,学习曲线较陡峭,适合有经验的数据库管理员和开发人员。
选择MySQL还是Oracle取决于具体的应用需求、预算、技术支持和生态系统等因素。对于许多Web应用和中小型企业,MySQL是一个经济实惠且功能强大的选择。而对于需要高级功能、高可用性和企业级支持的大型企业,Oracle数据库可能是更好的选择。
Java是一种静态类型的语言,它有八种基本数据类型,这些类型直接由Java虚拟机(JVM)支持。以下是Java的基本数据类型及其描述:
byte:8位有符号整数类型,范围从-128到127。
short:16位有符号整数类型,范围从-32,768到32,767。
int:32位有符号整数类型,范围从-2,147,483,648到2,147,483,647。
long:64位有符号整数类型,范围从-9,223,372,036,854,775,808到9,223,372,036,854,775,807。
float:32位单精度浮点数类型,遵循IEEE 754标准。
double:64位双精度浮点数类型,遵循IEEE 754标准。
char:16位无符号Unicode字符类型,范围从’\u0000’(即0)到’\uffff’(即65,535)。
boolean:表示真(true)或假(false)的类型。
这些基本数据类型在Java中用于声明变量,它们各自有不同的用途和存储需求。例如,int通常用于大多数整数计算,而float和double用于需要小数的计算。char用于表示单个字符,boolean用于表示逻辑值。
见 15、线程命令
在Java中,事务注解通常用于声明性事务管理,特别是在使用Spring框架时。要使事务注解生效,需要满足以下几个条件:
启用事务管理:首先,你需要在Spring配置文件中启用事务管理。可以通过XML配置或Java配置来实现。例如,使用Java配置时,可以创建一个配置类并添加@EnableTransactionManagement注解:
1 | import org.springframework.context.annotation.Configuration; |
配置数据源和事务管理器:你需要配置数据源(DataSource)和事务管理器(TransactionManager)。例如,使用Spring JDBC时,可以配置DataSource和DataSourceTransactionManager:
1 | import org.springframework.context.annotation.Bean; |
使用事务注解:在需要事务管理的方法上使用@Transactional注解。例如:
1 | import org.springframework.beans.factory.annotation.Autowired; |
注解的传播行为:@Transactional注解可以指定事务的传播行为、隔离级别、超时时间等属性。例如:
1 |
|
事务的异常处理:默认情况下,@Transactional注解会回滚运行时异常(RuntimeException)和错误(Error),但不会回滚检查性异常(Checked Exception)。你可以通过rollbackFor和noRollbackFor属性来指定回滚和不回滚的异常类型。例如:
1 |
|
事务的代理机制:Spring使用代理机制来实现事务管理。这意味着事务注解只能作用于公共方法上,并且只有通过代理对象调用这些方法时,事务才会生效。如果你在同一个类内部调用带有@Transactional注解的方法,事务可能不会生效。
通过以上步骤,你可以使事务注解在Spring应用程序中生效,从而实现声明性事务管理。
见 16、接口与抽象类、继承实现
在 Oracle 数据库中,分页查询通常使用 ROWNUM 或 OFFSET FETCH 子句来实现。以下是这两种方法的详细说明:
ROWNUM 进行分页ROWNUM 是 Oracle 数据库中的一个伪列,用于限制查询结果的行数。要实现分页,可以结合子查询来使用 ROWNUM。
1 | SELECT * FROM ( |
在这个查询中:
:startRow 是要返回的第一行的行号。
:endRow 是要返回的最后一行的行号。
例如,要获取第 11 到第 20 行,可以将 :startRow 设置为 11,:endRow 设置为 20。
OFFSET FETCH 进行分页Oracle 12c 及以上版本支持 OFFSET FETCH 子句,这使得分页查询更加直观和简洁。
1 | SELECT * FROM your_table |
在这个查询中:
:offset 是要跳过的行数。
:pageSize 是要返回的行数。
例如,要获取第 2 页,每页 10 行,可以将 :offset 设置为 10,:pageSize 设置为 10。
性能考虑:对于大数据量的表,使用 ROWNUM 进行分页可能会导致性能问题,因为 Oracle 需要生成所有行的 ROWNUM,然后过滤出需要的行。OFFSET FETCH 在性能上通常更好,因为它可以更有效地利用索引。
排序:无论是使用 ROWNUM 还是 OFFSET FETCH,都应该在 ORDER BY 子句中指定排序条件,以确保分页结果的正确性。
绑定变量:在实际应用中,建议使用绑定变量(:startRow, :endRow, :offset, :pageSize)来防止 SQL 注入,并提高查询的性能。
兼容性:OFFSET FETCH 子句仅在 Oracle 12c 及以上版本中可用。如果使用的是早期版本,只能使用 ROWNUM 进行分页。
通过以上方法,你可以在 Oracle 数据库中实现分页查询。选择哪种方法取决于你的具体需求和 Oracle 数据库的版本。
在 Oracle 数据库中,组合索引(也称为复合索引)是由多个列组成的索引。要确保组合索引中的所有列都能完全生效,需要满足以下条件:
查询条件中包含索引的所有列:要让组合索引的所有列都生效,查询的 WHERE 子句中必须包含索引中的所有列。例如,如果有一个组合索引 (A, B, C),那么查询条件中必须包含 A, B, 和 C 的条件。
查询条件中包含索引的前缀列:组合索引是基于列的顺序创建的,Oracle 可以使用索引的前缀列进行查询。例如,对于组合索引 (A, B, C),查询条件中包含 A 和 B 的条件时,索引 (A, B, C) 仍然可以被使用,但只有 A 和 B 列会生效,C 列不会被使用。
查询条件中包含索引的全部列,并且列的顺序与索引一致:为了确保组合索引的所有列都生效,查询条件中不仅需要包含索引中的所有列,而且这些列的顺序应该与索引的顺序一致。例如,对于组合索引 (A, B, C),查询条件应该是 WHERE A = ? AND B = ? AND C = ?。
避免使用函数或表达式:在查询条件中,如果对索引列使用函数或表达式,Oracle 可能无法使用该索引。例如,WHERE UPPER(A) = 'VALUE' 会阻止 Oracle 使用索引 (A, B, C)。
避免使用 OR 条件:如果查询条件中使用 OR 连接不同的条件,Oracle 可能无法有效地使用组合索引。在这种情况下,可能需要考虑使用位图索引或其他优化技术。
确保列的数据类型匹配:查询条件中列的数据类型必须与索引列的数据类型匹配。例如,如果索引列 A 是 VARCHAR2 类型,那么查询条件中 A 的值也应该是 VARCHAR2 类型。
避免使用通配符在前:在 LIKE 查询中,如果通配符(% 或 _)位于搜索模式的开头,Oracle 可能无法使用索引。例如,WHERE A LIKE '%value' 会阻止 Oracle 使用索引 (A, B, C)。
通过满足以上条件,可以确保组合索引中的所有列都能完全生效,从而提高查询性能。在实际应用中,建议使用 EXPLAIN PLAN 或 DBMS_XPLAN 来分析查询计划,确保索引被正确使用。
Java源文件的扩展名
.java。Java源文件的结构
public class),类名应与文件名相同。编译和运行
javac 将 .java 文件编译成字节码文件 .class。java 运行字节码文件。结论
Java源文件的扩展名是 .java。
类成员访问控制符
public: 公共的,可以被任何其他类访问。private: 私有的,只能被同一类中的代码访问。protected: 受保护的,可以被同一包中的类和所有子类访问。访问控制符的使用
public 通常用于类、方法和常量,以便它们可以被外部类访问。private 通常用于类的内部实现细节,不希望被外部类访问。protected 用于允许子类访问某些方法或字段,同时限制外部类的访问。访问控制的重要性
结论
Java类成员的访问控制符包括 public、private、protected 和默认(无修饰符),它们用于控制类成员的访问权限,从而实现封装和提高代码的可维护性。
控制结构概述
三种基本控制结构
if、if-else 和 switch。for、while 和 do-while。控制结构的作用
结论
Java中的三种基本控制结构是顺序结构、选择结构和循环结构。
Linux文件权限概述
权限类别
权限类型
权限表示方法
符号表示法
-表示普通文件,d表示目录)。r(读)、w(写)、x(执行)或-(无权限)表示。-rwxr--r--表示一个普通文件,所有者有读、写、执行权限,组和其他用户只有读权限。数字表示法
rwx对应4+2+1=7,r--对应4+0+0=4,因此-rwxr--r--的数字权限为744。权限示例
符号权限 -rwxr--r--
rwx)r--)r--)744符号权限 drwxr-xr-x
rwx)r-x)r-x)755结论
Linux文件权限分为用户、组和其他三类,每类包括读、写和执行三种权限。权限可以用符号表示法(如 -rwxr--r--)或数字表示法(如 744)来描述。符号表示法中,第一个字符表示文件类型,后面的字符分为三组,每组三个字符分别表示用户、组和其他的权限。数字表示法中,读、写、执行分别对应4、2、1,每个类别的权限数字相加得到总的权限值。
服务器异常码概述
常见异常码分类
信息性状态码(100-199)
成功状态码(200-299)
重定向状态码(300-399)
客户端错误状态码(400-499)
服务器错误状态码(500-599)
异常码的作用
处理常见异常码的策略
404 Not Found:
500 Internal Server Error:
503 Service Unavailable:
结论
服务器异常码是HTTP协议中用于表示服务器响应状态的三位数字代码,分为信息性、成功、重定向、客户端错误和服务器错误五类。这些码帮助诊断网络问题、改善用户体验,并指导客户端如何处理响应。常见的异常码如404 Not Found和500 Internal Server Error需要根据具体情况采取相应的解决策略。
在Java中,常量通常使用final关键字来修饰,表示其值在初始化后不能被改变。为了提高代码的可读性和维护性,常量通常还使用public和static关键字来修饰,使得它们可以被类的实例共享,并且可以通过类名直接访问,而不需要创建类的实例。
因此,一个典型的Java常量定义如下:
1 | public class Constants { |
在这个例子中:
public修饰符表示该常量是公共的,可以被其他类访问。
static修饰符表示该常量是类级别的,而不是实例级别的,因此可以通过类名直接访问。
final修饰符表示该常量的值在初始化后不能被改变。
需要注意的是,虽然final关键字可以单独使用来创建常量,但通常会与public和static一起使用,以确保常量的可见性和共享性。
AOP(Aspect-Oriented Programming,面向切面编程)是一种编程范式,旨在通过将横切关注点(cross-cutting concerns)与业务逻辑分离,来提高代码的模块化和可维护性。AOP通常由以下几个核心概念组成:
切面(Aspect):
切面是横切关注点的模块化,它封装了与多个类相关的行为。例如,日志记录、事务管理、安全性检查等都可以被封装为切面。
连接点(Join Point):
连接点是在程序执行过程中能够插入切面代码的点。在Java中,连接点通常是方法的调用、方法的执行、异常的抛出等。
切入点(Pointcut):
切入点是一个匹配连接点的谓词,它定义了切面将在哪些连接点上执行。切人点通常使用表达式来定义,例如,可以指定在所有以“get”开头的方法上执行切面代码。
通知(Advice):
通知是切面在切入点执行的代码。根据通知在连接点执行的时间,通知可以分为几种类型:
引入(Introduction):
引入允许切面为现有的类添加新的方法或属性,而不需要修改类的源代码。这可以用来实现接口或添加新的行为。
织入(Weaving):
织入是将切面代码插入到目标对象中的过程。织入可以在编译时、类加载时或运行时进行。
AOP的实现通常依赖于一个AOP框架,如Spring AOP或AspectJ。这些框架提供了实现AOP所需的基础设施和工具,使得开发者可以更容易地将切面集成到他们的应用程序中。
抽象类(Abstract Class)是面向对象编程中的一种概念,它允许开发者定义一些未实现的方法和成员变量,供子类继承并实现。抽象类不能被实例化,只能被继承。抽象类的主要目的是为了一组相关类提供一个公共的接口和部分实现,从而提高代码的可维护性和可扩展性。
抽象类的特点包括:
抽象方法(Abstract Method):
抽象方法是没有实现的方法,它们只声明了方法的签名(方法名、参数列表和返回类型),而没有方法体。子类必须实现所有继承的抽象方法,除非子类本身也是抽象类。
具体方法(Concrete Method):
抽象类中可以包含具体的方法,这些方法有完整的实现,子类可以直接使用或重写这些方法。
构造器(Constructor):
抽象类可以有构造器,用于初始化抽象类的成员变量。子类在创建实例时,会调用抽象类的构造器。
成员变量:
抽象类可以包含成员变量,这些变量可以是具体变量或抽象变量(通过抽象方法间接定义)。
继承:
抽象类可以被子类继承,子类必须实现抽象类中的所有抽象方法,除非子类本身也是抽象类。
接口实现:
抽象类可以实现一个或多个接口,提供接口方法的部分或全部实现。
抽象类与接口有一些相似之处,但它们在目的和使用上有所不同。接口主要用于定义契约,而抽象类可以提供部分实现和共享代码。在Java中,一个类可以继承多个接口,但只能继承一个抽象类。
使用抽象类可以促进代码的复用和扩展,同时确保子类实现必要的功能。抽象类是实现开闭原则(对扩展开放,对修改关闭)的重要手段之一。
SQL基础查询题目
以下是一些基础的SQL查询题目,旨在考察学生的数据库基础知识和SQL查询能力。
查询所有学生的姓名和年龄。
1 | SELECT name, age FROM students; |
查询年龄大于18岁的学生的信息。
1 | SELECT * FROM students WHERE age > 18; |
查询学生的平均年龄。
1 | SELECT AVG(age) FROM students; |
查询学生信息,并按年龄降序排列。
1 | SELECT * FROM students ORDER BY age DESC; |
查询每个班级的学生人数。
1 | SELECT class_id, COUNT(*) FROM students GROUP BY class_id; |
查询姓名中包含“王”字的学生。
1 | SELECT * FROM students WHERE name LIKE '%王%'; |
查询班级ID在1、2、3的学生。
1 | SELECT * FROM students WHERE class_id IN (1, 2, 3); |
查询所有唯一的班级ID。
1 | SELECT DISTINCT class_id FROM students; |
假设的数据库表结构:
1 | CREATE TABLE students ( |
这些题目涵盖了SELECT、FROM、WHERE、ORDER BY、GROUP BY、LIKE、IN以及DISTINCT等基础SQL子句,有助于学生巩固数据库基础知识和提升SQL查询能力。
基础算法排序复杂度总结
以下是几种常见基础算法的排序复杂度总结:
冒泡排序
选择排序
插入排序
快速排序
归并排序
堆排序
这些排序算法的时间和空间复杂度总结了它们在不同情况下的性能表现,有助于在实际应用中选择合适的排序方法。
Java设计模式题考察
Java设计模式是软件开发中常用的一套解决方案,用于解决特定类型的问题。在面试或考试中,Java设计模式的考察通常包括以下几个方面:
单例模式(Singleton Pattern)
工厂模式(Factory Pattern)
观察者模式(Observer Pattern)
java.util.Observable和java.util.Observer接口。策略模式(Strategy Pattern)
装饰器模式(Decorator Pattern)
适配器模式(Adapter Pattern)
代理模式(Proxy Pattern)
职责链模式(Chain of Responsibility Pattern)
命令模式(Command Pattern)
迭代器模式(Iterator Pattern)
在考察Java设计模式时,通常会要求考生理解各种模式的定义、适用场景、实现方式以及优缺点。此外,还可能要求考生编写代码实现特定的设计模式,或者分析现有代码中使用的设计模式。通过这些考察,可以评估考生对设计模式的理解和应用能力。
在Java中,static关键字用于修饰类的成员,包括方法、变量、块和内部类。使用static修饰的成员属于类本身,而不是类的实例。这意味着无论创建多少个类的实例,static成员在内存中只有一个副本。以下是static修饰的不同成员的详细解释:
静态变量(Static Variables)
定义:使用static关键字修饰的变量称为静态变量,也称为类变量。
特点:
示例:
1 | public class MyClass { |
静态方法(Static Methods)
定义:使用static关键字修饰的方法称为静态方法,也称为类方法。
特点:
示例:
1 | public class MyClass { |
静态块(Static Blocks)
定义:使用static关键字修饰的代码块称为静态块。
特点:
示例:
1 | public class MyClass { |
静态内部类(Static Nested Classes)
定义:使用static关键字修饰的内部类称为静态内部类。
特点:
示例:
1 | public class OuterClass { |
使用static修饰的成员在Java编程中非常常见,它们在不同的场景下提供了便利和优化。例如,静态方法常用于工具类中,提供一些通用的功能;静态变量用于记录类的全局状态;静态块用于执行一次性的初始化代码;静态内部类用于封装与外部类相关的辅助类,且不依赖于外部类的实例。
Java集合框架(Java Collections Framework)是一组用于存储和操作对象集合的接口和类。它提供了多种数据结构,包括列表、集合、映射等,以及用于操作这些数据结构的算法。以下是Java集合框架中的一些主要接口和实现类:
Collection接口
Map接口
List接口的实现类:
Set接口的实现类:
Queue接口的实现类:
Map接口的实现类:
Collections类:提供了操作集合的静态方法,如排序、查找、同步等。
Arrays类:提供了操作数组的静态方法,包括将数组转换为列表等。
Java集合框架的设计遵循了接口和实现分离的原则,使得代码更加灵活和可扩展。通过使用不同的实现类,可以根据具体的需求选择最适合的数据结构。同时,集合框架还提供了丰富的算法,如排序、查找、同步等,方便开发者进行集合操作。
在Java中,#{}和${} 是MyBatis框架中用于SQL语句占位符的两种不同语法,它们在处理参数时有不同的行为和用途。
#{}(预编译处理)
用途:用于将Java对象的属性值插入到SQL语句中,通常用于设置IN参数。
处理方式:MyBatis会将#{}中的内容视为一个参数,并使用PreparedStatement的setXXX方法来设置参数值。这种方式能够有效地防止SQL注入,因为参数值会被作为字符串处理,不会被解析为SQL代码的一部分。
示例:
1 | String sql = "SELECT * FROM users WHERE id = #{id}"; |
在这个例子中,#{id}会被替换为一个预编译的参数占位符,如?,然后MyBatis会使用setId方法设置实际的ID值。
${}(字符串替换)
用途:用于将Java对象的属性值直接插入到SQL语句中,通常用于动态生成SQL语句的一部分,如表名、列名等。
处理方式:MyBatis会将${}中的内容直接替换为对应的字符串值,不做任何转义处理。这种方式可能会导致SQL注入漏洞,因为用户输入的内容会被直接拼接到SQL语句中。
示例:
1 | String sql = "SELECT * FROM ${tableName} WHERE id = #{id}"; |
在这个例子中,${tableName}会被直接替换为tableName的字符串值,而#{id}则会被作为预编译的参数处理。
总结:
使用#{}可以防止SQL注入,适用于设置IN参数。
使用${}会直接替换字符串,适用于动态生成SQL语句的一部分,但需要谨慎使用,避免SQL注入风险。
在实际开发中,应尽量使用#{}来传递参数,以确保SQL语句的安全性。只有在确实需要动态生成SQL语句的一部分(如表名、列名等)时,才使用${},并且要确保这些部分的值是可信的,不会被恶意用户篡改。
在MyBatis的XML映射文件中,标签是用来定义SQL语句和映射关系的。以下是一些常用的标签及其用途:
<mapper>
namespace:指定映射器的命名空间,通常是一个Java接口的全限定名。<select>
id:唯一标识这个查询语句,在Java接口中对应的方法名。resultType:指定查询结果映射到的Java类型。parameterType:指定输入参数的Java类型。<insert>
id:唯一标识这个插入语句,在Java接口中对应的方法名。parameterType:指定输入参数的Java类型。useGeneratedKeys:是否使用数据库生成的主键。keyProperty:指定Java对象中对应主键的属性。<update>
id:唯一标识这个更新语句,在Java接口中对应的方法名。parameterType:指定输入参数的Java类型。<delete>
id:唯一标识这个删除语句,在Java接口中对应的方法名。parameterType:指定输入参数的Java类型。<resultMap>
id:唯一标识这个结果集映射。type:指定映射到的Java类型。<association>
property:指定Java对象中对应的属性。javaType:指定关联对象的Java类型。column:指定数据库表中的列名。<collection>
property:指定Java对象中对应的属性。ofType:指定集合中元素的Java类型。<sql>
id:唯一标识这个SQL代码片段。<include>
refid:引用的SQL代码片段的ID。这些标签帮助你定义和组织SQL语句,以及它们与Java对象之间的映射关系。通过合理使用这些标签,可以提高代码的可维护性和可读性。
@SpringBootApplication 是 Spring Boot 提供的一个注解,它是一个组合注解,包含了以下几个核心注解:
@SpringBootConfiguration
@Configuration,但它专门用于 Spring Boot 应用程序的配置。@EnableAutoConfiguration
@ComponentScan
@Controller、@Service、@Repository 和 @Component。通过使用 @SpringBootApplication 注解,你可以简化 Spring Boot 应用程序的配置,因为它集成了配置、自动配置和组件扫描的功能。通常,这个注解会应用在你的主应用程序类上,这个类中通常包含 main 方法来启动 Spring Boot 应用程序。
在Linux系统中,文件和目录的权限通过一组数字来表示,这组数字被称为权限位。每个权限位代表不同的访问权限,分为三组:用户(User)、组(Group)和其他(Others)。每组权限位由三个数字组成,分别代表读(Read)、写(Write)和执行(Execute)权限。
权限数字的含义如下:
4:代表读权限(Read)
2:代表写权限(Write)
1:代表执行权限(Execute)
这些数字可以相加来组合不同的权限。例如,7是4+2+1,表示读、写和执行权限;6是4+2,表示读和写权限;5是4+1,表示读和执行权限。
当你说一个文件的权限是744时,这意味着:
用户(User):7,即4+2+1,表示用户拥有读、写和执行权限。
组(Group):4,表示组成员拥有读权限。
其他(Others):4,表示其他用户拥有读权限。
总结来说,权限744意味着文件的所有者可以读、写和执行该文件,而组成员和其他用户只能读取该文件。
在Linux系统中,查看当前实时进程的命令是ps(process status)命令。ps命令可以显示系统中当前运行的进程的信息。要查看实时进程,可以使用ps命令的-e选项来显示所有进程,-f选项来显示完整的格式,或者使用-aux选项来显示所有进程的详细信息。
例如,要查看所有进程的详细信息,可以使用以下命令:
1 | ps aux |
这个命令会显示所有进程的用户、进程ID(PID)、CPU使用率、内存使用率、启动时间、终端和命令等信息。
如果你想要实时监控进程的活动,可以使用top命令或者htop命令(如果已安装)。top命令提供了一个动态的、实时的视图,显示系统中运行的进程及其资源使用情况。htop是一个更高级的交互式进程查看器,提供了更友好的用户界面和更多的功能。
例如,要使用top命令,只需在终端中输入:
1 | top |
要使用htop命令,输入:
1 | htop |
请注意,htop可能需要单独安装,因为它不是Linux发行版的标准工具。你可以使用包管理器来安装它,例如在Debian/Ubuntu系统中,可以使用以下命令安装:
1 | sudo apt-get install htop |
在vi编辑器中,删除行和删除整个文件的命令如下:
删除当前光标所在行:
1 | dd |
删除4行(从当前光标所在行开始向下删除4行):
1 | 4dd |
删除整个文件(清空文件内容):
1 | :%d |
在执行此命令后,文件内容将被删除,但文件本身仍然存在。如果你想要删除文件本身,你需要使用操作系统的命令,如rm。例如:
1 | :wq! # 保存并退出vi |
请注意,这些命令是在vi的命令模式下使用的。如果你在插入模式下,你需要先按Esc键返回到命令模式,然后再输入上述命令。
在数据库进行数据清理操作时,通常需要确保这些操作不会影响到正在进行的DML(数据操作语言)操作,如INSERT、UPDATE和DELETE。为了实现这一点,可以采取以下几种策略:
事务隔离级别:
使用适当的事务隔离级别来防止数据清理操作与DML操作之间的冲突。例如,使用Serializable隔离级别可以确保事务在执行期间看到的数据不会被其他事务修改。
锁定机制:
在执行数据清理操作时,可以使用锁定机制来锁定相关的表或行,防止其他事务对其进行修改。但是,这可能会导致其他事务等待,影响性能。
分区表:
如果数据库支持分区表,可以将数据分成多个分区,然后对不活动的分区进行清理。这样可以减少对正在使用的数据的影响。
批量操作:
将数据清理操作分成多个小批量执行,而不是一次性删除大量数据。这可以减少对数据库性能的影响,并降低锁竞争的可能性。
时间窗口:
在数据库负载较低的时间窗口内执行数据清理操作,以减少对在线DML操作的影响。
复制和影子表:
使用数据库复制功能或影子表来创建数据的副本,然后在副本上执行清理操作。清理完成后,可以将副本切换回主表。
使用存储过程或触发器:
编写存储过程或触发器来自动执行数据清理操作,确保它们在不影响DML操作的情况下运行。
监控和调整:
在执行数据清理操作时,监控数据库的性能和锁情况,根据需要调整操作的频率和范围。
备份和恢复:
在执行大规模数据清理操作之前,确保有最新的备份,以便在出现问题时可以恢复数据。
在执行任何数据清理操作之前,都应该仔细规划,并在测试环境中进行测试,以确保操作的安全性和有效性。此外,应该与数据库管理员和其他相关团队成员沟通,确保他们了解即将进行的操作,以便在必要时提供支持。
在Linux系统中,命令和权限管理是确保系统安全和稳定运行的关键。以下是一些关于Linux命令和权限的基本概念和操作:
文件和目录操作:
ls:列出目录内容。cd:更改目录。pwd:显示当前工作目录。mkdir:创建目录。rm:删除文件或目录。cp:复制文件或目录。mv:移动或重命名文件或目录。文件查看和编辑:
cat:显示文件内容。less:分页显示文件内容。vim 或 nano:文本编辑器,用于创建和编辑文件。系统信息和管理:
uname:显示系统信息。top 或 htop:显示系统进程。df:显示磁盘空间使用情况。free:显示内存使用情况。ps:显示进程状态。kill:终止进程。用户和权限管理:
useradd 或 adduser:添加用户。userdel:删除用户。passwd:更改用户密码。chmod:更改文件或目录权限。chown:更改文件或目录所有者。chgrp:更改文件或目录所属组。Linux权限系统基于用户、组和其他用户(others)的三类权限,每类权限有读(r)、写(w)和执行(x)三种权限。
查看权限:
使用 ls -l 命令可以查看文件或目录的权限。
更改权限:
使用 chmod 命令可以更改文件或目录的权限。例如:
chmod 755 file.txt:设置文件的权限为所有者可读写执行,组和其他用户可读执行。chmod u+x file.txt:给文件的所有者添加执行权限。更改所有者和组:
使用 chown 和 chgrp 命令可以更改文件或目录的所有者和组。例如:
chown user:group file.txt:更改文件的所有者为"user",组为"group"。chgrp group file.txt:更改文件的组为"group"。sudo权限:
使用 sudo 命令可以以超级用户权限执行命令。例如:
sudo apt-get update:以超级用户权限更新包列表。在执行任何可能影响系统稳定性的命令之前,应该确保你了解该命令的作用和潜在影响。
使用 sudo 时要非常小心,因为错误的命令可能会导致系统损坏。
定期备份重要数据,以防万一。
学习和理解Linux命令和权限系统是Linux系统管理的基础,建议通过官方文档和在线教程进行深入学习。
通过理解和掌握这些基本的Linux命令和权限管理知识,你可以更有效地管理和维护Linux系统。
在Java编程语言中,接口、抽象类和继承关系是面向对象编程(OOP)的重要概念。它们允许开发者实现代码的重用、扩展和多态性。下面是这些概念的简要介绍:
接口是一种完全抽象的类,它只包含抽象方法和常量。接口用于定义类的行为,但不提供方法的具体实现。一个类可以实现多个接口,从而实现多重继承的效果。
1 | public interface Animal { |
抽象类是一个不能被实例化的类,它可能包含抽象方法(没有实现的方法)和具体方法(有实现的方法)。抽象类用于提供一个基类,子类可以继承并实现抽象方法。
1 | public abstract class Mammal { |
继承是OOP的一个关键特性,它允许一个类(子类)继承另一个类(父类)的属性和方法。子类可以重写父类的方法,也可以添加新的方法和属性。
1 | public class Dog extends Animal { |
Java不支持多重继承,即一个类不能直接继承多个类。但是,一个类可以实现多个接口,从而实现多重继承的效果。
1 | public class Bird implements Animal, Flyable { |
接口中的方法默认是抽象的,而抽象类中的方法可以是抽象的也可以是具体的。
一个类可以继承一个抽象类并实现多个接口。
抽象类可以有构造器,而接口不能有构造器。
接口中的变量默认是public static final的,而抽象类中的变量可以有不同的访问修饰符。
通过理解和使用接口、抽象类和继承关系,开发者可以创建出更加模块化、可扩展和易于维护的代码。
1、字符串小写加反转
2、2的幂等
3、预计循环类型, 递归
4、冒泡排序
常见题型:
JAVA基础题型
SQL优化题型
Linux命令题型