首先我们要了解在java里面有一个万物皆对象这么一个概念,面向对象是解决问题的一种思想,主要依靠对象之间的交互完成一件事情。
在这里我们就要先了解类与对象
1、类
1.1、类的实例化
定义了一个类,就相当于在计算机中定义了一种新的类型。通过用类的类型去创建一个对象的过程,称之为类的实例化
通过第19行可以知道,通过类来创建对象的过程叫做类的实例化。
1.2、类对象的说明
1、类只是一种模型,一种类型,用来对实体去进行描述
2、类是自定义类型。
3、一个类可以实例化多个对象,实例出来的对象占据物理空间,储存成员变量。
2、this引用
首先我们要先了解为什么有this引用
我们可以看接下来的一段代码
当我们去通过类的方法去给成员变量赋初值的时候,当我们没有使用this关键字时,我们赋上的值就是0,那么为什么会出现这个现象勒,我们要知道,当int类型的变量没有赋初值的时候,我们默认初始值是0,那么接下来我们看到13行Date这个方法,这个我们传递值给Date方法的局部变量里,当year = year,也就是将2023这个值赋给year,但是,Date里面的year是个局部变量,并不是Date这个类的成员变量,方法Date里面的year的局限性也仅仅只在Date这个方法里面,所以这个成员变量year就是自己的初始值0。
那么接下来我们再看一下用了this会发生什么变化。
结果就是如我们预测的这样了,成功对应上了。
这个this.year就是指代了我们的成员变量year ,至于我们是这样的形式,我们可以了解一下,这个this其实就是引用当前对象,对象.成员变量,这就是对这个成员变量的引用,接下来给这个成员变量去赋初值就行了。
this的特性
1、this的类型:对应类类型引用,即那个对象调用就是哪个对象的引用类型
2、this只能在成员方法中使用
3、在成员方法中,this只能引用当前对象,不能在引用其他对象
4、this是成员方法的第一个隐藏参数,也就是这个Date this参数,在成员方法实行的时候,编译器会将调用成员方法的对象的引用传递给该成员方法,this负责来接收。
3、构造方法
3.1构造方法的概念
构造方法是一种特殊的成员方法,名字必须与类名相同,在创建对象时,由编译器自动调用,并且在整个对象周期内只调用一次
就是如我们上图一样,但是没有void的类型,一般都是用public修饰
在创建对象时由编译器自动调用,并且在对象的声明周期内只调用一次
我们就可以将上图的修改成这样
这样也就可以直接调用了
这里要注意一下:构造方法的作用是对对象中的成员进行初始化,并不负责给对象开辟空间。
3.2、构造方法重载
我们可以看到Date类里面出现两个成员方法,两个成员方法的方法名都相同,当时并没有报错,其实这就是构成的方法重载
我们看到当我们创建了e这个对象时,给它赋了两个值也没有报错,说明,调用了两个参数的构造器,当我们运行时候可以看到结果
4、默认初始化
在类中成员变量不初始化也可以进行,而局部变量不初始化却不能进行,这是为什么呢?
其实这是在我们创建对象时,用new关键字,去堆中开辟空间时,其实有很多过程,在JVM这个层面上需要做很多事情
1、检测对象对应的类是否加载了,如果没有加载则加载
2、为对象分配内存空间
3、处理并发安全问题
比如:多个线程同时申请对象,JVM要保证给对象分配的空间不冲突
4、初始化所分配的空间
即:对象空间被申请好之后,对象中包含的成员已经设置好了初始值,比如:
byte = 0,char = '\u0000' , short = 0 , int = 0 .......,boolean = false 后面还有很多,大家可以自行去查阅
5、封装
面向对象有三大特性:继承、封装、多态。大致理解就是隐藏细节。只有简单的交互就行。
5.1、访问限定符
提到封装我们就必须提到访问限定符
访问限定符就是用来对成员变量的访问权限进行了限制
我们要了解这个四个访问限定符的权限都是怎么样的,这样就可以做到更好的限制
6、static成员
这里我们将动物类中的age成员变量添加了一个static修饰符,使得age成为了一个静态成员变量,接着我们创建了一个dog对象和cat对象,当我们去输出它们的年龄都可以成功输出,然后当我们通过 类.成员变量名 去进行访问时,也是可以进行的,这说明了,当被static修饰的成员变量时,这个成员变量就不属于某个具体对象,是所有对象共享的,
静态成员变量特性
1、不属于某个具体对象,是类的属性,所有对象共享的,不储存在某个对象的空间中。
2、既可以通过对象访问,也可以通过类名访问,但一般更推荐使用类名访问
3、类变量储存在方法区
4、生命周期伴随类的一生(即:随类的加载而创建,随类的卸载而销毁)
6.1、静态方法
当我们想对一个被private修饰的成员变量进行访问时,我们可以看到的是,当我们给方法getsex用上了static修饰符,然后通过这个静态方法去访问被private修饰的成员变量,然后无论是 成员名.方法名 还是 类名.方法名 这两种都是可以访问的,所以在java中,被static修饰的成员方法被称为静态成员方法,是类的方法,不是某个对象所有的,是共享的,所以我们要知道,静态成员一般都是通过静态方法去访问的。
静态方法的特性
1、不属于某个具体的对象,是类方法
2、可以通过对象调用,也可以通过类名.静态方法名(.....)方式调用,更推荐后者
3、不能在静态方法中访问任何非静态成员变量
6.2、静态成员初始化
静态成员初始化分为两种,一种是就是初始化,另外一种就是静态代码块初始化
就是初始化就是在定义时直接初始化,也就是上面我们定义的那种,而静态代码块初始化就需要先了解什么时代码块了
7、代码块
使用{}这个定义一段代码的叫做代码块,根据代码块定义的位置以及关键字,又可以分为四种
1、普通代码块
2、构造代码块
3、静态块
4、同步代码块
7.1、普通代码块
首先我们在main方法中定义了一个普通代码块,在普通代码块外面对x重新赋值时,却发现了报错,到底是为什么呢?其实在普通代码块里面定义的变量作用域仅仅只是在普通代码块里面。
当我们修改成这样时,结果就是
7.2、构造代码块
构造代码块是定义在类中的代码块,也叫:实例代码块。构造代码块一般用于初始化实例成员变量
由上面的代码我们可以看到有一段代码块在类中,这个代码块里面实例化了成员变量,也就是给成员变量赋值,最后我们要判断一下是构造代码块先进行还是构造方法先进行
结果显而易见,先调用了构造代码块,在调用了构造方法,最后我们输出结果
7.3、静态代码块
使用static定义的代码称为静态代码块,一般用于初始化静态成员变量
当我们增加点代码时,通过静态代码块去给静态成员变量初始化时,也就是我们上面说到从静态成员变量初始化的第二种,接下来我们可以看下他们的执行顺序
可以看见,先调用了静态代码块,其次是构造代码块,最后才是构造方法。
欧克了家人们,这就是我对类与对象的一点理解,如果有错误,欢迎大家指出