1、类
- 类的定义语法:
[修饰符] class 类名 {
// 书写类中的代码
}
-
注意点:
1、使用class修饰的就是类,也就是类必须使用class修饰
2、使用public来修饰类,则类名必须和源文件名保持一致
3、一个源文件中可以定义多个类,编译会生成多个字节码文件 -
类中的组成内容
1、属性(封装数据,以变量为表现形式)- 成员变量:又称为”实例变量“或”非静态变量“,因为成员变量是从属于”对象“的
- 静态变量:又称为”类变量“,因为静态变量是从属于”类“的
2、行为(封装功能,以方法为表现形式) - 成员方法:又称为”实例方法“或”非静态方法“,因为成员变量是从属于”对象“的
- 静态方法:又称为”类方法“,因为静态变量是从属于”类“的
2、成员变量
- 定义位置:定义在类中,方法体和代码块之外
- 定义语法:
[修饰符] 数据类型 变量名; --> 此处修饰符不能使用static
-
调用语法:
对象名.成员变量名; --> 通过对象找到成员变量在内存中的存储位置
--> 如果是在本类中调用成员变量,可以直接使用”成员变量名“来调用 -
成员变量的默认值:和数组元素默认值规则一模一样
-
成员变量初始化顺序:默认初始化 --> 显示初始化 --> 指定初始化
-
成员变量和局部变量的区别:
1、定义位置:- 成员变量:定义在类中,方法体和代码块之外
- 局部变量:定义在类中,方法体和代码块之内
2、存储位置:
- 成员变量:存储在堆内存中,属于对象的一部分
- 局部变量:存储在栈内存中
3、默认值
- 成员变量:有默认值,默认值规则与数组元素默认值规则相同
- 局部变量:没有默认值,只声明不赋值的变量,只能做赋值操作,不能做取值操作
4、生命周期
- 成员变量:随着对象的创建而”出生“,随着对象的销毁而”死亡“
- 局部变量:随着变量的创建而”出生“,随着所在作用域代码执行完毕而”死亡“
5、修饰符
- 成员变量:可以被public、protected、private、(static变为静态变量)、final等修饰
- 局部变量:不能被public、protected、private、static修饰,只能被final修饰
-
成员变量和局部变量的使用
当成员变量和局部变量同名时,需要给成员变量加上this关键字加以区分
3、成员方法
- 定义位置:在类中,方法体和代码块之外
- 定义语法:
[修饰符] 返回值类型 方法名(形参列表) {
return 返回值;
}
--> 此处修饰符不能使用static
- 调用语法:
对象名.方法名(实参列表); --> 在本类中调用成员方法,可以直接使用”方法名(实参列表)“进行调用
4、实例化对象
- 语法:类名 对象名 = new 类名(实参列表);
- 注意:每个对象都是独一无二的
- 对象实例化内存分析:
我们以类为模板,然后实例化出对象。此处在堆内存中创建的对象,则只会为类中的成员变量开辟存储空间。 - 匿名对象:通过new关键字创建的对象有两种
1、匿名对象:没有对象名的对象,例如:new Student();
2、非匿名对象:有对象名的对象,例如:Student stu = new Student();
在开发中,匿名对象使用较少,但在下列两种情况中,建议使用匿名对象
1、仅仅作为实参传递
2、只调用一次该实例化对象中的方法. - 内存图:
5、构造方法
- 语法:
[修饰符] 类名(形参列表) {
// 方法体
}
-
注意点:
1、没有返回值,也没有返回值类型
2、方法名必须时类名
3、构造方法是一个特殊的方法,有new关键字调用 -
创建对象步骤分析
1、创建对象,并为创建的对象中的成员变量开辟存储空间
2、为成员变量赋默认值
3、为成员变量显式赋值
4、调用构造函数,对成员变量进行指定赋值操作 -
创建对象是由谁来完成的
答案:new负责创建对象,开辟存储区域;构造函数用于实现成员变量指定初始化的操作,二者缺一不可 -
构造方法的作用(指定初始化)
1、无参构造- 作用:给成员变量的初始化操作,常用于给数组类型的成员变量在无参构造器中开辟存储空间
- 注意:在一个类中,没有给出任何构造器,会默认执行一个无参构造器
2、有参构造
- 作用:给成员变量的初始化操作,将形参的值赋给成员变量保存,进而完成指定初始化操作
- 注意:
1、建议形参名与成员变量名相同,然后使用this关键字区分
2、在一个类中,如果给出了有参构造方法,就不会执行默认的无参构造方法(除非再自定义一个无参构造方法)
3、建议每一个类中都定义一个无参构造器,避免在继承中出现子类找不到父类的无参构造器
-
构造方法的重载
构造方法也支持方法重载,在调用构造方法时,会根据调用构造方法的形参进行选择 -
构造方法与成员方法的区别
1、定义语法:- 构造方法没有返回值类型
2、调用语法:
- 构造方法:new 构造方法名(实参列表);
- 成员方法:对象.方法名(实参列表);
3、调用时期:
- 构造方法:创建对象时调用
- 成员方法:对象创建完毕后调用
4、调用次数
- 构造方法:只调用一次
- 成员方法:可以调用任意次数
6、this关键字
-
this关键字概述
创建一个对象成功后,虚拟机会动态的创建一个引用,该引用指向新创建的这个对象,并且该引用的名字就是this -
this指代的是什么
1、在构造方法中:指代的新创建的这个对象
2、在成员方法中:指代的是调用这个方法的对象
...... -
this关键字的使用
1、操作成员变量:对象.成员变量- 如果成员变量和局部变量同名,就需要使用this.成员变量来操作成员变量
- 如果成员变量和局部变量不同名,可以忽略this关键字
2、调用成员方法:对象.成员方法(实参列表)
- 调用当前类的成员方法,可以使用this.成员方法,也可以忽略this
3、调用构造方法:this(形参列表)
- 作用:调用当前类的其他构造方法,注意,这里调用构造方法没有创建对象,只是实现了代码的复用
- 注意:
1、这种用法只能放在构造方法中,并且只能放在构造方法有效代码的第一行
2、构造方法不能递归调用,也就是使用这种用法不能导致构造方法陷入死循环,所以不可能所有构造方法都使用this
7、static关键字
1、静态变量
-
定义位置:定义在类中,代码块和方法体外
-
定义语法:[修饰符] static 数据类型 变量名;
-
特点:
1、静态变量优先于对象存在,在类加载时,静态变量就已经存在了
2、在一个类中,静态变量只有一份,为类和对象所共享
3、可以通过对象来操作静态变量,也可以通过类名来操作静态变量,推荐使用类名来操作静态变量 -
静态变量与成员变量的区别
1、存储位置- 静态变量:存储在方法区
- 成员变量:存储在堆内存
2、创建次数
- 静态变量:只在类加载时创建一次
- 成员变量:在创建对象时创建,创建多少次对象,就创建多少次成员变量
3、调用语法
- 静态变量:可以使用对象.变量名,也可以使用类名.变量名调用
- 成员变量:只能使用对象.变量名调用
4、生命周期:
- 静态变量:类加载时”出生“,程序运行结束时”死亡“
- 成员变量:对象创建时”出生“,对象销毁时”死亡“
-
成员变量和静态变量的使用
成员变量:如果需要存储的数据是”特有数据“,就使用成员变量来存储
静态变量:如果需要存储的数据是”共享数据“,就使用静态变量来存储 -
静态变量内存分析
2、静态方法
- 定义:使用static修饰的方法
- 特点
1、静态方法优先于对象存在,在类加载时就已经存在
2、可以通过对象来调用静态方法(不建议),也可以通过类名来调用(建议) - 静态方法与成员方法的区别
1、操作变量的区别
成员方法中可以操作成员变量,也可以操作静态变量
静态方法中只能操作静态变量,不能操作成员变量
2、调用方法的区别
成员方法中可以调用本类中的其他成员方法和静态方法
静态方法中可以调用本类中其他静态方法,不能调用成员方法
3、操作this的区别
成员方法可以操作this
静态方法不可以操作this - 静态方法和成员方法的使用
1、成员方法:在方法中,如果需要直接操作当前类中的成员内容,则使用成员方法
2、静态方法:在方法中,我们只需要操作当前类中的静态内容,而不需要操作成员内容,建议使用静态方法
注意:静态方法常用于工具类,如:Arrays和Math
3、类的加载过程
当第一次使用某个类时,会将这个类的信息加载到方法区,并且还会给该类中的静态变量开辟存储区域,并设置该静态变量的默认值
4、代码块
-
什么是代码块:{}
-
代码块的分类:
1、局部代码块- 定义位置:在类中,代码块或方法体内部
- 定义个数:任意多个
- 执行顺序:从上往下,顺序执行
- 注意事项:在局部代码块中定义的变量,只能在当前作用域中使用,不能在代码块之外使用
2、构造代码块
- 定义位置:在类中,代码块或方法体之外
- 定义个数:任意多个
- 执行顺序:从上往下,顺序执行,每次调用构造方法之前,都会执行一次代码块中的代码
- 注意事项:
1、创建对象时,会调用构造代码块(也就是执行构造方法时)
2、在构造代码块中,我们不但可以调用当前类的静态内容,也可以调用当前类的成员内容
3、创建对象时,成员变量和构造代码块是从上往下,顺序执行,建议将成员变量放在前面
4、在代码块中定义的变量,则只能在该代码块中执行
3、静态代码块
- 定义位置:在类中,代码块和方法体之外
- 定义个数:任意多个
- 执行顺序:从上往下,依次执行
- 注意事项:
1、类加载时就会执行静态代码块中的代码
2、在静态代码块中,我们只能操作当前类的静态内容
3、类加载时,静态变量和静态代码块是从上往下,顺序执行,建议将静态变量放在前面
4、在静态代码块中定义的变量只能在当前代码块中使用
-
静态代码块、构造代码块和构造方法的执行顺序
类加载是执行静态代码块,对象创建时,先执行构造代码块,然后执行构造方法