Java笔记5——面向对象(下)

目录
一、抽象类和接口
1-1、抽象类(包含抽象方法的类)
1-2、接口
编辑编辑
二、多态
编辑
1. 自动类型转换(向上转型)
示例:
注意:
2. 强制类型转换(向下转型)
示例:
注意:
3. 类型转换的注意事项
4、instanceof 关键字:
总结
三、Object类
四、内部类
内部类的作用
4-1、成员内部类
4-2、局部内部类
4-3、静态内部类
4-4、匿名内部类
一、抽象类和接口
抽象类:是一个半成品的模具,提供了一个通用的框架,但需要子类来完成具体的实现。
接口:是一个协议,定义了一组行为,但不关心这些行为是如何实现的。
1-1、抽象类(包含抽象方法的类)
抽象类中的某些方法是抽象的(没有具体实现),这些方法就像是模具上的预留孔,等待子类(具体的物品)来填充。————就相当于自定义功能实现区入口,同一种功能不同的对象实现效果不一样(如:发出声音这个功能,狗发出的声音是汪,而猫发出的声音是喵),实现效果不同则实现方法不同。

代码示例
//定义抽象类Animal
abstract class Animal {//定义抽象方法shout()abstract void shout();
}//定义Dog类继承抽象类Animal
class Dog extends Animal {//重写抽象方法shout()void shout() {System.out.println("汪,汪……");}
}
class Cat extends Animal {//重写抽象方法shout()void shout() {System.out.println("喵,喵……");}
}//定义测试类
public class Example10 {public static void main(String[] args) {Dog dog = new Dog(); //创建Dog类的对象Cat cat = new Cat();dog.shout(); //通过dog对象调用shout()方法cat.shout();//通过cat对象调用shout()方法}
}
输出

注意:使用abstract关键字修饰的抽象方法不能使用private修饰,因为抽象方法必须被子类实现,如果使用了private关键字修饰抽象方法,则子类无法实现该方法。
1-2、接口
接口(Interface) 接口就像是一个协议。它定义了一组规则或行为,但不关心这些行为是如何实现的。任何实现了这个接口的类都必须遵守这个协议,提供接口中定义的所有方法的实现。
代码示例
//定义接口Animal
interface Animal {int ID = 1; //定义全局常量,编号String NAME = "牧羊犬"; //定义全局常量,名称void shout(); //定义抽象方法shout()public void info(); //定义抽象方法info()static int getID() { //定义静态方法getID(),用于返回ID值return Animal.ID;}
}interface Action { //定义抽象方法eat()public void eat();
}//定义Dog类实现Animal接口和Action接口
class Dog implements Animal, Action {//重写Action接口中的抽象方法eat()public void eat() {System.out.println("喜欢吃骨头");}//重写Animal接口中的抽象方法shout()public void shout() {System.out.println("汪汪……");}//重写Animal接口中的抽象方法info()public void info() {System.out.println("名称:" + NAME);}
}//定义测试类
class Example11 {public static void main(String[] args) {System.out.println("编号" + Animal.getID());Dog dog = new Dog(); //创建Dog类的实例对象dog.info(); //调用Dog类中重写的info()方法dog.shout(); //调用Dog类中重写的shout()方法dog.eat(); //调用Dog类中重写的eat()方法}
}
输出


// 定义接口 Animal
interface Animal {public String NAME = "牧羊犬"; // 定义全局常量,名称public void shout(); // 定义抽象方法 shout()public void info(); // 定义抽象方法 info()
}// 定义抽象类 Action
abstract class Action {public abstract void eat(); // 定义抽象方法 eat()
}// 定义 Dog 类继承 Action 抽象类,并实现 Animal 接口
class Dog extends Action implements Animal {// 重写 Action 抽象类中的抽象方法 eat()public void eat() {System.out.println("喜欢吃骨头");}// 重写 Animal 接口中的抽象方法 shout()public void shout() {System.out.println("汪汪……");}// 重写 Animal 接口中的抽象方法 info()public void info() {System.out.println("名称:"+NAME);}
}// 定义测试类
class Example12 {public static void main(String[] args) {Dog dog = new Dog(); // 创建 Dog 类的实例对象dog.info(); // 调用 Dog 类中重写的 info() 方法dog.shout(); // 调用 Dog 类中重写的 shout() 方法dog.eat(); // 调用 Dog 类中重写的 eat() 方法}
}
输出:

注意:在JAVA中,接口不允许继承抽象类,但是允许接口继承接口,并且一个接口可以继承多个接口。
示例:
// 定义接口 Animal
interface Animal {public String NAME = "牧羊犬"; // 定义常量 NAMEpublic void info(); // 定义抽象方法 info()
}// 定义 Color 接口
interface Color {public void black(); // 定义抽象方法 black()
}// 定义 Action 接口,它同时继承 Animal 接口和 Color 接口
interface Action extends Animal, Color {public void shout(); // 定义抽象方法 shout()
}// 定义 Dog 类实现 Action 接口
class Dog implements Action {// 重写 Animal 接口中的抽象方法 info()public void info() {System.out.println("名称:" + NAME);}// 重写 Color 接口中的抽象方法 black()public void black() {System.out.println("黑色");}// 重写 Action 接口中的抽象方法 shout()public void shout() {System.out.println("汪汪……");}
}// 定义测试类
class Example13 {public static void main(String[] args) {Dog dog = new Dog(); // 创建 Dog 类的 dog 对象dog.info(); // 调用 Dog 类中重写的 info() 方法dog.shout(); // 调用 Dog 类中重写的 shout() 方法dog.black(); // 调用 Dog 类中重写的 black() 方法}
}

二、多态
// 定义抽象类 Animal
abstract class Animal {abstract void shout(); // 定义抽象 shout() 方法
}// 定义 Cat 类继承 Animal 抽象类
class Cat extends Animal {// 重写 shout() 方法public void shout() {System.out.println("喵喵……");}
}// 定义 Dog 类继承 Animal 抽象类
class Dog extends Animal {// 重写 shout() 方法public void shout() {System.out.println("汪汪……");}
}// 定义测试类
public class Example14 {public static void main(String[] args) {Animal an1 = new Cat(); // 创建 Cat 类的对象并转型为 Animal 类的对象Animal an2 = new Dog(); // 创建 Dog 类的对象并转型为 Animal 类的对象an1.shout(); // 调用 Cat 类中重写的 shout() 方法an2.shout(); // 调用 Dog 类中重写的 shout() 方法}
}
Java 中的对象类型转换是面向对象编程中的一个重要概念,它允许我们将一个对象从一种类型转换为另一种类型。
类型转换可以分为 自动类型转换 和 强制类型转换,具体取决于上下文和对象之间的继承关系。
1. 自动类型转换(向上转型)
向上转型是指将子类对象转换为父类类型。这种转换是安全的,因为子类继承了父类的所有属性和方法,因此可以直接赋值给父类引用。

示例:
class Animal {void eat() {System.out.println("Animal is eating");}
}class Dog extends Animal {void bark() {System.out.println("Dog is barking");}
}public class Main {public static void main(String[] args) {Dog dog = new Dog(); // 创建 Dog 对象Animal animal = dog; // 自动向上转型为 Animal 类型animal.eat(); // 调用父类方法// animal.bark(); // 错误:Animal 类型没有 bark() 方法}
}
注意:
向上转型后,父类引用只能访问父类的方法和属性,无法访问子类特有的方法。
如果需要访问子类特有的方法,需要进行向下转型。
2. 强制类型转换(向下转型)
向下转型是指将父类对象转换为子类类型。这种转换需要显式地进行,并且只有在对象的实际类型是子类时才安全。如果对象的实际类型不是子类,会抛出
ClassCastException。

示例:
public class Main {public static void main(String[] args) {Dog dog = new Dog();Animal animal = dog; // 向上转型//制向下转型Dog dog2 = (Dog) animal;dog2.bark(); // 可以调用子类特有的方法}
}
注意:
强制类型转换前,最好使用
instanceof关键字检查对象的实际类型,以避免异常。示例
if (animal instanceof Dog) {Dog dog2 = (Dog) animal; }
3. 类型转换的注意事项
-
类型兼容性:
-
只有存在继承关系的类之间才能进行类型转换。
-
例如,
Integer和String之间没有继承关系,不能互相转换。
-
4、instanceof 关键字:

如果对象是指定的类或接口的示例对象,则返回true,否则返回false
用于检查一个对象是否是某个类的实例。
示例
if (animal instanceof Dog) {Dog dog = (Dog) animal; }
// 定义 Animal 类
class Animal {public void shout() {System.out.println("动物叫……");}
}// 定义 Dog 类
class Dog extends Animal {// 重写 shout() 方法public void shout() {System.out.println("汪汪……");}public void eat() {System.out.println("吃骨头……");}
}// 定义测试类
public class Example17 {public static void main(String[] args) {Animal a1 = new Dog(); // 通过向上转型实例化 Animal 对象System.out.println("Animal a1 = new Dog() : " + (a1 instanceof Animal));System.out.println("Animal a1 = new Dog() : " + (a1 instanceof Dog));Animal a2 = new Animal(); // 实例化 Animal 对象System.out.println("Animal a2 = new Animal() : " + (a2 instanceof Animal));System.out.println("Animal a2 = new Animal() : " + (a2 instanceof Dog));}
}
输出

总结
Java 中的对象类型转换主要包括向上转型和向下转型:
向上转型:安全,自动完成,用于多态。
向下转型:需要显式转换,必须确保对象的实际类型是目标类型,否则会抛出异常。
在实际开发中,合理使用类型转换可以提高代码的灵活性和可维护性,但需要注意类型兼容性和安全性问题。
三、Object类

示例代码
// 定义 Animal 类
class Animal {// 定义动物叫的方法void shout() {System.out.println("动物叫!");}
}// 定义测试类
public class Example18 {public static void main(String[] args) {Animal animal = new Animal(); // 创建 Animal 类对象System.out.println(animal.toString()); // 调用 toString() 方法并打印}
}
![]()
一般情况下不会直接调用Object类中的方法,因为Object类中的方法并不适用于所有的子类,这时就需要对Object类中的方法进行重写,以满足实际开发需求。
例如:重写toString()方法
// 定义 Animal 类
class Animal {// 重写 Object 类的 toString() 方法public String toString() {return "这是一个动物。";}
}// 定义测试类
public class Example19 {public static void main(String[] args) {Animal animal = new Animal(); // 创建 animal 对象System.out.println(animal.toString()); // 调用 toString() 方法并打印}
}
四、内部类
Java 内部类(Inner Class)是一种特殊的类定义方式,它允许在一个类的内部定义另一个类。
内部类可以分为以下几种类型:
成员内部类:定义在类的内部,但不在任何方法中。
局部内部类:定义在方法或代码块中。
匿名内部类:没有类名的内部类,通常用于实现接口或继承类。
静态内部类:使用
static关键字修饰的内部类。
内部类的作用
(1) 逻辑分组
内部类可以将相关的类组织在一起,增强代码的逻辑性和可读性。例如,一个类的主要功能可以通过外部类实现,而辅助功能可以通过内部类实现。
(2) 访问控制
内部类可以访问外部类的成员变量和方法(包括私有成员)。这使得内部类能够更好地与外部类交互,实现更紧密的耦合。
(3) 实现回调
内部类常用于实现回调机制。例如,在 GUI 编程中,内部类可以用来处理事件(如按钮点击事件)。
(4) 多继承的替代
Java 不支持多重继承,但通过内部类可以实现类似的效果。内部类可以继承一个类,同时外部类可以继承另一个类。
(5) 代码复用
内部类可以被外部类的多个实例共享,从而提高代码的复用性。
(6) 简化代码
内部类可以简化某些复杂的代码结构,尤其是在需要实现接口或继承类时。

4-1、成员内部类

代码示例
class Outer {int m = 0; // 定义类的成员变量// 外部类方法 test1()void test1() {System.out.println("外部类成员方法 test1()");}// 下面的代码定义了成员内部类 Innerclass Inner {int n = 1;void show1() {// 在成员内部类的方法中访问外部类的成员变量 mSystem.out.println("外部类成员变量 m = " + m);// 在成员内部类的方法中访问外部类的成员方法 test1()test1();}void show2() {System.out.println("内部类成员方法 show2()");}}// 外部类方法 test2()void test2() {Inner inner = new Inner(); // 实例化内部类对象 innerSystem.out.println("内部类成员变量 n = " + inner.n); // 访问内部类变量和方法inner.show2();}
}public class Example20 {public static void main(String[] args) {Outer outer = new Outer(); // 实例化外部类对象 outerOuter.Inner inner = outer.new Inner(); // 实例化内部类对象 innerinner.show1(); // 在内部类中访问外部类的成员变量 m 和成员方法 test1()outer.test2(); // 在内部类中访问内部类的成员变量 n 和成员方法 show2()}
}
输出

4-2、局部内部类

class Outer {int m = 0; // 定义类的成员变量// 定义一个成员方法 test1()void test1() {System.out.println("外部类成员方法 test1()");}void test2() {// 定义一个局部内部类,在局部内部类中访问外部类变量和方法class Inner {int n = 1;void show() {System.out.println("外部类成员变量 m = " + m);test1();}}// 访问局部内部类中的变量和方法Inner inner = new Inner();System.out.println("局部内部类变量 n = " + inner.n);inner.show();}
}public class Example21 {public static void main(String[] args) {Outer outer = new Outer(); // 实例化外部类对象 outerouter.test2(); // 通过外部类对象 outer 调用创建了局部内部类的方法 test2()}
}
输出

4-3、静态内部类

class Outer {static int m = 0; // 定义类的静态变量// 下面的代码定义了一个静态内部类static class Inner {int n = 1;void show() {// 在静态内部类的方法中访问外部类的静态变量 mSystem.out.println("外部类静态变量 m = " + m);}}
}public class Example22 {public static void main(String[] args) {Outer.Inner inner = new Outer.Inner(); // 创建静态内部类的对象inner.show(); // 调用静态内部类的方法}
}
输出
![]()
4-4、匿名内部类


interface Animal { // 定义接口 Animalvoid shout(); // 定义抽象方法 shout()
}public class Example23 {public static void main(String[] args) {String name = "小花";animalShout(new Animal() { // 调用 animalShout() 方法,参数为匿名内部类@Override // 重写接口中的方法public void shout() {System.out.println(name + "喵喵……");}});}public static void animalShout(Animal an) { // 该方法参数为 Animal 接口类型an.shout();}
}
![]()


相关文章:
Java笔记5——面向对象(下)
目录 一、抽象类和接口 1-1、抽象类(包含抽象方法的类) 1-2、接口 编辑编辑 二、多态 编辑 1. 自动类型转换(向上转型) 示例: 注意: 2. 强制类型转换(向下转型) 示…...
NI的LABVIEW工具安装及卸载步骤说明
一.介绍 最近接到个转交的项目,项目主要作为上位机工具开发,在对接下位机时,有用到NI的labview工具。labview软件是由美国国家仪器(NI)公司研制开发的一种程序开发环境,主要用于汽车测试、数据采集、芯片测…...
[reinforcement learning] 是什么 | 应用场景 | Andrew Barto and Richard Sutton
目录 什么是强化学习? 强化学习的应用场景 广告和推荐 对话系统 强化学习的主流算法 纽约时报:Turing Award Goes to 2 Pioneers of Artificial Intelligence wiki 资料混合:youtube, wiki, github 今天下午上课刷到了不少࿰…...
css一些注意事项
css一些注意事项 .bg_ {background-image: url(/static/photo/activity_bg.png);background-size: 100% auto;background-repeat: no-repeat;background: linear-gradient(to bottom, #CADCEA, #E8F3F6);min-height: 100vh; } 背景图片路径正确但是并没有显示 // 方案1&…...
[从零开始学数据库] 基本SQL
注意我们的主机就是我们的Mysql数据库服务器 这里我们可以用多个库 SQL分类(核心是字段的CRUD)  重点是我…...
react/vue中前端多图片展示页面优化图片加载速度的五种方案
需求背景 在多项目中 例如官网项目中 会出现很多大图片显示的情况 这个时候就会出现图片过大 公司带宽不够之类导致页面加载速度过慢及页面出现后图片仍然占位但并未加载出来 或者因为网络问题导致图片区域黑块等等场景 这个时候我们就要对图片和当前场景进行优化 方案定…...
qt中的正则表达式
问题: 1.在文本中把dog替换成cat,但可能会把dog1替换成cat1,如果原本不想替换dog1,就会出现问题 2文本中想获取某种以.txt为结尾的多有文本,普通的不能使用 3如果需要找到在不同的系统中寻找换行符,可以…...
AT_abc400_e [ABC400E] Ringo‘s Favorite Numbers 3 题解
题目传送门 题目大意 题目描述 对于正整数 N N N,当且仅当满足以下两个条件时, N N N 被称为 400 number: N N N 恰好有 2 2 2 种不同的素因数。对于 N N N 的每个素因数 p p p, N N N 被 p p p 整除的次数为偶数次。更严…...
git 提交标签
Git 提交标签 提交消息格式: <type>: <description> (示例:git commit -m "feat: add user login API") 标签适用场景feat新增功能(Feature)。fix修复 Bug(Bug fix&…...
关于 Spring Batch 的详细解析及其同类框架的对比分析,以及如何自己设计一个java批处理框架(类似spring batch)的步骤
以下是关于 Spring Batch 的详细解析及其同类框架的对比分析: 一、Spring Batch 核心详解 1. 核心概念 作业(Job):批处理任务的顶层容器,由多个步骤(Step)组成。 步骤(Step&#…...
【Java面试系列】Spring Cloud微服务架构中的分布式事务实现与性能优化详解 - 3-5年Java开发必备知识
【Java面试系列】Spring Cloud微服务架构中的分布式事务实现与性能优化详解 - 3-5年Java开发必备知识 引言 在微服务架构中,分布式事务是一个不可避免的挑战。随着业务复杂度的提升,如何保证跨服务的数据一致性成为面试中的高频问题。本文将从基础到进…...
【第十三届“泰迪杯”数据挖掘挑战赛】【2025泰迪杯】【论文篇+改进】A题解题全流程(持续更新)
【第十三届“泰迪杯”数据挖掘挑战赛】【2025泰迪杯】【论文篇改进】A题解题全流程(持续更新) 写在前面: 我是一个人,没有团队,所以出的比较慢,每年只做一次赛题,泰迪杯,我会认真对…...
Linux系统常见磁盘扩容操作(Common Disk Expansion Operations in Linux Systems)
Linux系统常见磁盘扩容操作 目录说明 一、准备工作:获取目标磁盘信息 (1)确认分区表格式和文件系统 二、扩容已有MBR分区 (1)分区后扩容 ext为例 xfs为例 三、扩容已有GPT分区 (1)分区…...
数据结构——哈希详解
数据结构——哈希详解 目录 一、哈希的定义 二、六种哈希函数的构造方法 2.1 除留取余法 2.2 平方取中法 2.3 随机数法 2.4 折叠法 2.5 数字分析法 2.6 直接定值法 三、四种解决哈希冲突的方法 3.1 开放地址法 3.1.1 线性探测法 3.1.2 二次探测法 3.2 链地址法 3…...
Spark-SQL核心编程
简介 Hadoop与Spark-SQL的对比 Hadoop在处理结构化数据方面存在局限性,无法有效处理某些类型的数据。 Spark应运而生,特别设计了处理结构化数据的模块,称为Spark SQL(原称Shark)。 SparkSQL的发展历程: Sp…...
pywebview 常用问题分享
文章目录 前言问题描述与方案(待补充)1、动态设置本地调试目录和打包目录2、构建后运行程序白屏 前言 最近做一个pywebview项目,遇到了一些问题,记录一下,分享给大家,希望能帮助有遇到相似问题的人事。 问题描述与方案(待补充) …...
系统设计模块之安全架构设计(身份认证与授权(OAuth2.0、JWT、RBAC/ABAC))
一、OAuth 2.0:开放授权框架 OAuth 2.0 是一种标准化的授权协议,允许第三方应用在用户授权下访问其资源,而无需直接暴露用户密码。其核心目标是 分离身份验证与授权,提升安全性与灵活性。 1. 核心概念与流程 角色划分ÿ…...
Docker 与 Podman常用知识汇总
一、常用命令的对比汇总 1、基础说明 Docker:传统的容器引擎,使用 dockerd 守护进程。 Podman:无守护进程、无root容器引擎,兼容 Docker CLI。 Podman 命令几乎完全兼容 Docker 命令,只需将 docker 替换为 podman。…...
如何通过自动化解决方案提升企业运营效率?
引言 在现代企业中,运营效率直接影响着企业的成本、速度与竞争力。尤其是随着科技的不断发展,传统手工操作和低效的流程逐渐无法满足企业的需求。自动化解决方案正成为企业提升运营效率、降低成本和提高生产力的关键。无论是大型跨国公司,还…...
unity100天学习计划
以下是一个为期100天的Unity学习大纲,涵盖从零基础到独立开发完整游戏的全流程,结合理论、实践和项目实战,每天学习2-3小时: 第一阶段:基础奠基(Day 1-20) 目标:掌握Unity引擎基础与C#编程 Day 1-5:引擎入门 安装Unity Hub和Unity Editor(LTS版本)熟悉Unity界面:S…...
多坐标系变换全解析:从相机到WGS-84的空间坐标系详解
多坐标系变换全解析:从相机到WGS-84的空间坐标系详解 一、常见坐标系简介二、各坐标系的功能和使用场景1. WGS-84 大地坐标系(经纬高)2. 地心直角坐标系(ECEF)3. 本地 ENU / NED 坐标系4. 平台坐标系(Body)5. 相机坐标系三、坐标变换流程图四、如何选用合适的坐标系?五…...
SpringCloud Alibaba 之分布式全局事务 Seata 原理分析
1. 什么是 Seata?为什么需要它? 想象一下,你去银行转账: 操作1:从你的账户扣款 1000 元操作2:向对方账户增加 1000 元 如果 操作1 成功,但 操作2 失败了,你的钱就凭空消失了&…...
作业帮前端面试题及参考答案 (100道面试题-上)
HTML5 的优势是什么? HTML5 作为 HTML 语言的新一代标准,具有众多显著优势,为现代网页开发带来了诸多便利与革新。 在语义化方面,HTML5 引入了大量具有明确语义的标签,如<header>、<nav>、<article>、<section>、<aside>、<footer>等…...
Large Language Model(LLM)的训练和微调
之前一个偏工程向的论文中了,但是当时对工程理论其实不算很了解,就来了解一下 工程流程 横轴叫智能追寻 竖轴上下文优化 Prompt不行的情况下加shot(提示),如果每次都要加提示,就可以试试知识库增强检索来给提示。 如果希望增强…...
统计销量前十的订单
传入参数: 传入begin和end两个时间 返回参数 返回nameList和numberList两个String类型的列表 controller层 GetMapping("/top10")public Result<SalesTop10ReportVO> top10(DateTimeFormat(pattern "yyyy-MM-dd") LocalDate begin,Dat…...
AI大模型原理可视化工具:深入浅出理解大语言模型的工作原理
AI大模型原理可视化工具:深入浅出理解大语言模型的工作原理 在人工智能快速发展的今天,大语言模型(如GPT、BERT等)已经成为改变世界的重要技术。但对于很多人来说,理解这些模型的工作原理仍然是一个挑战。为了帮助更多…...
MCP 认证考试常见技术难题实战分析与解决方案
MCP(Microsoft Certified Professional)认证考试在全球范围内被广泛认可,是衡量个人在微软技术领域专业能力的重要标准。然而,在备考和参加 MCP 认证考试过程中,考生常常会遇到各种技术难题。以下将对一些常见技术难题进行实战分析,并提供相应的解决方案。 一、网络配…...
qt designer 创建窗体选择哪种屏幕大小
1. 新建窗体时选择QVGA还是VGA 下面这个图展示了区别 这里我还是选择默认,因为没有特殊需求,只是在PC端使用...
Spark-SQL核心编程(一)
一、Spark-SQL 基础概念 1.定义与起源:Spark SQL 是 Spark 用于结构化数据处理的模块,前身是 Shark。Shark 基于 Hive 开发,提升了 SQL-on-Hadoop 的性能,但因对 Hive 依赖过多限制了 Spark 发展,后被 SparkSQL 取代&…...
Android WiFi获取动态IP地址
Android开发中获取WiFi动态IP地址可通过以下方法实现,需结合网络状态管理和API调用: 一、权限配置 在AndroidManifest.xml中添加必要权限: <uses-permission android:name"android.permission.ACCESS_WIFI_STATE" /> <…...



