对象的定义和赋值操作:
// 会员类
public class Vip {
// 类 = 属性 + 方法
// 属性:描述的是状态。
// 方法:描述的是行为。
// 姓名
String name; // 实例变量(对象变量)
// 年龄
int age; // 实例变量(对象变量)
public void shopping(){
System.out.println("正在购物!");
}
}
//对象的使用和赋值
public class VipTest01 {
public static void main(String[] args) {
// 创建一个Vip对象
Vip vip1 = new Vip();
// 给name和age属性赋值
vip1.name = "jack";
vip1.age = 20;
System.out.println("name = " + vip1.name);
System.out.println("age = " + vip1.age);
// 去购物
vip1.shopping();
// 再创建一个Vip对象
Vip vip2 = new Vip();
vip2.name = "lisi";
vip2.age = 15;
System.out.println("name = " + vip2.name);
System.out.println("age = " + vip2.age);
// 去购物
// 实例方法需要使用“引用.”来调用。
vip2.shopping();
}
}
****如果要创建100个对象的话,那么给对象的属性依次赋值就很麻烦。或者是当我们已经指导对象属性的各个初始值时,如果在定义的时候就能给对象属性赋值就可以节约很多的步骤,代码会更加简介。
构造方法(也叫构造器)
- 构造方法/Constructor/构造器
-
- 构造方法有什么作用?
- 作用1:对象的创建(通过调用构造方法可以完成对象的创建)
- 作用2:对象的初始化(给对象的所有属性赋值就是对象的初始化)
-
- 怎么定义构造方法呢?
- [修饰符列表] 构造方法名(形参列表){
-
构造方法体;
- }
- 注意:
- 构造方法名必须和类名一致。
- == 构造方法不需要提供返回值类型。==
- 如果提供了返回值类型,那么这个方法就不是构造方法了,就变成普通方法了。
-
- 构造方法怎么调用呢?
- 使用new运算符来调用。
- == 语法:new 构造方法名(实参);==
- 注意:构造方法最终执行结束之后,会自动将创建的对象的内存地址返回。但构造方法体中不需要提供“return 值;”这样的语句。
- 4.在java语言中,如果一个类没有显示的去定义构造方法,系统会默认提供一个无参数的构造方法。(通常把这个构造方法叫做缺省构造器。)
- 5.一个类中如果显示的定义了构造方法,系统则不再提供缺省构造器。所以,为了对象创建更加方便,建议把无参数构造方法手动的写出来。
- 6.在java中,一个类中可以定义多个构造方法,而且这些构造方法自动构成了方法的重载(overload)。
-
- 构造方法中给属性赋值了?为什么还需要单独定义set方法给属性赋值呢?
- 在构造方法中赋值是对象第一次创建时属性赋的值。set方法可以在后期的时候调用,来完成属性值的修改。
- 8.构造方法执行原理?
- 构造方法执行包括两个重要的阶段:
- 第一阶段:对象的创建 在花括号 {} 前完成。
- 第二阶段:对象的初始化在方法体中完成
-
- 对象在什么时候创建的?
- new的时候,会直接在堆内存中开辟空间。然后给所有属性赋默认值,完成对象的创建。(**这个过程是在构造方法体执行之前就完成了。)
-
- 对象初始化在什么时候完成的?
- *构造方法体开始执行,标志着开始进行对象初始化。构造方法体执行完毕,表示对象初始化完毕。
-
- 构造代码块?
- 语法格式:
{}
- 构造代码块什么时候执行,执行几次?
-
每一次在new的时候,都会先执行一次构造代码块。
-
构造代码块是在构造方法执行之前执行的。
-
- 构造代码块有什么用?
- 如果所有的构造方法在最开始的时候有相同的一部分代码,不妨将这个公共的代码提取到构造代码块当中,这样代码可以得到复用。
*/
构造方法的应用:
public class Vip {
String name; // 实例变量(对象变量)
// 年龄
int age; // 实例变量(对象变量)
//构造方法
public Vip(){
}
public Vip(String name,int age){
this.name = name;
this.age = age;
}
public void shopping(){
System.out.println("正在购物!");
}
public class VipTest01 {
public static void main(String[] args) {
// 创建一个Vip对象
Vip vip1 = new Vip("zhangsan",15);
System.out.println("name = " + vip1.name);
System.out.println("age = " + vip1.age);
// 去购物
vip1.shopping();
// 再创建一个Vip对象
Vip vip2 = new Vip("lisi",15);
System.out.println("name = " + vip2.name);
System.out.println("age = " + vip2.age);
vip2.shopping();
}
}
this关键字的语法总结:
this(实参的应用);
上文中说到,构造方法可以构成方法重载;但是构造方法中也有更多相近的代码,如果重复写的话就很麻烦。比如下方代码块所示:
/**
* this(实参):
* 1. 通过这种语法可以在构造方法中调用本类中其他的构造方法。
* 2. 作用:代码复用。
* 3. this(实参); 只能出现在构造方法第一行。
*/
/*需求:定义一个日期类,代表日期。日期属性包括:年月日。
* 提供两个构造方法,一个是无参数构造方法,当通过无参数构造方法实例化日期对象的时候,默认创建的日期是1970-01-01
* 另一个构造方法三个参数,通过传递年月日三个参数来确定一个日期。注意属性要提供封装。
*/
public class Date {
/**
* 年
*/
private int year;
/**
* 月
*/
private int month;
/**
* 日
*/
private int day;
public Date() {
/*
this.year = 1970;
this.month = 1;
this.day = 1;
如果有100个或者更多的实例变量,这样的赋值语句就要写很多次,多个构造函数的话,次数还会再加N倍,因此为了提高代码复用性,可以用this(实参)。
*/
// 不要这么写,这样会导致再创建一个新的对象。
//new Date(1970,1,1);
// 不会创建新对象。只是通过一个构造方法去调用另一个构造方法。
this(1970,1,1);
System.out.println("日期创建成功!~");
}
public Date(int year, int month, int day) {
this.year = year;
this.month = month;
this.day = day;
}
public int getYear() {
return year;
}
public void setYear(int year) {
this.year = year;
}
public int getMonth() {
return month;
}
public void setMonth(int month) {
this.month = month;
}
public int getDay() {
return day;
}
public void setDay(int day) {
this.day = day;
}
/**
* 打印日期
*/
public void display(){
//System.out.println(this.year + "年" + this.month + "月" + this.day + "日");
System.out.println(this.getYear() + "年" + this.getMonth() + "月" + this.getDay() + "日");
}
}
留一个思考:
==比如说计算创建对象的个数,就可以把这个计数器放在构造代码块中。==但是,如果每次创建一个对象就要加一,说明这个计数的变量一定不能是实例变量,因为实例变量是一个对象一份,而这个计数的变量应该是所有的变量公用一个。
那么计数的变量count应该用什么关键字呐??
类体的变量分为两种:
- 实例变量
- 静态变量 用static关键字修饰。