构造器
学习目的
1.真正知道对象具体时通过调用什么代码得到的
2.能够掌握为对象赋值的简便写法
3.为以后学习面向对象编程的其他内容做支撑
定义&分类
定义
定义在类中的,可以用于初始化一个类的对象,并返回对象的地址。
格式:
//修饰符 类名(形参列表){}
public class Car{
//无参数构造器
public Car(){……}
//有参数构造器
public Car(Sering name, double price){……}
}
注意:这里只需要public即可,不需要class!
调用构造器得到对象的格式:
//类 变量名称 = new 构造器;
Car c = new Car();
Car c = new Car("奔驰", 39.80);
分类及作用
注意事项:
- 任何类定义出来,默认自带了无参数构造器,写不写都有。
- 一旦定义了有参数构造器,默认自带的无参数构造器就消失了,如果需要使用,就需要自己定义一下。
this关键字
定义:可以出现在构造器、方法中,代表当前对象的地址。
作用:可以用于指定访问当前对象的成员变量、成员方法。
this在有参数构造器中的用法
public class Car{
String name;
double price;
public Car(String name, double price){
name = name;
price = price;
}
public class Test {
public static void main(String[] args) {
Car c1 = new Car("凯迪拉克",30.0);
System.out.println(c1.price);
System.out.println(c1.name);
}
}
变量命名应该做到见名知义,所以说此处采用name变量来接传递过来的name值
在赋值的时候,传递过来的name值就近赋给了作为局部变量的name(它自己),并没有赋值给对象中的name,这样的话,这个构造器就是无效的,结果如下。
用this就可以完美解决这个问题(将以上代码第5.6行进行更改):this.name = name;
this.price = price;
this在有成员方法中的用法
public class Car{
String name;
double price;
public void goWith(Srting name){
System.out.println(name+"在和"+name+"比赛");
}
}
这种情况下,仍是传过来的name值运用两次,而忽视了对象中的name,在第五行第一个name前面加this.即可:`System.out.println(this.name+"在和"+name+"比赛");`
封装
定义&原则
定义: 封装是把彼此相关数据和操作包围起来,抽象成为一个对象,变量和函数就有了归属,想要访问对象的数据只能通过已定义的接口。
面向对象三大特征:封装、继承、多态。
表面上看,人画圆,画是人的动作,那应该放在人这里,实则不然,这里涉及到了封装的原则。
原则 :对象代表什么,就得封装什么样的数据,并提供数据对应的行为。
所以说这里就是圆提供了画的方法,人调用这个方法,画应该放在圆这个对象中。
封装思想的好处
Sun公司在Java提供了各类对象给我们使用,在设计时是按照封装原则设计的,会提供相应属性来封装数据,也会提供相应方法。
举个例子:
这是Scanner这个对象中所包含的部分方法,我们可以直接调用这些方法方便我们编程,但是如果Scanner所有方法都不能满足需求,那就只能自己创建对象和方法实现。
好处:
- 可以让编程变得简单些:有什么事,找对象,调方法即可。
- 降低学习成本,可以少学少计,需要时直接找即可。
更好的封装
- 一般建议对成员变量使用private(私有、隐藏)关键字修饰,修饰后的成员只能在当前类中访问。
- 为每个成员变量提供配套的getter、setter方法暴露其取值和赋值。
public class Student {
//private修饰
private int age;
//setter方法
public void setAge(int age) {
if(age>=0 && age<=200){
this.age =age;
}else{
System.out.println("Error!");
}
}
//getter方法
public int getAge() {
return age;
}
}
public class Test {
public static void main(String[] args) {
Student s = new Student();
s.setAge(23);
System.out.println(s.getAge());
}
}
如果在main方法中加入一行代码:
s.age = 15;
将会出现以下报错:'age' has private access in 'Student'
标准JavaBean
定义:也可以称为实体类,其对象可以用于在程序中封装数据。
书写要求:
- 成员变量必须使用private修饰
- 提供成员变量对应的setXxx()/getXxx()方法
- 必须提供一个无参数构造器,有参数构造器可写可不写
成员变量和局部变量的区别
每日一练
需求: 模仿电影信息展示
分析:
- 一部电影事一个对象,需要先设计电影类,再创建电影对象
- 三部电影对象可以以此用数组存储起来
- 依次遍历数组中的每个电影对象,取出其信息进行展示
最终代码:
public class Film {
private String name;
private double score;
private String role;
public Film(){
}
public Film(String name, double score, String role){
this.name = name;
this.score = score;
this.role = role;
}
//getter and setter
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setRole(String role) {
this.role = role;
}
public String getRole() {
return role;
}
public double getScore() {
return score;
}
public void setScore(double score) {
this.score = score;
}
}
public class main {
public static void main(String[] args) {
//设计电影类
Film[] films = new Film[3];
//输入电影信息
films[0] = new Film("《长津湖》",9.7,"吴京");
films[1] = new Film("《我和我的父辈》",9.6,"吴京");
films[2] = new Film("《五个扑水的少年》",9.5,"辛云来");
//遍历并展示信息
for (int i = 0; i < films.length; i++) {
System.out.println("=========================");
System.out.println("电影名:" + films[i].getName());
System.out.println("得分:" + films[i].getScore());
System.out.println("主演:" + films[i].getRole());
}
System.out.println("=========================");
}
}