java面向对象从入门到入土
面向对象进阶
(写程序的套路)
面向:拿,找
对象:能干活的东西
面向对象编程:拿东西过来做对应的事情
(写程序的套路)
面向:拿,找
对象:能干活的东西
面向对象编程:拿东西过来做对应的事情

重点学习:学习已有对象并使用,学习如何自己设计对象并使用
设计对象并使用
类和对象:
类(设计图):是对象共同特征的描述
对象:是真实存在的具体的东西
在java中,必须先设计类,才能获得对象

如何定义类:

使用对象:
访问属性:对象名.成员变量
访问行为:对象名.方法名()
类的补充注意事项
用来描述一类事物的类,专业叫做:javabean类,在javabean类中,是 不写main方法的
在以前,编写main方法的类,叫做测试类。我们可以在测试类中创建javabean类的对象并进行赋值调用

一般一开始成员变量不给值,而是创建变量后给值

注意:
类名首字母建议大写,英文,有意义,满足驼峰模式,不能用关键字,满足标识符规定
一个java文件中可以定义多个类,但是只能一个类是public修饰的
public修饰的类名必须是java代码的文件名称
成员变量的完整定义格式是:修饰符 数据类型 变量名称 =初始化值;
一般无需指定初始化值
开发中类的设计
封装
面向对象的三大特征:封装 继承 多态
封装:如何正确的设计对象的属性和代码
原则:对象代表什么,就得封装对应的数据,并提供数据对应的行为
例子:人画圆,人关门
封装的好处
private关键字
权限修饰符
可以修饰成员(成员变量和成员方法)
被private修饰的成员只能在本类中才能访问
过滤通道

this关键字
主要是解决同一单词的变量并加以区分:区分成员变量和局部变量
成员变量和局部变量,就近原则:谁离我近,我就用谁
局部变量,表示测试类中调用方法传递过来的数据

this.age用的是成员变量
构造方法(构造器,构造函数)
创建对象的时候,由虚拟机自动调用,给成员变量进行初始化的
作用:在创建对象的时候给成员变量进行赋值
Studet s =new Studet();
创建对象,调用的空参构造
如果我们没有写任何的构造方法
那么虚拟机会给我们加一个空参构造方法

构造方法注意事项:
如果没有定义构造方法,系统将给出一个默认的无参数构造方法
如果定义了构造方法,系统将不再提供默认的构造方法
构造方法的重载:
带参构造方法,和无参数构造方法,两者办法名相同,但是参数不同,这叫做构造方法的重载
无论是否使用,都手动书写无参数构造方法,和带全部参数的构造方法
种类:
无参数构造方法:初始化对象时,成员变量的数据均采用默认值
有参数构造方法:在初始化对象时,同时可以为对象进行赋值
标准的javabean类
类名需要见名知意
成员变量使用private修饰
提供至少两个构造方法
无参数构造方法
带全部参数的构造方法
成员方法
提供每一个成员变量对应的setXxx()/getXxx()
如果还有其他行为,也需要加上
快捷键:alt +insert
插件PTG 1秒生成标准javabean
对象内存图


加载字节码文件归属元空间

一个对象的内存图
Student s =new Student();
1.加载class文件
2.申明局部变量
3.在堆内存中开辟一个空间
4.默认初始化
5.显式初始化;成员变量一开始在类中给他赋值
6.构造方法初始化
7.将堆内存中的地址值赋值给左边的局部变量

main方法结束,堆内存也消失

只要出现了new,就在堆内存开辟了一个空间

null赋值给stu1,说明stu1没有指向任何空间
要是栈内存中没有任何变量指向堆内存中的一个空间,那么这个堆内存的空间就报废了
基本数据类型和引用数据类型
基本数据类型:记录的时真实的数据值

引用数据类型:使用其他空间的数据


从内存的角度去解释
基本数据类型:数据值是存储在自己的空间中
特点:赋值给其他变量,也是赋的真实的值
引用数据类型:数据值是村塾在其他空间中,自己空间中存储的是地址值
特点:赋值给其他变量,赋的地址值
Student 是=new Student();
Student s2= s1;
this的内存原理
this作用:区分局部变量和成员变量
this本质:所在方法调用者的地址值


成员变量和局部变量的区别
成员变量:类中方法外的变量, 有默认初始化值,堆内存的对象,对象创建而存在,随着对象的消失而消失,在整个类中有效
局部变量:方法中的变量,没有默认初始化值,使用之前需要赋值,栈内存的方法。随着方法的调用二存在,随着方法的运行而消失,当前方法中有效

static-静态变量
ctrl+d向下复制一行
shift+alt+下键,向下移动一行
构造:选中代码,alt+ins。
鼠标滚轮按着不动竖着选或者alt不松加鼠标左键
如果在一个类里的属性假如加上static,就只能被赋值一次
public static String *teachername*;
static表示静态,是java中的一个修饰符,可以修饰成员方法,成员变量
| 被static修饰的成员变量,叫做静态变量 | 被static修饰的成员方法,叫做静态方法 |
|---|---|
| 特点:1.被该类所有对象共享 2.不属于对象,属于类3.随着类的加载而加载,优先于对象存在 | 特点:1.多在测试类和工具类使用 2.javabean类很少会使用 |
| 调用方式:1.类名调用(推荐)2.对象名调用 | 调用方式:1.类名调用(推荐)2.对象名调用 |
不加public和加了有什么区别?
static内存图:静态变量是随着类的加载而加载的,优先于对象出现的


工具类
帮助我们做一些事情,但是不描述任何事物的方法
javabean类:用来描述 一类事物的类。比如,Student,Teacher,Dog,Cat等
测试类:用来检查其他类是否书写正确,带有main方法的类,是程序的主入口
工具类:不是用来描述一类事物的,而是帮我们做一些事情的类
类名见名知意;
私有化构造方法:不要在外部创建对象
方法定义为静态的:方便调用
static的注意事项
- 静态方法只能访问静态变量进和静态方法
- 非静态方法可以访问静态变量或者静态方法,也可以访问非静态的成员变量和非静态的成员方法
- 静态方法中是没有this关键字
总结:
静态方法中,只能访问静态。非静态成员变量和成员方法
非静态方法可以访问所有
静态方法中没有this关键字
代码方面理解
//this:表示当前方法调用者的地址值
//这个this:是虚拟机赋值的
this:分辨每个实例的属性
public void show(Student this){System.out.println(this.name+","+age+","+gender);//可以在里面假如this}
s1.show();
s2.show();
静态方法没有this关键字
内存方面解释
静态随着类的加载而加载,非静态跟对象有关的
静态方法只能访问静态:
静态方法不能调用实例变量,对象还没有



重新认识main方法
public static void main(String[] args) {
- public:被jvm调用,访问权限足够大
- static:被jvm调用,不是创建对象,直接类名访问,因为main方法是静态的,所以测试类中其他方法也需要是静态的
- void:被JVM调用,不需要给JVM返回值
- main:一个通用的名称,虽然不是关键字,但是被JVM识别
- String[] args:以前用于接受键盘录入数据,现在没用(edit confuguration)
继承
**封装:**对象代表什么,就得封装什么样的数据,并提供数据对应的行为
继承:
- java中提供一个extends,用这个关键字,我们可以让一个类和另一个类建立起继承关系
- public class Student extends Person{}
- Student称为子类(派生类),person称为父类(基类或超类)
使用继承的好处:
- 可以把多个子类中重复的代码抽取到父类中,提高代码的复用性
- 子类可以在父类的基础上,增加其他的功能,使子类更强大
需要学习的点;
- 自己设计
- 什么时候用继承
- 当类与类之间,存在相同(共性)的内容,并满足子类是父类中的一种,就可以考虑使用继承,来优化代码
- 什么时候用继承
- 用别人写的
继承的特点
java只支持单继承,不支持多继承,但支持多层继承
- 单继承:一个子类只能继承一个父类
- 不支持多继承:子类不能同时继承多个父类(C++可以)
- 如果两个父类方法冲突就矛盾了
- 多层继承:子类A继承父类B,父类B可以继承父类C
- 间接父类和直接父类
- 每一个类都直接或者间接的继承与object
继承体系

画图法设计:从下往上画,提取共性到父类
写代码从上往下

注意:子类只能访问父类中的非私有成员
子类到底能继承父类中的哪些内容
内存图
父类中有的东西:
| 构造方法 | 非私有 不能 | private 不能 |
|---|---|---|
| 成员变量 | 非私有 能 | private 能(私有不能直接使用) |
| 成员方法 | 非私有 能 | private 不能 |
继承和调用不是一个东西,有的时候虽然子类把父类的东西拿过来了,但是调用不了
构造方法是否可以被继承

public类类名要和文件名保持一致
成员变量是否可以被继承
方法区加载 class字节码文件先加载子类然后加载父类,然后继承成员变量
其实还有一个object加载出来,但没什么关系
成员变量赋值,先找右边子类然后找左边父类

栈里的方法运行完出栈,堆内存的相关的对象就被清理

由private修饰时,给父类private修饰的成员变量赋值时,先在右边的子类找,没找到,再到左边的父类找,但这时是找不到的
成员方法是否可以被继承
子类可以继承父类的虚方法,找c的虚方法,直接在虚方法表里面找,如果不是虚方法,就逐级向上去找方法


- 运行到main时,方法区加载TestStudent字节码文件和main()方法
- 在运行到Zi z时,在方法区加载Zi.class字节码文件和其所有的成员方法,然后看到extends fu就在方法区加载Fu.class字节码文件和其所有的成员方法,然后默认加载其父类object.class的字节码文件和其所有的成员方法,然后object将其虚方法放入虚方法表传入子类,一直到叶子子类
- 在运行到new时,在堆内存加载出一个地址,放入其成员变量(因为没有就没放),左边父类,右边子类
- 调用方法时,先看其是不是虚方法,如果是就直接在虚方法表里面找,然后将方法进栈,执行。如果不是虚方法,就在叶子子类找,如果找到就执行。没有找到,向父类找,找到后报错
内存分析工具验证
ctrl+n查看方法
ctrl+f12查看方法具体
继承中:成员变量的访问特点
**就近原则:**谁离我近,我就用谁
- 先局部,再本类的成员位置,再父类的成员位置
- 重名用this和super

**注意:**上图最多调用一个super到父类,没有两个super。
继承中:成员方法的访问特点
直接调用满足就近原则:谁离我近,我就用谁
super调用,直接访问父类
不带引用对象的方法调用隐含了this
方法的重写:
当父类的方法不能满足子类现在的需求,需要进行方法重写
**书写格式:**在继承体系中,子类出现了和父类中一模一样的方法声明,我们就称子类这个方法是重写的方法
**@Override重写注解:(**注解是给虚拟机和程序员看的)
- @Override是放在重写后的方法上,校验子类重写时语法是否正确
- 加上注解后如果由红色波浪线,表示语法错误
- 建议重写方法都加上@Override注解,代码安全,优雅!
方法重写的本质:
本质覆盖虚方法表中的方法

方法重写注意事项和要求:
- 重写方法的名称,形参列表必须与父类中的一致
- 子类重写父类方法时,访问权限子类必须大于父类(空着不写<protected<public)
- 子类重写父类方法时,返回值类型子类必须小于等于父类
- 建议:重写的方法尽量和父类保持一致
- 私有方法不能被重写**(只有被添加到虚方法表中的方法才能被重写)**
- 子类不能重写父类的静态方法,如果重写会报错的**(只有被添加到虚方法表中的方法才能被重写)**
继承中:构造方法的访问特点
- 父类中的构造方法不会被子类继承
- 子类中所有的构造方法默认先访问父类中的无参构造,再执行自己
- 原因:
- 子类在初始化的时候,有可能会使用到父类中的数据,如果父类没有完成初始化,子类将无法使用父类的数据
- 子类初始化之前,一定要调用父类构造方法先完成父类数据空间的初始化
怎么调用父类构造方法的?
- 子类构造方法的第一行语句默认都是:super()表示调用父类的无参构造,不写也存在,且必须在第一行
- 如果想调用父类有参构造,必须手动写super进行调用

this,super使用总结
- this:理解为一个变量,表示当前方法调用者的地址值
- this就是一个局部变量,在方法调用的时候有值
- super:代表父类存储空间
| 关键字 | 访问成员变量 | 访问成员方法 | 访问构造方法 |
|---|---|---|---|
| this | this.成员变量 访问本类成员变量 | this.成员方法(…) 访问本类成员方法 | this(….) 访问本类构造方法 |
| super | super.成员变量 访问父类成员变量 | super.成员方法(…) 访问父类成员方法 | super(….) 访问父类构造方法 |

多态
封装:对象代表什么,就得封装对应的数据,并提供数据对应的行为

继承:提高代码复用性 ,解决代码重复问题(多态的前提条件)

多态:


上面这种方法肯定不行

相关文章:
java面向对象从入门到入土
面向对象进阶 (写程序的套路) 面向:拿,找 对象:能干活的东西 面向对象编程:拿东西过来做对应的事情 (写程序的套路) 面向:拿,找 对象:能干活的东西 面向对象编程:拿东西过来做对应的事情 重点学习:学习已有对象并使用,学习如何自己设计对象并使用 设计对…...
linux ACL权限控制之用户权限控制程序设计
linux中的ACL(Access Control List,访问控制列表)是一种比传统UNIX权限更细粒度的权限控制机制,允许为文件和目录设置更为具体的用户和组权限。本文介绍使用acl命令和程序api对文件进行更精细的用户权限控制。 1. 命令行示例 使…...
Java多线程与JConsole实践:从线程状态到性能优化!!!
目录 一、前言二、JConsole 使用教程二、线程的基本状态2.1新建状态(New)2.2就绪状态(Ready)2.3运行状态(Running)2.4 阻塞状态(Blocked)2.5. 等待状态(Waitingÿ…...
从入门到精通:SQL注入防御与攻防实战——红队如何突破,蓝队如何应对!
引言:为什么SQL注入攻击依然如此强大? SQL注入(SQL Injection)是最古老且最常见的Web应用漏洞之一。尽管很多公司和组织都已经采取了WAF、防火墙、数据库隔离等防护措施,但SQL注入依然在许多情况下能够突破防线&#…...
Stable Diffusion vue本地api接口对接,模型切换, ai功能集成开源项目 ollama-chat-ui-vue
1.开启Stable Diffusion的api服务 编辑webui-user.bat 添加 –api 开启api服务,然后保存启动就可以了 2.api 文档地址 http://127.0.0.1:7860/docs3. 文生图 接口 地址 /sdapi/v1/txt2img //post 请求入参 {enable_hr: false, // 开启高清hrdenoising_stre…...
缓存使用纪要
一、本地缓存:Caffeine 1、简介 Caffeine是一种高性能、高命中率、内存占用低的本地缓存库,简单来说它是 Guava Cache 的优化加强版,是当下最流行、最佳(最优)缓存框架。 Spring5 即将放弃掉 Guava Cache 作为缓存机…...
第十四届蓝桥杯真题(PWM输出)
一.LED 先配置LED的八个引脚为GPIO_OutPut,锁存器PD2也是,然后都设置为起始高电平,生成代码时还要去解决引脚冲突问题 二.按键 按键配置,由原理图按键所对引脚要GPIO_Input 生成代码,在文件夹中添加code文件夹&#…...
【Qt】ffmpeg编码—存储(H264)
目录 一、编码分析 1.解码线程: 编辑2.编码线程: 编辑 编辑 二、ffmpeg编码 1.注册所有组件 2.编码初始化函数 (2)打开视频流 4.查找编码器 5. 写文件头信息,写到formatContex中 6.发送一帧数据给编码器…...
Webview详解(下)
第三阶段:性能优化 加载速度优化 缓存策略 缓存策略可以显著减少网络请求,提升页面加载速度。常用的缓存策略包括 HTTP 缓存和本地资源预加载。 1. HTTP 缓存 HTTP 缓存利用 HTTP 协议中的缓存机制(如 Cache-Control、ETag 等࿰…...
【MySQL基础-16】MySQL DELETE语句:深入理解与应用实践
1. DELETE语句基础:数据删除的艺术 在数据库管理中,DELETE语句是维护数据完整性和清理过期信息的关键工具。与日常生活中的"删除"不同,数据库中的删除操作需要更加谨慎和精确,因为数据一旦删除,恢复可能非常…...
相对位置嵌入和旋转位置编码
1. 相对位置嵌入:给注意力机制加“人际关系记忆” 像班级座位表 想象全班同学(序列的各个元素)坐成一个圈,老师(模型)要记住每个人之间的相对位置: 传统方法:老师给每个座位贴绝对…...
Unity编辑器功能及拓展(1) —特殊的Editor文件夹
Unity中的Editor文件夹是一个具有特殊用途的目录,主要用于存放与编辑器扩展功能相关的脚本和资源。 一.纠缠不清的UnityEditor 我们Unity中进行游戏构建时,我们经常遇到关于UnityEditor相关命名空间丢失的报错,这时候,只得将报错…...
REC一些操作解法
一.Linux命令长度突破 1.源码如下 <?php $param $_REQUEST[param];if ( strlen($param) < 8 ) {echo shell_exec($param); } 2.源码分析 echo执行函数,$_REQUEST可以接post、get、cookie传参 3.破题思路 源码中对参数长度做了限制,小于8位&a…...
powershell7.5.0不支持conda的问题
经历:这周手欠使用vscode的powershell时提示我更新,我就更新了,更新完激活不了conda环境了,查询了半天是powershell最新版7.5.0与目前conda25.1.1以前的版本不支持的问题。 问题环境:powershell版本>7.5.0ÿ…...
Android Jetpack学习总结(源码级理解)
ViewModel 和 LiveData 是 Android Jetpack 组件库中的两个核心组件,它们能帮助开发者更有效地管理 UI 相关的数据,并且能够在配置变更(如屏幕旋转)时保存和恢复 UI 数据。 ViewModel作用 瞬态数据丢失的恢复,比如横竖…...
Unity中UDP异步通信常用API使用
Begin开头的方法 BeginSendTo BeginSendTo 是 UdpClient 类中的一个重要方法,用于开始一个异步操作来发送 UDP 数据报到指定的远程端点 public IAsyncResult BeginSendTo(byte[] datagram,int bytes,IPEndPoint endPoint,AsyncCallback requestCallback,object s…...
解决Dify:failed to init dify plugin db问题
Dify最新版本1.1.3(langgenius/dify: Dify is an open-source LLM app development platform. Difys intuitive interface combines AI workflow, RAG pipeline, agent capabilities, model management, observability features and more, letting you quickly go from prototy…...
[AI绘图] ComfyUI 中自定义节点插件安装方法
ComfyUI 是一个强大的 AI 图像生成工具,支持自定义节点插件扩展其功能。本文介绍 ComfyUI 中安装自定义节点插件的三种方法,包括 Git Clone 方式、插件管理器安装方式,以及手动解压 ZIP 文件的方法,并分析它们的优缺点。 1. Git Clone 方法 使用 git clone 是最稳定且推荐…...
【机械视觉】C#+VisionPro联合编程———【六、visionPro连接工业相机设备】
【机械视觉】C#VisionPro联合编程———【六、visionPro连接工业相机设备】 目录 【机械视觉】C#VisionPro联合编程———【六、visionPro连接工业相机设备】 前言: 连接步骤说明 一. 硬件连接 支持的相机接口类型: 连接步骤 2. 软件配置 Visio…...
CI/CD基础知识
什么是CI/CD CI:持续集成,开发人员频繁地将代码集成到主干(主分支)中每次集成都通过自动化构建和测试来验证,从而尽早发现集成错误,常用的CI工具包括Jenkins、Travis CI、CircleCI、GitLab CI等 CD&#…...
蓝桥杯 之 图论基础+并查集
文章目录 习题联盟X蓝桥幼儿园 图论基础 并查集 并查集,总的来说,操作分为三步初始化(每一个节点的父亲是自己),定义union(index1,index2)函数,定义find(index)函数 并查集详细内容博客 习题 联盟X 联盟X 典型的求解连通分支…...
C# .net ai Agent AI视觉应用 写代码 改作业 识别屏幕 标注等
C# net deepseek RAG AI开发 全流程 介绍_c# 向量处理 deepseek-CSDN博客 视觉多模态大模型 通义千问2.5-VL-72B AI大模型能看懂图 看懂了后能干啥呢 如看懂图 让Agent 写代码 ,改作业,识别屏幕 标注等等。。。 据说是目前最好的免费图片识别框架 通…...
不使用自动映射驼峰命名法,直接在接口上使用注解@Results方法映射
3. 使用注解方式配置 在接口方法上使用 Results 注解: java 复制 Select("SELECT user_name, create_time FROM user WHERE id #{id}") Results({Result(column "user_name", property "userName"),Result(column "crea…...
15届蓝桥JavaB组 前6道题解
15届蓝桥JavaB组 前6道题解 报数游戏类斐波那契循环数分布式队列食堂最优分组星际旅行 报数游戏 import java.util.Scanner;//分析: //20和24的最小公倍数是120 //题目给出了前10个数,发现第10个数是120,说明每10个数出现一个公倍数 //第20个…...
蓝桥杯 14 天 十五届蓝桥杯 数字诗意
static boolean kkk(long x) {if(x1)return true;else {// 初始化xx为1,用于计算2的幂long xx 1;// 循环60次,检查2的幂是否等于xfor (int i 1; i < 60; i) {xx * 2; // 每次将xx乘以2if (xx x) { // 如果xx等于x,说明x是2的幂…...
MP4音视频格式
1.MP4 MP4是一种用于封装音视频/字幕/图片/章节信息等数据的多媒体容器格式,是MPEG-4系列的成员之一 2.文件结构 MP4由一层层的嵌套Box(atom)组成 [ size (4 bytes) ][ type (4 bytes)][ payload (嵌套box或者数据) ] 3.常见Box 类型名称…...
国内GitHub镜像源全解析:加速访问与替代方案指南
在数字化开发日益普及的今天,GitHub作为全球最大的代码托管平台,已成为开发者不可或缺的资源库。然而,由于网络环境的限制,国内用户在访问GitHub时常常面临速度慢、连接不稳定等问题。为了提升开发效率,国内涌现出多个GitHub镜像源,为开发者提供了快速、稳定的代码克隆与…...
CentOS 7 挂载与卸载文件系统笔记
挂载文件系统 挂载的基本概念 挂载是将存储设备(如硬盘分区、U 盘、光盘等)连接到 Linux 文件系统的特定目录(挂载点),使得系统能够访问存储设备上的数据。 查看已挂载的文件系统 命令:mount 或 df -h mo…...
责任链模式-java
1、spring依赖注入模式 @Configuration public class ChainConfig {@Beanpublic ChainSpringFactory chainSpringFactory(List<IHandler<DemoOne,Boolean>> handlerList){return new ChainSpringFactory(handlerList);}} public class DemoOne { }public abstract…...
Vue3动态加载组件,警告:Vue received a Component than was made a reactive object
场景 2个按钮,点击之后,下面加载不同的组件。 现象 分析 实际动态加载的组件,不是深层响应式的,推荐使用 shallowReactive 或 shallowRef,即浅层作用形式,仅最外层是响应式,以此来提升性能。…...
