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

【day13】深入面向对象编程

【day12】回顾

在正文开始之前,先让我们回顾一下【day12】中的关键内容:

  1. 接口(Interface)

    • interface关键字用于定义接口。
    • implements关键字用于实现接口。
  2. 接口成员

    • 抽象方法:需要在实现类中重写。
    • 默认方法:可以被重写也可以不重写。
    • 静态方法:可以直接通过接口名调用。
    • 成员变量:通常是public static final的常量。
  3. 接口特点

    • 支持多继承。
    • 支持多实现。
    • 一个类可以实现多个接口。
  4. 多态(Polymorphism)

    • 前提条件:子父类继承关系、方法重写、父类引用指向子类对象。
    • 好处:扩展性强,可以使用父类类型接口传递任意子类对象。
    • 弊端:不能直接调用子类特有方法。
    • 转型:向上转型和向下转型。
    • 成员访问特点:成员变量看等号左边是谁,成员方法看new的是谁。
    • 转型问题:类型转换异常ClassCastException
    • 类型判断:instanceof

模块12重点

本模块我们将深入探讨以下面向对象编程的高级主题:

  1. final关键字修饰成员变量的特点。
  2. 静态代码块的使用场景和实现。
  3. 匿名内部类的使用。
  4. 权限修饰符的深入理解和应用。

第一章:权限修饰符

1. 概述

Java提供了四种访问权限修饰符,它们决定了成员的访问范围:

  • public:最广的访问范围,任何地方都可以访问。
  • protected:在同包和子类中可以访问。
  • 默认(无修饰符):仅在同包内可以访问。
  • private:仅在定义它的类内部可以访问。

2. 不同权限的访问能力

publicprotecteddefault(空的)private
同类yesyesyesyes
同包不同类yesyesyesno
不同包子父类yesyesnono
不同包非子父类yesnonono

3. 权限修饰符的使用建议

  • 属性:使用private,遵循封装原则。
  • 成员方法:使用public,便于调用。
  • 构造方法:使用public,便于创建对象。

第二章:final关键字

1. final修饰类

final修饰的类不能被继承。

public final class Animal {
}

2. final修饰方法

final修饰的方法不能被重写。

public abstract class Animal {public final void eat() {System.out.println("动物要干饭");}
}

3. final修饰局部变量

final修饰的变量不能二次赋值。

public class Test01 {public static void main(String[] args) {final int i = 10;//i = 20; 错误:变量i已经被final修饰,不能二次赋值}
}

4. final修饰对象

final修饰的对象,其地址值不能改变,但对象内部状态可以改变。

public class Person {private String name;private int age;public Person() {}public Person(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}
}
public class Test02 {public static void main(String[] args) {//Person p1 = new Person("金莲",26);//System.out.println(p1);//地址值//p1 = new Person("涛哥",18);//System.out.println(p1);//地址值final Person p1 = new Person("金莲",26);System.out.println(p1);//地址值//p1 = new Person("涛哥",18);//System.out.println(p1);//地址值p1.setName("大郎");p1.setAge(30);System.out.println(p1.getName()+"..."+p1.getAge());}
}

在这里插入图片描述

5. final修饰成员变量

final修饰的成员变量需要手动赋值,且不能二次赋值。

public class Student {final String name = "广坤";// 有参构造现在属于二次赋值了/*public Student(String name) {this.name = name;}*/
}

第三章:代码块

1. 构造代码块

构造代码块优先于构造方法执行,每new一次就会执行一次。

public class Person {public Person() {System.out.println("我是无参构造方法");}{System.out.println("我是构造代码块");}
}

2. 静态代码块

静态代码块优先于构造代码块和构造方法执行,且只执行一次。

public class Person {public Person() {System.out.println("我是无参构造方法");}{System.out.println("我是构造代码块");}static {System.out.println("我是静态代码块");}
}

3. 静态代码块使用场景

静态代码块适用于初始化只需要执行一次的静态成员。
在这里插入图片描述

第四章:内部类

当一个事物的内部,还有一个部分需要完整的结构去描述,而这个内部的完整结构又只为外部事物提供服务,那么整个内部的完成结构最好使用内部类

比如: 人类都有心脏,人类本身需要用属性,行为去描述,那么人类内部的心脏也需要心脏特殊的属性和行为去描述,此时心脏就可以定义成内部类,人类中的一个心脏类

1. 静态成员内部类

静态内部类可以被finalabstract修饰,且不能调用外部的非静态成员。

public class Person {public void eat() {System.out.println("人要干饭");}static class Heart {public void jump() {System.out.println("心脏哐哐哐跳");}}
}public class Test01 {public static void main(String[] args) {// 外部类.内部类 对象名 = new 外部类.内部类()Person.Heart heart = new Person.Heart();heart.jump();}
}

2. 非静态成员内部类

非静态内部类可以访问外部类的所有成员,包括私有成员。

public class Person {public void eat() {System.out.println("人要干饭");}class Heart {public void jump() {System.out.println("心脏哐哐哐跳");}}
}public class Test01 {public static void main(String[] args) {// 外部类.内部类 对象名 = new 外部类().new 内部类()Person.Heart heart = new Person(). new Heart();heart.jump();}
}

外部类的成员变量和内部类的成员变量以及内部类的局部变量重名时,怎么区分?

public class Student {String name = "金莲";class Heart{String name = "大郎";public void display(String name){System.out.println(name);//内部类的局部变量System.out.println(this.name);//内部类的成员变量System.out.println(Student.this.name);//外部类的成员变量}}
}public class Test02 {public static void main(String[] args) {Student.Heart heart = new Student().new Heart();heart.display("涛哥");}
}

3. 局部内部类

局部内
部类可以定义在方法中、代码块中、构造中。

public class Person {public void eat() {class Heart {public void jump() {System.out.println("心脏哐哐哐的跳");}}new Heart().jump();}
}public class Test01 {public static void main(String[] args) {Person person = new Person();person.eat();}
}

4. 匿名内部类

匿名内部类是没有显式声明类名的内部类,常用于简化代码和实现接口。

问题描述: 我们如果想实现接口,简单使用一次抽象方法,我们就需要创建一个实现类,实现这个接口,重写抽象方法,还要new实现类对象,所以我们在想如果就单纯的想使用一次接口中的方法,我们能不能不这么麻烦呢?可以

  • 创建实现类,实现接口
  • 重写方法
  • 创建实现类对象
  • 调用方法

如果就想单纯的使用一下接口中的方法,我们就没必要经过以上四步了,我们可以四合一

匿名内部类怎么学:就按照一种格式来学,这一种格式就代表了实现类对象或者子类对象

 new 接口/抽象类(){重写方法}.重写的方法();=================================类名 对象名 = new 接口/抽象类(){重写方法}对象名.重写的方法();
public interface USB {void open();void close();
}public class Test01 {public static void main(String[] args) {new USB(){@Overridepublic void open() {System.out.println("usb打开了");}@Overridepublic void close() {System.out.println("usb关闭了");}}.open();System.out.println("===================");USB usb = new USB() {@Overridepublic void open() {System.out.println("USB打开了");}@Overridepublic void close() {System.out.println("USB关闭了");}};usb.open();usb.close();}
}

在这里插入图片描述

  1. 什么时候使用匿名内部类: 当简单调用一次接口中的方法,我们就可以使用匿名内部类

  2. 将一种格式代表实现类对象或者子类对象来看待,来学习

  3. 匿名内部类会编译生成的,咱们不要管,我们只需要利用咱们讲的格式去new对象,调用重写的方法即可

相关文章:

【day13】深入面向对象编程

【day12】回顾 在正文开始之前,先让我们回顾一下【day12】中的关键内容: 接口(Interface): interface关键字用于定义接口。implements关键字用于实现接口。 接口成员: 抽象方法:需要在实现类中…...

《 火星人 》

题目描述 人类终于登上了火星的土地并且见到了神秘的火星人。人类和火星人都无法理解对方的语言,但是我们的科学家发明了一种用数字交流的方法。这种交流方法是这样的,首先,火星人把一个非常大的数字告诉人类科学家,科学家破解这…...

盒子模型(内边距的设置)

所有元素都可以设置内边距属性和外边距属性大体相同,可参考上一篇,但有区别 内边距不能设置为负值padding-方向:尺寸 注意:使用内边距padding之后元素整体会变大,因为他是直接加上了内边距的大小,不改变元素…...

CentOS7网络配置,解决不能联网、ping不通外网、主机的问题

1. 重置 关闭Centos系统 编辑->虚拟网络编辑器 还原默认设置 2. 记录基本信息 查看网关地址,并记录在小本本上 查看网段,记录下 3. 修改网卡配置 启动Centos系统 非root用户,切换root su root查看Mac地址 ifconfig 或 ip addr记录下来 修改配置文件 vim /et…...

如何测继电器是否正常

继电器是一种电控制器件,广泛应用于自动控制、电力保护等领域。为了确保继电器的正常工作,定期检测其状态是非常必要的。以下是一些常用的方法来测试继电器是否正常工作: 1. 视觉检查: - 观察继电器的外观是否有损坏、变形或烧焦…...

最优二叉搜索树【东北大学oj数据结构10-4】C++

题面 最优二叉搜索树是由 n 个键和 n1 个虚拟键构造的二叉搜索树,以最小化搜索操作的成本期望值。 给定一个序列 Kk1​,k2​,...,kn​,其中 n 个不同的键按排序顺序 ,我们希望构造一个二叉搜索树。 对于每个关键 ki​,我们有一个…...

ESP32应用开发-Webserver

文章目录 库调用实例实现思路技术要点 1. 前端涉及的文件需要包装再发送2. http-GET路由3. http-POST路由 开发环境&#xff1a;Arduino 库调用 #include <WebServer.h> #include <ArduinoJson.h> //IDE没有自带&#xff0c;需自行安装实例 WebServer server…...

【IMU:视觉惯性SLAM系统】

视觉惯性SLAM系统简介 相机&#xff08;单目/双目/RGBD)与IMU结合起来就是视觉惯性&#xff0c;通常以单目/双目IMU为主。 IMU里面有个小芯片可以测量角速度与加速度&#xff0c;可分为6轴(6个自由度)和9轴&#xff08;9个自由度&#xff09;IMU&#xff0c;具体的关于IMU的介…...

前端开发 之 12个鼠标交互特效下【附完整源码】

前端开发 之 12个鼠标交互特效下【附完整源码】 文章目录 前端开发 之 12个鼠标交互特效下【附完整源码】七&#xff1a;粒子烟花绽放特效1.效果展示2.HTML完整代码 八&#xff1a;彩球释放特效1.效果展示2.HTML完整代码 九&#xff1a;雨滴掉落特效1.效果展示2.HTML完整代码 十…...

Unity文件路径访问总结:从基础到高级的资源加载方法

在Unity开发中&#xff0c;文件路径的访问和资源加载是开发者经常需要处理的任务。无论是加载纹理、模型、音频&#xff0c;还是读取配置文件&#xff0c;正确地处理路径和资源加载是确保项目顺利运行的关键。本文将以Unity文件路径访问为主线&#xff0c;详细介绍Unity中常见的…...

AWS Transfer 系列:简化文件传输与管理的云服务

在数字化转型的今天&#xff0c;企业对文件传输、存储和管理的需求日益增长。尤其是对于需要大量数据交换的行业&#xff0c;如何高效、可靠地传输数据成为了一大挑战。为了解决这一难题&#xff0c;AWS 提供了一系列的文件传输服务&#xff0c;统称为 AWS Transfer 系列。这些…...

Jenkins Api Token 访问问题

curl --location http://192.168.18.202:8080/view/ChinaFish/job/Ali/buildWithParameters?token1142be281174ee8fdf58773dedcef7ea4c&DeployTypeUpdateConfig \ --header Authorization: •••••• \ --header Cookie: JSESSIONID.824aa9a5node01ojk9yhh3imc24duwy67…...

垂起固定翼无人机大面积森林草原巡检技术详解

垂起固定翼无人机大面积森林草原巡检技术是一种高效、精准的监测手段&#xff0c;以下是对该技术的详细解析&#xff1a; 一、垂起固定翼无人机技术特点 垂起固定翼无人机结合了多旋翼和固定翼无人机的优点&#xff0c;具备垂直起降、飞行距离长、速度快、高度高等特点。这种无…...

【Leetcode 每日一题】1387. 将整数按权重排序

问题背景 我们将整数 x x x 的 权重 定义为按照下述规则将 x x x 变成 1 1 1 所需要的步数&#xff1a; 如果 x x x 是偶数&#xff0c;那么 x x / 2 x x / 2 xx/2。如果 x x x 是奇数&#xff0c;那么 x 3 x 1 x 3 \times x 1 x3x1。 比方说&#xff0c; x …...

科研笔记 KDD 2025

1 基本介绍 KDD 每年有多次投稿周期。KDD 2025 将有两个截止时间&#xff1a;分别是 2024 年 8 月 1 日和 2025 年 2 月 1 日&#xff08;全文提交截止时间在摘要提交截止后一周&#xff09;。 同时&#xff0c;KDD 会议论文集&#xff08;Proceedings&#xff09;将分两批出…...

黑马Java面试教程_P8_并发编程

系列博客目录 文章目录 系列博客目录前言1.线程的基础知识1.1 线程和进程的区别&#xff1f;难2频3面试文稿 1.2 并行和并发有什么区别&#xff1f; 难1频1面试文稿 1.3 创建线程的四种方式 难2频4面试文稿 1.4 runnable 和 callable 有什么区别 难2频3面试文稿 1.5 线程的 run…...

网络视频监控平台/安防监控/视频综合管理Liveweb视频汇聚平台解决方案

一、当前现状分析 当前视频资源面临以下问题&#xff1a; 1&#xff09;不同单位在视频平台建设中以所属领域为单位&#xff0c;设备品牌众多&#xff0c;存在的标准不一&#xff0c;各系统之间也没有统一标准&#xff1b; 2&#xff09;各单位视频平台建设分散、统筹性差&am…...

workman服务端开发模式-应用开发-后端api推送修改二

需要修改两个地方&#xff0c;第一个是总控制里面的续token延时&#xff0c;第二个是操作日志记录 一、总控续token延时方法 在根目录下app文件夹下controller文件夹下Base.php中修改isLoginAuth方法&#xff0c;具体代码如下&#xff1a; <?php /*** 总控制* User: 龙哥…...

SQL 使用带聚集函数的联结

聚集函数用于汇总数据&#xff0c;通常用于从一个表中计算统计信息&#xff0c;但也可以与联结一起使用。以下是一个例子&#xff0c;展示如何使用聚集函数统计每个顾客的订单数。 示例 1&#xff1a;使用 COUNT() 函数与 INNER JOIN 假设我们需要检索所有顾客及每个顾客所下…...

Restaurants WebAPI(三)——Serilog/FluenValidation

文章目录 项目地址一、Serilog使用1.1 安装 Serilog1.2 注册日志服务1.3 设置日志级别和详情1.4 配置到文件里1.5 给不同的环境配置日志1.5.1 配置appsettings.Development.json二、Swagger的使用三、自定义Exception中间件3.1 使用FluentValidation项目地址 教程作者:教程地址…...

Stable Diffusion像素艺术工作站实战:Pixel Fashion Atelier Forge Scale调优指南

Stable Diffusion像素艺术工作站实战&#xff1a;Pixel Fashion Atelier Forge Scale调优指南 1. 像素时装锻造坊简介 Pixel Fashion Atelier是一款基于Stable Diffusion与Anything-v5的图像生成工作站&#xff0c;专为像素艺术创作而设计。与传统AI工具不同&#xff0c;它采…...

【一键养龙虾】阿里云OpenClaw快速部署方案,两步拥有专属龙虾AI助理!

还在羡慕别人拥有能“动手干活”的AI数字员工吗&#xff1f;还在为复杂的本地环境配置、端口映射和依赖冲突而头疼吗&#xff1f;别急&#xff0c;阿里云推出了OpenClaw快速部署方案&#xff0c;官方镜像一键部署&#xff0c;只需两步&#xff0c;轻松拥有专属“龙虾AI”助理&a…...

从.proto文件到gRPC服务:手把手教你用Protobuf 3.21.11构建跨语言API

从.proto文件到gRPC服务&#xff1a;Protobuf 3.21.11构建跨语言API实战指南 在微服务架构盛行的今天&#xff0c;不同语言编写的服务之间如何高效通信成为开发者必须面对的挑战。想象这样一个场景&#xff1a;你的Go语言后台服务需要与Python数据分析服务共享用户数据&#xf…...

Detectron2特征图热力可视化实战:从Faster R-CNN到自定义网络

1. 为什么需要特征图热力可视化 当你训练一个目标检测模型时&#xff0c;有没有遇到过这样的困惑&#xff1a;模型在某些场景下表现很好&#xff0c;但在另一些场景却频频出错&#xff1f;作为算法工程师&#xff0c;我们往往只能看到最终的检测结果&#xff0c;却不知道模型内…...

Unity入门:从零开始认识Unity编辑器界面

Unity入门&#xff1a;从零开始认识Unity编辑器界面&#x1f4da; 本章学习目标&#xff1a;深入理解从零开始认识Unity编辑器界面的核心概念与实践方法&#xff0c;掌握关键技术要点&#xff0c;了解实际应用场景与最佳实践。本文属于《Unity工程师成长之路教程》Unity入门篇&…...

深入解析UniApp中的package.json:从基础配置到高级技巧

1. 初识UniApp中的package.json 第一次接触UniApp项目时&#xff0c;我盯着package.json文件看了半天&#xff0c;心想这不就是个管理npm包依赖的配置文件吗&#xff1f;直到踩了几个坑才发现&#xff0c;UniApp对这个文件做了特殊扩展&#xff0c;让它成为了项目配置的中枢神经…...

【Python实战解析】从数据爬取到房价预测:一个完整的数据科学项目实战

1. 从零开始&#xff1a;房产数据爬取实战 第一次做房产数据爬取时&#xff0c;我盯着满屏的HTML标签差点崩溃。但后来发现&#xff0c;只要掌握几个关键技巧&#xff0c;爬取房产网站数据其实比想象中简单得多。我们这次要爬取的是长沙二手房数据&#xff0c;包含户型、面积、…...

HY-MT1.5-1.8B优化技巧:如何提升翻译速度与内存效率

HY-MT1.5-1.8B优化技巧&#xff1a;如何提升翻译速度与内存效率 1. 引言 在移动设备和边缘计算场景下&#xff0c;机器翻译模型面临着内存受限和实时性要求的双重挑战。HY-MT1.5-1.8B作为一款专为轻量级部署设计的翻译模型&#xff0c;其18亿参数的紧凑架构已经展现出卓越的性…...

OpenClaw设备控制:Qwen3-32B通过USB接口操作硬件实验

OpenClaw设备控制&#xff1a;Qwen3-32B通过USB接口操作硬件实验 1. 为什么选择OpenClaw做硬件控制&#xff1f; 去年夏天&#xff0c;我在工作室调试一个温控风扇项目时&#xff0c;发现传统嵌入式开发存在一个痛点&#xff1a;每次修改控制逻辑都需要重新烧录固件。当我偶然…...

ChatGPT越狱指令最新版:原理剖析与安全实践指南

ChatGPT越狱指令最新版&#xff1a;原理剖析与安全实践指南 最近在AI开发者圈子里&#xff0c;关于大语言模型“越狱”的话题又热了起来。所谓“越狱”&#xff0c;就是指通过各种技巧绕过模型内置的安全限制&#xff0c;让它回答一些原本被禁止的问题。作为开发者&#xff0c;…...