成员变量
定义位置:在类中,代码块和方法之外。
定义语法:[修饰符] 数据类型 变量名;
--> 注意:成员变量绝对不允许使用static关键字修饰。
操作成员变量语法:对象.成员变量名
注意:在成员方法中,我们可以直接通过“成员变量名”来操作当前类的成员变量。
成员方法
定义位置:在类中,代码块和方法之外。
定义语法:[修饰符] 返回值类型 方法名(形参列表) {
// 方法体
return [返回值];
}
--> 注意:成员方法绝对不允许使用static关键字修饰。
调用成员方法语法:对象.成员方法名(实参列表);
注意:在成员方法中,我们可以直接通过“成员方法名(实参列表)”来调用当前类的成员方法。
创建对象语法:类名 对象名 = new 类名(实参列表);
成员变量的默认值
注意:成员变量的默认值和数组元素默认值规则一模一样。
整数型(byte、short、int和long)的默认值为0
浮点型(float和double)的默认值为0.0
布尔型(boolean)的默认值为false
字符型(char)的默认值为'\u0000',代表一个空格
引用数据类型的默认值为null
成员变量的赋值
a)默认初始化
给成员变量开辟存储空间之后,就会给该变量做默认初始化
b)显示初始化
显示初始化之后,创建出来对象的成员变量值都是一模一样。
c)指定初始化
对象创建完毕后,我们可以对成员变量做指定初始化,这样每个对象的成员变量值都可以不一样。
执行顺序:先默认初始化,然后在显示初始化,最后再指定初始化
创建对象的过程
总结:a)创建对象的时候,此处只为“成员变量”开辟了存储空间,成员方法无需开辟存储空间。
b)调用成员方法的时候,会在栈内存中开辟一个栈帧,方法调用结束后自动弹栈。
c)生活中,每个对象都是独一无二的,编程中,new出来的对象也是独一无二的,因为new出来的每个对象地址值都不一样。
成员变量和局部变量
局部变量的定义:定义在代码块或方法中的变量,我们称之为局部变量。
成员变量的定义:定义在类中,代码块和方法之外的变量,并且没有使用static修饰,我们称之为成员变量。
定义位置区别
局部变量:定义在代码块或方法体中
成员变量:在类中,代码块和方法之外。
存储位置区别
局部变量:存储在栈内存中(基本数据类型,存储的是“数据值”;引用数据类型,存储的是“地址值”)。
成员变量:存储在堆内存中。
默认值的区别
局部变量:没有默认值,因此只声明未赋值的局部变量,只能做赋值操作,不能做取值操作。
成员变量:有默认值,默认值规则和数组元素默认值规则一模一样。
生命周期区别
局部变量:声明变量的时候就“出生”,直到当前作用域执行结束就“死亡”;
成员变量:随着对象的创建而“出生”,随着对象的销毁而“死亡”。
修饰符的区别
局部变量:不能被public、protected、private、static修饰,只能被final修饰
成员变量:可以被public、protected、private、static、final等修饰符修饰;
问题:当成员变量和局部变量同名的时候,如果区分???
答案:当成员变量和局部变量同名的时候,那么默认采用“就近原则”,也就是随离得近,就使用谁。
成员变量:使用this关键字来操作
局部变量:直接通过变量名来操作
通过new关键字创建出来的对象,我们可以分为两大类:
a)有名字的对象。--> Student stu = new Student();
b)匿名对象。 --> new Student();
匿名对象的作用???
a)当对象只需要使用一次时,那么建议使用匿名对象。
new Student().study();
b)当对象只作为方法的实参时,那么建议使用匿名对象。
method(new Student());
1.基本数据类型的传递
总结:基本数据类型的传递属于“数据值”传递。
2.引**用数据类型的传递**
总结:引用数据类型的传递属于“地址值”传递。
3.在java语言中数据传递
总结:java语言数据的传递都是“值”传递,所谓“值”传递就是传递变量在内存中存储的数据,
基本数据类型在内存中存的是“数据值”,引用数据类型在内存中存储的是“地址值”。
构造方法,又称之为“构造器”或“构造函数”。
1.构造方法的引入
Student stu = new Student();
Scanner input = new Scanner(System.in);
2.构造方法的语法:
[修饰符] 类名(形参列表) {
// 方法体
}
注意事项:
a)构造方法中没有“返回值类型”,也就意味着方法体中无需返回任何数据。
b)在构造方法中,方法名必须和“类名”保持一致,也就是构造方法名采用“大驼峰”命名。
c)在方法体中,我们不能返回任何数据,因为构造方法中没有定义“返回值类型”。
d)构造方法是一个特殊方法,只能通过new关键字来调用。
3.对象创建的过程
例如:“new Student();”代码的执行过程
第一步:通过new关键字,在堆内存中开辟一块存储空间,并且对成员变量实现默认初始化。
第二步:默认初始化完后后,在执行显示初始化。
第三步:接下来,就执行构造方法,从而实现对成员变量做指定初始化。
--> 请问:执行构造方法之前,对象肯定已经创建成功啦。
问题:对象创建完全是由构造方法实现的吗?
答案:new关键字负责创建对象,构造方法用于给成员变量做指定初始化操作。
创建对象的时候,new和构造方法缺一不可,必须配合一起使用。
4.构造方法的作用
a)创建对象的时候,new和构造方法缺一不可,必须配合一起使用。
b)我们通过构造方法,从而实现对成员变量做指定初始化的操作(重要)。
5.无参构造方法
作用:可以在无参构造方法中,我们对数组类型的成员变量开辟指定大小的存储空间。
注意:如果一个类中没有显示的提供构造方法,那么源文件编译的时候“编译器”会默认提供一个无参构造方法。
6.有参构造方法
注意:a)如果类中显示的提供了构造方法,那么编译的时候就不会默认提供一个无参构造方法啦。
b)建议,每个类中都需要有一个无参构造方法,避免在继承体系下找不到父类的无参构造方法。
c)当成员变量和局部变量同名的时候,那么我们使用this关键字来区分。
7.构造方法的重载
调用:根据实参列表来选择调用合适的构造方法。
成员方法和构造方法
a)定义语法区别
成员方法:[修饰符] 返回值类型 方法名(形参列表) {
// 方法体
return [返回值];
}
注意:成员方法不能使用static关键字修饰。
构造方法:[修饰符] 类名(形参列表) {
// 方法体
}
b)调用方式区别
成员方法:必须通过“对象”来调用。
构造方法:应该通过“new”关键字来调用。
c)调用时期区别
成员方法:对象创建完毕后,我们在调用成员方法。
构造方法:在创建对象的时候,我们配合new关键字来调用构造方法。
d)调用次数区别
成员方法:任意多次。
构造方法:每调用一次,那么就会创建一个对象。
补充:
在构造方法中,我们可以直接调用当前类的成员方法(有意义)。
在成员方法中,我们不能直接调用当前类的构造方法(没意义)。