图灵日记之java奇妙历险记--类和对象
目录
- 类的定义和使用
- 类的定义格式
- 类的实例化
- 类和对象的说明
- this引用
- this引用的特性
- 对象的构造及初始化
- 就地初始化
- 构造方法
- 封装
- 包
- 导入包中的类
- 自定义包
- static成员
- static修饰成员变量
- static修饰成员方法
- 代码块
- 代码块概念及分类
- 构造代码块
- 静态代码块
- 匿名对象
类的定义和使用
类的定义格式
// 创建类
class ClassName{ field; // 字段(属性) 或者 成员变量method; // 行为 或者 成员方法
}
class为定义类的关键字,ClassName为类的名字,{}中为类的主体。
class future {public int time;public void decreaseTime() {}
}
类名注意采用大驼峰定义
成员前写法统一为public
此处写的方法不带 static 关键字
注意事项:
1. 一般一个文件当中只定义一个类,方便后期维护
2. main方法所在的类一般要使用public修饰(注意:Eclipse默认会在public修饰的类中找main方法)
class future {public int _time;public static void main(String[] args) {System.out.println("1");}public void decreaseTime() {}
}
此处的类未被public修饰,依旧可以使用main方法
3. public修饰的类必须要和文件名相同
4. 不要轻易去修改public修饰的类的名称
类的实例化
用类类型创建对象的过程,称为类的实例化,在java中采用new关键字,配合类名来实例化对象。
public static void main(String[] args) {future date1 = new future();future date2 = new future();}
(地址随便给的)
当你创建一个类的实例时,实际上是在内存中分配了一块空间来存储这个实例,并返回一个指向该内存空间的引用。这个引用指示了对象在内存中的位置,而不是对象本身的内容。通过这个引用,你可以访问和操作对象的属性和方法。
new 关键字用于创建一个对象的实例.
使用 . 来访问对象中的属性和方法.
同一个类可以创建多个实例.
类和对象的说明
类只是一种模板.类似于建筑图纸,实例化就是把图纸建造成高楼大厦
类是一种自定义类型,类可以实例化出多个对象,类似图纸可以修建很多大厦,实例化的对象占用实际的物理空间,存储成员变量,此处是普通成员变量,类的实例化会分配内存空间来存储对象的实例变量,并提供指向方法的引用,但静态成员变量和静态方法不会在实例化过程中分配新的空间
this引用
public class test {public static void main(String[] args) {stu a = new stu();stu b = new stu();a.InitStu(1,"ab",1);b.InitStu(2,"cd" ,2);}
}
class stu {public int age;public String name;public int index;public void InitStu(int age, String name, int index) {}
}
方法在类中是通过引用存在的,一个类创建的不同对象在调用同一个方法,而方法如何区分不同对象?
有宝子就很奇怪地会指出
调用函数之前不是会有对象吗,这里还要再次重申一遍,方法在类中是以引用的形式存在的,方法不像成员变量,方法进行的是一种重复操作,没必要每次实例化对象还要额外开辟空间,只需要开辟一次,之后调用之时去调用引用来进行方法调用,那么对于同一个方法,编译器该如何区分呢?这里就要提到this引用了
对象a和b都有自己的引用,在函数调用时,系统会默认把this引用一起传给方法.方法被调用时,this关键字将会引用调用该方法的对象,即a或b,来区分不同对象。
class stu {public int age;public String name;public int index;public void InitStu(int age, String name, int index) {age = age;name = name;index = index;}
}
对stu类里的InitStu方法进行如上操作,但是由于局部变量优先的原则,方法内的变量不会优先识别方法之外的变量,而是优先方法内的局部变量,方法内找不到才会到类中寻找,如上代码可以得出,方法里修改的是形参,未对类里的成员变量进行修改
如果要对成语变量进行修改,使用this引用来指明,如下
this引用的特性
1. this的类型:对应类类型引用,即哪个对象调用就是哪个对象的引用类型
2. this只能在"成员方法"中使用
3. 在"成员方法"中,this只能引用当前对象,不能再引用其他对象
4. this是“成员方法”第一个隐藏的参数,编译器会自动传递,在成员方法执行时,编译器会负责将调用成员方法,对象的引用传递给该成员方法,this负责来接收
对象的构造及初始化
public static void main(String[] args) {int a;System.out.println(a);}
局部变量未初始化,打印会报错,但是如果是成员变量则不一样,成员变量未初始化在进行打印时不会报错,因为类的对象在申请空间之后依旧设置好了初始化值,如下
数据类型 默认值
byte 0
char ‘\u0000’
short 0
int 0
long 0L
boolean false
float 0.0f
double 0.0
reference null
stu a = new stu();System.out.println(a.index);System.out.println(a.age);System.out.println(a.name);
就地初始化
在声明成员变量时,就直接给出了初始值
class stu {public int age = 1;public String name = null;public int index = 1;public void InitStu(int age, String name, int index) {this.age = age;this.name = name;this.index = index;}
}
构造方法
构造方法(也称为构造器)是一个特殊的成员方法,名字必须与类名相同,在创建对象时,由编译器自动调用,并且在整个对象的生命周期内只调用一次
对象的产生一是需要为对象分配内存,二是调用合适的构造方法,而刚才类里没有构造方法为什么对象会产生,那是因为系统在发现类里没有构造方法的情况下会自动生成一个构造方法,如下
public class Animal {/*public Animal() {}系统默认生成这样的构造函数来进行调用*/String name;int age;}
但是在你依旧有构造方法的时候,系统就不会生成默认构造方法,防止冲突,如下代码就会报错,因为不会生成默认构造方法
class Animal {public Animal(String name, int age) {this.age = age;this.name = name;}public String name;public int age;
}public class test {public static void main(String[] args) {Animal pig = new Animal();System.out.println(pig.age);System.out.println(pig.name);}
}
你还可以在你定义的构造方法调用另一个自己的构造方法
class Animal {public Animal(String name, int age) {this.age = age;this.name = name;}public Animal() {this("pig",1);}public String name;public int age;
}
但是需要注意在public Animal() 中this(“pig”,1)只能当第一条语句,后面可以添加其他语句
不能成环
public Animal(String name, int age) {this();}public Animal() {this("pig",1);}
递归套娃的感觉,反正成环就哒唛
封装
面向对象程序三大特性:封装、继承、多态
public class things {
//这里把成员变量给密封在类里,外界无法访问private String name;private int year;private String color;public things() {}public things(String name, int year, String color) {this.name = name;this.year = year;this.color = color;}public void show() {System.out.println(this.color);System.out.println(this.year);System.out.println(this.name);}
}
public class test02 {public static void main(String[] args) {things book = new things("book",1,"red");book.show();}
}
封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行 交互
注意:这里的接口包括方法,也包括之后学的接口
包
在面向对象体系中,提出了一个软件包的概念,即:为了更好的管理类,把多个类收集在一起成为一组,称为软件包。
包是对类,接口等的封装机制的体现,是一种对类或者接口等的很好的组织方式
在同一工程允许存在相同名称的类,只要处在不同的包中即可
导入包中的类
可以使用java.util.Arrays导入java.util包中的Arrays类
public static void main(String[] args) {int[] arr = {1,2,3};System.out.println(java.util.Arrays.toString(arr));}
这样的写法比较麻烦,可以使用import语句导入包
import java.util.Arrays;
public class test03 {public static void main(String[] args) {int[] arr = {1,2,3};System.out.println(Arrays.toString(arr));}
}
导入包时也可以使用import java.util.;.;
*是通配符,表示所有的意思,就是导入ijava.util所有的类
建议使用显式的指定要导入的类名,否则会出现冲突
使用import static导入包中静态的方法和字段
静态方法
public static void main(String[] args) {int[] arr = {2,33,3};sort(arr);//可以直接写方法for (int x:arr) {System.out.println(x+" ");}}
自定义包
基本规则
- 在文件的最上方加一个package语句指定该代码在哪个包中
- 包名需要尽量指定成唯一的名字,通常会用公司的域名颠倒形式
- 包名要和代码路径相匹配
- 如果一个类没有package语句,则该类被放到一个默认包
(子类要等到后面再展开)
先提一下default,他就是不加任何访问限定符的状态
上图创建一个A包,包里有B和C包,B包里有testB类,C包里有testC类
public class testC {int tem;//不加访问修饰限定符public int tem1;
}
在另一个包B里实例化testC这个类,对象名叫a,上图可以看出我们可以访问tem1,但是default也就是不加访问限定符的情况下,无法访问tem这个变量
static成员
public class person {public int time;public String name;
}
定义person这个类,变量time对于每个person都一样的(前提),但是如果你每次实例化一个对象都要开辟空间给变量time,本来一个就够了,但是你每次都要开辟空间,就会造成空间浪费
如果time属性对于所有的person对象都是相同的,那么将其设置为static是合适的。这样,这个属性就不会与每个person对象实例关联,而是与类本身关联。这样,无论创建多少个person对象,都只会有一个time属性,所有对象都会共享这个属性
public class person {public static int time;public String name;
}
static修饰成员变量
静态成员变量在方法区中存储 ,被static修饰的只能是成员变量,不能是局部变量
static修饰的成员变量,称为静态成员变量,静态成员变量最大的特性:不属于某个具体的对象,是所有对象所共享的
- 不属于某个具体的对象,是类的属性,所有对象共享的,不存储在某个对象的空间中
- 既可以通过对象访问,也可以通过类名访问,但一般更推荐使用类名访问
- 类变量存储在方法区当中
- 生命周期伴随类的一生(即:随类的加载而创建,随类的卸载而销毁)
static修饰成员方法
Java中,被static修饰的成员方法称为静态成员方法,是类的方法,不是某个对象所特有的。静态成员一般是通过静态方法来访问的。
【静态方法特性】
- 不属于某个具体的对象,是类方法
- 可以通过对象调用,也可以通过类名.静态方法名(…)方式调用,更推荐使用后者
- 不能在静态方法中访问任何非静态成员变量
- 静态方法中不能调用任何非静态方法,因为非静态方法有this参数,在静态方法中调用时候无法传递this引用
代码块
代码块概念及分类
使用{}定义一段代码称为代码段.根据代码块定义的位置以及关键字,又可分为以下四种
- 普通代码块(少见)
- 构造块
- 静态块
- 同步代码块(期待后续)
构造代码块
构造块:定义在类中的代码块(不加修饰符)。也叫:实例代码块。构造代码块一般用于初始化实例成员变量。
静态代码块
使用static定义的代码块称为静态代码块。一般用于初始化静态成员变量
注意事项
静态代码块不管生成多少个对象,其只会执行一次
静态成员变量是类的属性,因此是在JVM加载类时开辟空间并初始化的
如果一个类中包含多个静态代码块,在编译代码时,编译器会按照定义的先后次序依次执行(合并)
实例代码块只有在创建对象时才会执行
public class test {public static void main(String[] args) {person tem1 = new person();System.out.println("================");person tem2 = new person();}
}
class person {public static int time;public String name;person() {System.out.println("构造方法");person.time = 1;this.name = "张三";}public void show() {System.out.println(this.name);System.out.println(person.time);}//静态代码块static {System.out.println("静态代码块");}//构造代码块{System.out.println("构造代码块");}
}
匿名对象
举个栗子:
public class test {public static void main(String[] args) {String tem;System.out.println(tem);}
}
思维有些混淆的宝子会说不是有默认值吗,我们再说一下,是类里的成员变量在未初始化的时候会有默认值,tem是局部变量,需要初始化
类里的成员变量:
当你在类中声明一个变量,这个变量是类的成员变量。如果这些变量没有被初始化,它们会有默认值。例如,对于引用类型(如String),默认值是null。对于数值类型,默认值是相应的默认值(例如,int的默认值是0)。
局部变量:
局部变量是在方法内部声明的变量。它们只在方法的作用域内存在,并且没有默认值。在声明之后必须显式地初始化它们,否则编译器会报错。
public class test {String tem;public static void main(String[] args) {System.out.println(tem);//依旧报错}
}
有宝子又要说:这也不行啊,上面的代码main方法被static修饰,是个类方法,他的调用不依赖于对象,但是tem这个成员变量属于类,不能直接调用,因为静态的里面不能访问非静态的,如果你非要调用就给一个对象即可
public class test {String tem;public static void main(String[] args) {test a = new test();System.out.println(a.tem);}
}
public class test {String tem;public static void main(String[] args) {System.out.println(new test().tem);//匿名对象的方式}
}
匿名对象的缺点:
只能使用一次,不能重复使用
相关文章:

图灵日记之java奇妙历险记--类和对象
目录 类的定义和使用类的定义格式 类的实例化类和对象的说明 this引用this引用的特性 对象的构造及初始化就地初始化构造方法 封装包导入包中的类自定义包 static成员static修饰成员变量static修饰成员方法 代码块代码块概念及分类构造代码块静态代码块 匿名对象 类的定义和使用…...

Kotlin 枚举类
使用 enum 修饰符;每个枚举常量都是一个对象,枚举常量以逗号分隔 // 枚举类 enum class Direction {NORTH, SOUTH, WEST, EAST }// 每一个枚举都是枚举类的实例,所以可以这样初始化 enum class Color(val rgb: Int) {RED(0xFF0000),GREEN(0x…...

可运营的Leadshop开源商城小程序源码 +H5公众号+带视频教程
源码简介 Leadshop是一款出色的开源电商系统,具备轻量级、高性能的特点,并提供持续更新和迭代服务。该系统采用前后端分离架构(uniappyii2.0),以实现最佳用户体验为目标。 前端部分采用了uni-app、ES6、Vue、Vuex、V…...

Qt底层机制之对象树总结
Qt对象树是Qt框架中的一个重要概念,它用于管理对象之间的关系和生命周期。除了常规的对象树结构,Qt还提供了一些特殊的用法来扩展对象树的功能和灵活性。 1. 父子关系:Qt对象树通过设置父对象来建立父子关系。父对象负责管理子对象的内存分配和释放。这种关系可以通过`setP…...

QT C++ TCP Socket 请求心知天气
0.0 相关连接代码部分头文件具体实现 相关连接 心知天气官方天气图标 心知天气官网 代码部分 头文件 #include <QtNetwork> #include <QNetworkAccessManager> #include <QDebug> #include <QJsonValue> #include <QJsonArray> #include &l…...

双向链表的实现及头尾插入删除
双链表的增删查改 一.双向链表的初始化二.创建返回链表的头结点三.双向链表销毁四. 双向链表打印五.双向链表尾插六. 双向链表尾删七. 双向链表头插八.双向链表头删九.双向链表的查找十.双向链表在pos的前面进行插入十一. 双向链表删除pos位置的节点 一.双向链表的初始化 Lis…...

C语言—每日选择题—Day62
第一题 1. 在使用标准C库时,下面哪个选项使用只读模式打开文件? A:fopen("foo.txt", "r") B:fopen("foo.txt", "r") C:fopen("foo.txt", "w") D…...

基于 Sentry 的前端监控系统搭建(Linux)
一、前言 随着技术这几年的发展与沉淀,线上数据指标监控也变得尤为重要,研发人员和运营人员需要对线上的产品指标有所感知,同时风险也需要及时暴露,很多公司开始自建监控系统,但对于一些定制化要求不是特别高的团队&a…...

【C++入门到精通】Lock_guard与Unique_lock C++11 [ C++入门 ]
阅读导航 引言一、RAII机制1. 概念2. 原理3. 优点 二、Lock_guard1. 官方文档2. 概念3. 底层类模版4. 使用示例 三、Unique_lock1. 官方文档2. 概念及底层3. 使用示例 四、总结温馨提示 引言 在C11标准中,为了更方便地使用互斥锁(Mutex)来保…...

电路设计(8)——计时器的multism仿真
1.功能设计 这是一个计时电路,在秒脉冲的驱动下,计时器开始累加,6个数码管分别显示计时的 时:分:秒。 仿真图如下所示: 左边的运放构成了振荡电路,可以产生脉冲波。这个脉冲波给计时电路提供基准…...

Jmeter测试实践:文件下载接口
一 Jmeter步骤 1.打开jmeter4.0,新建测试计划,添加线程组。根据实际情况配置线程属性。 2.添加HTTP请求。根据接口文档进行配置。 Basic部分修改如下,Advanced部分保持默认。这里的参数id是文件的id,我进行了参数化,…...

PyQt5实现学生管理系统第三天(下)
目录 一:学生课程导航 二:搜索框 三:查询 四:页面数据展示逻辑 上一节,我们介绍了课程管理的课程查询导航的功能。这一节我们介绍下学生课程的功能实现,因为学生课程只有一个查询列表,内容相对简单,所以我们在这一节也重点讲述下我们页面的展现逻辑。 一:学生课程…...
第4章 | 安徽某高校《统计建模与R软件》期末复习
第4章 参数估计 参数估计是统计建模的关键步骤之一,它涉及根据样本数据推断总体参数的过程。在统计学中,参数通常用于描述总体的特征,如均值、方差等。通过参数估计,我们可以利用样本信息对这些未知参数进行推断,从而…...

localforage本地存储(融合Web Storage,Web SQL Database,ndexedDB三种前端存储)
介绍 localForage 是一个快速而简单的 JavaScript 存储库。通过使用异步存储(IndexedDB 或 WebSQL)和简单的类 localStorage 的 API ,localForage 能改善 Web 应用的离线体验。 在不支持 IndexedDB 或 WebSQL 的浏览器中,localF…...

【JavaWeb学习笔记】17 - ThreadLocal
项目代码 https://github.com/yinhai1114/JavaWeb_LearningCode/tree/main/threadlocal/src/com/yinhai/thread 目录 项目代码 一、什么是ThreadLocal? 二、ThreadLocal快速入门 三、源码解读 一、什么是ThreadLocal? 1. ThreadLocal的作用,可以实现在同一个线…...

【ARMv8M Cortex-M33 系列 1 -- SAU 介绍】
文章目录 Cortex-M33 SAU 介绍SAU 的主要功能包括SAU 寄存器配置示例 Cortex-M33 SAU 介绍 在 ARMv8-M 架构中,SAU(Security Attribution Unit)是安全属性单元,用于配置和管理内存区域的安全属性。SAU 是 ARM TrustZone 技术的一…...

sklearn 逻辑回归Demo
逻辑回归案例 假设表示 基于上述情况,要使分类器的输出在[0,1]之间,可以采用假设表示的方法。 设 h θ ( x ) g ( θ T x ) h_θ (x)g(θ^T x) hθ(x)g(θTx), 其中 g ( z ) 1 ( 1 e − z ) g(z)\frac{1}{(1e^{−z} )} g(z)(1e−z)1…...

什么是众创空间?他有什么特点?
众创空间,是一种为大众创新创业提供专业化服务的创业服务平台,是顺应网络时代创新创业特点和需求,通过市场化机制、专业化服务和资本化途径构建的低成本、便利化、全要素、开放式的新型创业服务平台的统称。众创空间包括创客空间、联合办公空…...

什么是数据分析思维
参考 一文学会如何做电商数据分析(附运营分析指标框架) 电子商务该如何做数据分析?如何数据分析入门(从各项指标表象进入) https://www.processon.com/outline/6589838c3129f1550cc69950 数据分析步骤 什么是数据分析…...

利用Milvus Cloud和LangChain构建机器人:一种引人入胜且通俗易懂的方法
一、引言 机器人已经深入我们的日常生活,从家庭服务到工业生产,再到医疗和运输等领域。然而,这些机器人往往需要复杂的算法和数据处理技术才能有效地执行任务。在这个过程中,人工智能(AI)和机器学习&#…...

数据结构-如何实现一个队列?逐步解析与代码示例(超详细)
文章目录 前言1.队列的基本概念2.链表与数组实现队列的区别2.1数据存储结构2.2性能2.3内存使用 3.为什么选择链表实现队列?4.结构定义函数声明 5.核心操作5.1初始化 (QInit)5.2销毁 (QDestroy)5.3入队 (QPush)5.4出队 (QPop) 6.队列的查询操作6.1队首元素 (QueueFro…...

爬虫工作量由小到大的思维转变---<第二十三章 Scrapy开始很快,越来越慢(医病篇)>
诊断篇https://blog.csdn.net/m0_56758840/article/details/135170994?ops_request_misc%257B%2522request%255Fid%2522%253A%2522170333243316800180644102%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id1703332433168001806441…...

.Net7.0 或更高版本 System.Drawing.Common 上传图片跨平台方案
项目升级.Net7.0以后,System.Drawing.Common开关已经被删除,且System.Drawing.Common仅在 Windows 上支持 ,于是想办法将原来上传图片验证文件名和获取图片扩展名方法替换一下,便开始搜索相关解决方案。 .Net6.0文档:…...

【MySQL】InnoDB和MyISAM区别
文章目录 一、索引不同1 InnoDB聚簇索引,MyISAM非聚簇索引1 InnoDB聚簇索引2 MyISAM非聚簇索引 2 InnoDB必须要有主键,MyISAM允许没有主键3 InnoDB支持外键4 InnoDB不支持全文索引5 索引保存位置不同 二、对事物的支持三、存储结构不同四、存储空间不同五…...

3分钟了解安全数据交换系统有什么用!
企业为了保护核心数据安全,都会采取一些措施,比如做网络隔离划分,分成了不同的安全级别网络,或者安全域,接下来就是需要建设跨网络、跨安全域的安全数据交换系统,将安全保障与数据交换功能有机整合在一起&a…...

记录汇川:MODBUS TCP-梯形图
H5U的MODBUS通信不需要编写程序,通过组态MODBUS通信配置表,实现数据通信。 Modbus-TCP 主站即Modbus-TCP客户端,通过Modbus-TCP配置,可最多支持同时与31个 Modbus-TCP服务器(从站)进行通讯。 …...

electron + sqlite3 解决打包后无法写入数据库
前言 window环境。 electron28.0.0 sqlite35.1.6 使用 electron-builder 打包。 本文旨在解决打包后无法写入数据库的问题。 但如果你是打包后无法访问sqlite,且有报错弹窗,不妨也看看本文。 也许是同一种原因。 错误原因分析 打包后无法创建db文件&…...

【uniapp小程序-生成二维码+多个图片文字合并一张图】
<!-- 二维码 --><canvas id"qrcode" canvas-id"qrcode" width"120" ></canvas><!-- 生成带小程序码的分享图片 --><canvas canvas-id"shareCanvas" class"share-canvas"></canvas>#qrc…...

Text-to-SQL小白入门(十)RLHF在Text2SQL领域的探索实践
本文内容主要基于以下开源项目探索实践, Awesome-Text2SQL:GitHub - eosphoros-ai/Awesome-Text2SQL: Curated tutorials and resources for Large Language Models, Text2SQL, Text2DSL、Text2API、Text2Vis and more.DB-GPT-Hub:GitHub - eosphoros-ai…...

深度学习 | 基本循环神经网络
1、序列建模 1.1、序列数据 序列数据 —— 时间 不同时间上收集到的数据,描述现象随时间变化的情况。 序列数据 —— 文本 由一串有序的文本组成的序列,需要进行分词。 序列数据 —— 图像 有序图像组成的序列,后一帧图像可能会受前一帧的影响…...