目录
构造方法
概述
1: 用于给成员变量赋值的方法
2:格式
public 类名(形式参数){
给成员变量赋值
}
3:说明
1:构造函数没有返回值类型,连void也没有。
2:构造函数的方法名必须和类名一样,连大小写都要一样。
4:调用的情况
1:在创建对象的时候,由虚拟机自动调用,自动为创建的对象进行赋值,一个对象只能调用一次。
2:不能显示的调用构造方法,否则会编译错误。
5:注意方法
1:如果没有手动定义任何的构造方法,系统会默认提供一个空参构造
2:一旦手动提供了任何构造方法,系统就不在提供任意的构造方法。
3:一般来说,需要手动提供有参和空参构造,形成构造方法的重载:
特此说明:方法的重载:是指具有一类相同功能的方法。重载的特点:必须在同一类中,方法名性相同,与方法的返回值类型无关,对于形参:形参的个数,形参的类型,形参的顺序需要不一样。
构造方法和set方法的比较
1:相同点:都是给成员变量赋值
2:不同点:
1:调用的时机:构造方法是创建对象时由jvm自动调用的;set方法是对象创建完成之后调用的
2:调用的主体:构造方法是jvm自动调用的;set方法是对象名手动调用的。
3:调用次数:构造方法在对象的初始化时只能有jvm自动调用一次;set方法可以调用多次。
创建对象的详细过程
1:成员变量的初始化:
默认的初始化赋值:创建一个对象后,由构造函数对所创的对象进行赋值,此时构造函数内部会对对象进行赋值。
显示的初始化赋值:调用set方法对对象进行赋值
构造方法初始化赋值:调用相对应的构造函数,在参数里边对对象进行赋值。
2:详细过程
将要创建的对象所属的类型,加载到方法区
在栈内存中,创建该对象的引用,用来存储该类对象再堆中的地址
在堆中,开辟空间,创建对象。(注意所有的new操作都会在内存中开辟一块空间)
默认初始化
显示初始化
构造方法初始化
将对象的地址赋值给栈内训的引用
静态
概述:
1:没有静态的情况:
相同的数据,需要在每个对象中都存储一次,浪费内存空间;将来不好维护(每个对象都需要修改)
2:有静态的情况:
将相同的数据,存储在这个类的字节码对象中的静态区,可以被所有类对象共享,节省了内存空间,将来也好维护(只需要修改一次)
3:静态变量的解释:
非静态变量,随着对象的不同,可以有不同的变量值,因此成为动态的。
静态变量,随着对象的不同,无法不同的变量值,认为是静止不变的,所以称为讲台变量.
静态变量的特点
1:使用static关键字
既可以修饰成员变量,也可以修饰成员方法,也可以修饰成员内部类
2:随着类的加载而加载
加载:在内存中华开辟空间,并且赋值
3:优先于对象而存在
4:被该类所有的对象共享
5:可以使用类名直接访问
类名.静态变量名
类名.静态方法名
静态方法的注意事项
1:静态方法不能访问非静态的变量
静态方法,可以在创建对象之前,直接被类名调用;非静态变量,在对象创建之后才存在;如果静态方法可以访问非静态的变量,就是相当于在对象创建之前,就能访问对象创建之后的数据
2:静态方法不能访问非静态方法
非静态方法可以访问非静态变量,也可以访问静态变量。如果静态方法可以访问非静态变量的关键字,相当于在创建对象之前就要访问创建对象之后的数据了。
3:静态方法不访问this,super等关键字
this,super都表示对象创建之后某部分数据的引用,如果静态方法可以访问this,super等关键字,相当于在对象创建之前就要访问对象创建之后的数据。
总结:总之,在一个类中,在静态方法里边,不能调用该类的非静态方法,不能调用该类的非静态成员变量。在非静态方法中,可以调用该类的静态方法,也可以调用该类的静态常量。
静态变量和非静态变量的比较
1:相同点 都是成员变量
2:不同点
概念不同:
静态变量属于类,成为类变量
非静态变量属于对象,称为对象变量,实例变量
内存位置不同:
静态变量属于类,和类的字节码在一起,在方法区的类的字节码中的静态区
非静态变量属于对象,和对象在一起,在堆内存的对象中
声明周期不同:
静态变量属于类的加载而加载,随着类的消失而消失
非静态变量属于对象,随着对象的创建而存在,随着对象被当做垃圾回收而消失
代码访问的方式不同:
静态变量既可以使用对象名访问,也可直接使用类名访问。
非静态变量只能使用对象名访问
静态代码块
1:用于给静态成员变量赋值,用于执行只执行一次的代码
2:位置
类中方法外
3:格式
static{
各种语句;
}
4:执行时机:
随着类的加载而执行,由于类只加载一次,所以也只能执行一次。