构造方法
什么是构造方法
构造方法也叫构造函数,或者叫构造器
1、构造方法的方法名必须与类名相同
2、构造方法没有返回值,也不写void
构造方法的作用:为对象的属性初始化
类的属性在实例化时被赋予默认值,类的属性是由构造方法赋予默认值的
默认构造函数
一个类如果没有显示的定义构造函数,那么这个类默认具有无参数的构造函数。
默认构造函数为对象的属性赋默认值。
输出结果是
我的名字是null,我的成绩是0,我的学号是null
为什么输出的是null,0null?
因为本例中没有定义构造函数,系统会自动添加一个默认构造函数,默认构造函数是无参的,会为所有的属性赋默认值,因此name是null,score是0,no是null。
特殊情况:
如果显示的定义了构造函数,那么默认构造函数就没有啦。
例如:
构造方法的调用
构造方法是在实例化对象时调用的。并且实例化时传递的参数必须有构造方法的参数一致。
例如:
构造方法不允许对象名调用。例如下面的调用是错误的
构造方法的重载
这个实例化为什么报错
因为new 类时必须调用构造方法,而第8行有两个参数haha和76,因此会调用有两个参数的构造,但是类中没有定义有两个参数的构造,因此报错。
this关键字
this是java中的一个关键字。
this代表谁this代表的是当前正在运行的对象。
示例如下:
运行结果
我是haha,我的成绩是76,我的学号是null
本例中构造函数的参数都带1,这种命名不优雅,如果改成如下的命名方式
运行结果
我是null,我的成绩是0,我的学号是null
分析原因为什么是null,0,null
看构造函数
原因是
前后的name都是方法参数name
前后的score都是方法参数score
在类中,如果类的属性名和方法内部的局部变量同名时,那么在方法内部使用的是局部变量,也就是变量使用遵循就近原则。
如此看来类的属性名和构造方法的参数名称不能相同。
如果一定要让类的属性名和构造方法的参数名称相同,应该怎么办?
例如:
解决办法是使用this关键字
解决办法如下:
运行结果:
我是haha,我的成绩是76,我的学号是null
推荐这种写法
什么时候可以省略this
在非static方法内部使用属性,可以省略,例如
还可以这样写
但是推荐写上this
this可以调用重载的构造方法
例如:我们知道学生姓名和成绩,不知道学号,但是显示学生信息时要求将学号显示为”未知“,而不是null
分析:
有两种情况
1. 知道姓名和成绩,不知道学号
2. 知道姓名,成绩,学号
所以要设计两种构造的重载,设计结果如下
特别注意:下面的代码是错误的
因为this调用本类其他构造方法时,必须时构造方法内的第一行代码。
成员变量
成员变量是类的属性,是定义在类内,方法外的变量。
例如
成员变量和局部变量的区别
作用域不同
成员变量作用域:整个类
局部变量的作用域:方法内
初始值不同
成员变量由构造函数初始化的
局部变量需要手动初始化
在同一个方法中不允许有同名的局部变量,在不同的方法中可以有同名的局部变量。
局部变量可以和成员变量名相同,并且在使用时局部变量有更高的优先级。
对象数组
需求:
班级里有5名学生,输入每名学生的姓名和总成绩。
根据学生总成绩从高到低排名,显示学生名次、姓名、总成绩。
分析:
有哪些对象?有学生对象,有班级对象
对象有什么属性和方法?
学生有姓名,成绩的属性,学生不需要方法
班级有多名学生的属性,班级有排序方法,输出的方法
代码:
1:创建学生类
班级类
测试类
运行结果
姓名:杨礼之,成绩90,名次:1
姓名:田舍翁,成绩80,名次:2
姓名:乔思义,成绩70,名次:3
姓名:余晨,成绩65,名次:4
姓名:刘茂兵,成绩60,名次:5