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

Java SE--抽象类和接口

一.抽象类概念

一个类中没有包含足够的信息描述一个对象时,就可以作为抽象类

二.抽象类的语法

1.用关键字abstract进行修饰的类就是抽象类

2.用关键字abstract进行修饰的方法就是抽象方法(可有可无),抽象方法不用具体实现

3.抽象类也是类,可以增加普通方法构造方法成员变量

三.抽象类特性

1.抽象类不可以实例化,只能被继承,如果抽象类有抽象方法则子类必须重写父类的方法(不重写会报错),或者该子类也是抽象类

2.抽象方法不可以被prviate、final、static修饰(原因是必须满足重写的要求)

四.为何使用抽象类?

由上述共能可知抽象类的好处:

1.如之前写的Aminal、Shape中的一些方法被子类方法重写,不需要具体实现,就可以将这些类定义为抽象类,而抽象类可以有抽象方法,符合不需要具体实现的要求

2.可以对重写的方法进行验证

五.接口概念

接口可以看作公共的行为标准(能力),只要符合规范标准,就可以通用.如跑步的行为,狗能接受这个标准,而鱼就不能

六.接口语法

1.将关键字class换成关键字 interface,定义格式和继承一样

2.普通方法会默认加上public abstract,成员变量会默认加上public static final且得初始化

3.接口是引用类型不是类,不能实例化,字节码文件后缀还是  .class 文件

七.接口使用

在类和类得继承中用 extends (单词意思为扩展),在类和接口中用 implements (单词意思为实现)

八.接口和类中成员对比

成员类型接(Interface)类(Class)原因
成员变量(实例变量)❌ 不允许✅ 允许接口只定义行为契约,不维护状态,因此不能有实例变量。
常量(public static final✅ 允许(默认)✅ 允许(需显式声明)接口可以定义全局常量,但必须是 public static final(默认隐式)。
抽象方法(public abstract✅ 允许(默认)✅ 允许(需显式 abstract接口的核心是定义方法规范,所有方法默认是 public abstract
默认方法(default✅ 允许(Java 8+)❌ 不允许(普通方法自带实现默认方法允许接口提供默认实现,避免破坏现有代码。
静态方法(static✅ 允许(Java 8+)✅ 允许静态方法属于类/接口级别,不依赖实例。
私有方法(private✅ 允许(Java 9+)✅ 允许私有方法用于接口内部代码复用,不暴露给实现类。
构造方法(Constructor)❌ 不允许✅ 允许接口不能被实例化,因此不需要构造方法。
初始化块({} / static{}❌ 不允许✅ 允许接口不能包含状态,因此不需要初始化逻辑。
嵌套类/接口✅ 允许✅ 允许接口和类都可以包含嵌套类型。

接口应用举例:

九.多个接口使用和继承

在继承中不可以多继承,而一个类可以有多个接口例子如下:

十.接口继承接口

接口和接口之间的继承也用extends,用此可以达到多继承的效果

十一.Object类

Object是默认提供的一个类。所有类都会默认继承 Object 类,所有的类的对象都可以被 Object引用接收,Object 也定义了一些方法

1.对象比较equals方法

应用:

2.hashcode方法(了解)

功能:可以得出对象的位置,如果对象的成员变量相同则在同一位置

3.toString方法

十二.内部类(类和对象补充)

在Java中可以将一个类定义在另一个类中或方法中,在内部为内部类,外部为外部类

主要分为 静态内部类、实例内部类、匿名内部类

1.实例内部类

public class OutClass {private int a;static int b;int c;public void methodA{a=10;System.out.printin(a);}
public static void methodB(){System.out.printIn(b);}
//实例内部类:未被static修饰
class InnerClass{int c;public void methodinner(){// 在实例内部类中可以直接访问外部类中:任意访问限定符修饰的成员a=100;b =200;methodA();methodB();
//  如果外部类和实例内部类中具有相同名称成员时,优先访问的!部类自己的c=300;System.out.println(c);
//如果要访问外部类同名成员时候,必须外部类的名称.OutClass.this.c = 400;
System.out.println(OutClass.this.c)}
}
public static void main(String[] args)// 外部类:对象创建 以及 成员访问
OutClass outClass = new OutClass(
System.out.println(outClass.a)
System.out.println(QutClass.b
System.out.printIn(outClass.c);
outClass.methodA()
outClass.methodB()System.out.println("================实例内部类的访问=============")
// 要访问实例内部类中成员,必须要创建实例内部类的对象
//而普通内部类定义与外部类成员定义位置相同,因此创建实例内部类对象时必须借助外部类
// 创建实例内部类对象
OutClass.InnerClass innerClass1 =new QutClass().new InnerClass();
// 上述语法比较怪异,也可以先将外部类对象先创建出来,然后再创建实例内部类对象OutClass.InnerClass innerClass2 = outClass.new InnerClass();
innerClass2.methodinner();

2.静态内部类

public class OutClass {private int a;static int b;public void methodA(){a=10;System.out.println(a);public static void methodB(){System.out.println(b);}
}
// 静态内部类:被static修饰的成员内部类
static class InnerClass{public void methodinner(){
//    在内部类中只能访问外部类的静态成员
//    a=100; //编译失败,因为a不是类成员变量b =200;
//   methodA();  //编译失败,因为methodA()不是类成员方法
methodB;}
}
public static void main(String[] args) {
// 静态内部类对象创建 & 成员访问
OutClass.InnerClass innerClass =new OutClass.InnerClass();
innerClass.methodinner();}
}

3.匿名内部类(利用了接口)

十三.常用接口扩展

1.Comparable接口

俩对象的比较大小:

多对象比较大小:

目前结论:

只要是自定义类型,要比较实例化对象大小,就一定得实现Comparable接口

自己实现sort(利用冒泡排序)

该接口缺点:

每次运行都只能比较对象一个属性

2.Comparator接口

优点:

可以根据不同的属性创造不同的实现该接口的类重写compare方法来比较不同属性的对象

3.Cloneable接口

接口的源码:

作用:表示实现接口的类可以克隆

实现过程:

应用:

该实现过程没有将Money拷贝上属于浅拷贝,深拷贝得将Money也拷贝上

http://www.xdnf.cn/news/1109665.html

相关文章:

  • 如何查看服务器当前用户的权限
  • GD32 CAN1和TIMER0同时开启问题
  • 深度学习15(GRU、LSTM+词嵌入+seq2seq+attention)
  • 电子基石:硬件工程师的器件手册 (五) - 三极管:电流放大的基石与开关的利刃
  • 7. JVM类加载器与双亲委派模型
  • 关于两种网络攻击方式XSS和CSRF
  • 二分法寻找无序序列的峰值
  • [Token]Token merging for Vision Generation
  • 学python,PyCharm 和 VSCode哪个更好用?
  • ChatRex RexSeek RexThinker: 结合多模态大语言模型的目标检测模型构建
  • vue3+vit+vue-router路由,侧边栏菜单,面包屑导航设置层级结构
  • 商业机密保卫战:如何让离职员工带不走的客户资源?
  • 六年级数学知识边界总结思考-上册
  • Rust Web 全栈开发(五):使用 sqlx 连接 MySQL 数据库
  • 【赵渝强老师】国产数据库TiDB的代理路由:TiProxy
  • 服务器怎么跑Python项目?
  • 【代码随想录】刷题笔记——哈希表篇
  • MySQL 中图标字符存储问题探究:使用外挂法,毕业论文——仙盟创梦IDE
  • shiro550反序列化漏洞复现(附带docker源)
  • 【Docker基础】Dockerfile指令速览:基础常用指令详解
  • Leetcode百题斩-二分搜索
  • 使用langgraph 构建RAG 智能问答代理
  • springboot AOP面向切面编程
  • 连接池深度解析:原理、实现与最佳实践
  • Hap包引用的Hsp报签名错误怎么解决
  • 使用ESM3蛋白质语言模型进行快速大规模结构预测
  • 每日一SQL 【销售分析 III】
  • Python问题记录`No module named ‘matplotlib‘` 问题解决方案
  • 基于SEP3203微处理器的嵌入式最小硬件系统设计
  • 基于 Python 的数据分析技术综述