一.类是对对象的描述,对象是类的具体体现
面向过程(c语言):强调过程, 将问题进行分解,将分解的每一部分封装成一个又一个函数,最终通过函数间的相互调用 将问题解决(强调每一个步骤)
面向对象(c++、java)强调对象,强调对象之间的交互来解决问题。
二.关于对this的认识
①this可以理解为当前类的对象,this只能在成员方法中使用,this只能在非static类中使用,另外this具有final属性,不能修改this的指向(this只能引用当前对象,不能再引用其他对象(不当渣男))。
②有关this的编译处理机制
javac是如何处理类的?
1.识别类名
2.识别当前类中有哪些属性(这就是为什么在类中即使将变量定义在方法的后面,在前面方法中引用该对象也是可以的)
3.识别该类中有哪些成员方法并对成员方法进行修改,具体如下
a.还原成员方法的this引用,即将this作为成员方法的第一个参数
b.在成员方法中对成员变量的引用都是通过this来操作的,在成员变量之前加上this
c.所有通过对象调成员方法的代码都会将对象的地址作为调用成员的地址传递进去
通过jclasslib这一插件对其进行验证
有关jclasslib的安装和使用如下:Idea中jclasslib的安装与使用_裴南苇_的博客-CSDN博客_idea安装jclasslib
三.有关对象的创建及初始化
当我们创建一个对象(使用new)时,在JVM层面我们编译器需要做的工作如下:
①检测对象对应的类是否已经加载到虚拟机中,如果没有加载到虚拟机中则将类加载到虚拟机中(通过加载类确定需要在堆上开辟多大的空间)
②为对象分配内存空间。
③处理并发安全问题(比如:多个线程同时申请对象,JVM要保证申请的空间不冲突)
④对已经开辟好的空间进行初始化
⑤设置对象头信息
⑥调用构造方法,对对象中的各个成员赋值
由此我们可见,在调用构造方法时我们所创建的对象已经开辟好了内存空间,所以我们的构造方法只负责初始化对象,不负责内存空间的开辟。
四.关于本地初始化
如果我们在创建类的时候进行了本地初始化(在属性后面进行了赋值),在这种情况下当我们调用构造方法时先去执行初始化的操作,然后再去执行构造方法内的语句。
图示如下:
五.关于封装性
对封装性的理解:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互 。
进行形象化的比喻:我们电脑主机有主机壳,仅对我们暴露的是一些插口等等(接口),而实际运行的cpu、显卡、内存我们是看不见的。
六.static关键字
6.1
static修饰成员变量:一般来说,成员变量是对对象的描述(实例成员变量),而所有对象所共享的成员变量通常被static修饰,这类被static修饰的成员变量被称为类成员变量。
实例成员变量的初始化的方式:
1.就地初始化
2.构造方法中初始化
3.构造代码块初始化
静态成员变量初始化的方式:
1.就地初始化
.2静态代码块初始化
类的成员变量具有以下特性:
1. 不属于某个具体的对象,是类的属性,所有对象共享的,不存储在某个对象的空间中
2. 既可以通过对象访问,也可以通过类名访问,但一般更推荐使用类名访问
3. 类变量存储在方法区当中
4. 生命周期伴随类的一生 ( 即:随类的加载而创建,随类的卸载而销毁 )
关于实例成员变量和类的成员变量的对比如下:
6.2被static修饰的成员方法
1.被static修饰的成员方法被称为类的成员方法,可以通过对象进行调用,也可以通过类进行调用,我们一般更推荐后者~
2.同时,我们不能在静态成员方法中访问任何非静态的成员方法,也不能调用非静态的成员变量
原因如下:在非静态的成员方法的参数中,第一个默认参数是this引用(该类的一个对象),也就是说,非静态的成员方法必须通过this引用才能进行调用,而静态成员方法没有默认的thi引用,也就不能调用非静态的成员方法,而非静态的成员变量,同样前面存在一个默认的this引用,也需要用非静态成员方法或者对象直接进行调用。
关于静态和实例成员方法的对比如下:
七.代码块
7.1普通代码块
定义:定义在方法中的代码块
实例:
public class Main {
public static void main ( String [] args ) {
{ // 直接使用 {} 定义,普通方法块
int x = 10 ;
System . out . println ( "x1 = " + x );
}
int x = 100 ;
System . out . println ( "x2 = " + x );
}
}
这种用法相对较少
7.2实例代码块(构造代码块)
例子:
public class Student {
// 实例成员变量
private String name ;
private String gender ;
private int age ;
private double score ;
public Student () {
System . out . println ( "I am Student init()!" );
}
// 实例代码块
{
this . name = "bit" ;
this . age = 12 ;
this . sex = "man" ;
System . out . println ( "I am instance init()!" );
}
定义在类中的代码块,一般用于初始化实例成员变量
关于实例代码块的几点说明:
1.在一个类中可以有多个实例代码块
2.实例代码块在每次创建对象时都会执行。目的:将对象初始化完整
3.创建对象时,多个实例代码块按照类出现的先后顺序依次执行
4.实例代码块的内容在执行之前会被拷贝到构造方法的第一条语句之前
7.3静态代码块
定义在类中,被static修饰,用于初始化类的成员变量
例子:
public class Student {
private String name ;
private String gender ;
private int age ;
private double score ;
private static String classRoom ;
// 实例代码块
{
this . name = "bit" ;
this . age = 12
this . gender = "man" ;
System . out . println ( "I am instance init()!" );
}
// 静态代码块
static {
classRoom = "bit306" ;
System . out . println ( "I am static init()!" );
}
关于静态代码块的几点说明:
1.一个类中有多个静态代码块
2.静态代码块内只能初始化静态成员变量,不能初始化实例成员变量
3.多个静态代码块按其在类中出现的先后顺序被合并到clinit方法(编译器提供的方法)中。
4.静态代码块在类加载的时候被执行,每次加载都会被执行
5.静态代码块不管生成多少个对象,其只会执行一次
6.静态成员变量是类的属性,因此是在 JVM 加载类时开辟空间并初始化的
7.如果一个类中包含多个静态代码块,在编译代码时,编译器会按照定义的先后次序依次执行 ( 合并 )
8.实例代码块只有在创建对象时才会执行