1:对象的创建
类定义好之后,就可以创造出对象(对象也叫实例),一个类可以创建多个对象。总之类是对象的模板,对象是类的实例。语法格式:new 类名();这样就完成了对象的创建。
请看如下代码:
public class Student {
public static void main(String[] args) {
//创建一个学生对象
new Student();
//创建一个学生对象
new Student();
}
}
为了使用对象更加的方便,建议使用变量接收一下。请看如下代码:
public class Student {
public static void main(String[] args) {
Student student1 = new Student();
Student student2 = new Student();
}
}
/* 这里的Student是数据类型 ,student1是变量
int a = 10;
这里的Student和这里的int一样属于数据类型,只不过Studnet是引用类型,int是基本数据类型
student1和a一样是一个变量,保存了一个地址
*/
2:对象的访问
public class Student {
//姓名
String name;
//姓名
int age;
public static void main(String[] args) {
Student student1 = new Student();
Student student2 = new Student();
student1.name = "张三";
student1.age = 18;
System.out.println(student1.name);
System.out.println(student1.age);
}
}
3:对象创建的内存简图
以上代码在执行过程中内存的变化如下图所示:
4:构造方法
1:构造方法名和类名一致。
2:构造方法用来创建对象,以及完成属性的初始化。
3:构造方法无返回值,写成void也不行。
4:构造方法的返回值类型实际上是当前类的类型。
5:一个类中可以定义多个构造方法,这些构造方法构成重载。
请看如下代码:
public class Date {
int year; //年
int month; //月
int day; //日
//无参构造方法
public Date() {
System.out.println("无参构造方法");
}
public static void main(String[] args) {
new Date();
}
}
Java语法规定:当一个类没有显示的定义任何构造方法的时候,系统会默认提供一个无参构造方法,当显示的定义构造方法之后,系统就不会在提供构造方法。
请看如下代码:
public class Date {
int year; //年
int month; //月
int day; //日
//无参构造方法
public Date() {
System.out.println("无参构造方法");
}
//带一个参数构造方法
public Date(int year) {
System.out.println("带一个参数构造方法");
}
//带两个参数的构造方法
public Date(int year, int month) {
System.out.println("带两个参数的构造方法");
}
//带三个参数的构造方法
public Date(int year, int month, int day) {
System.out.println("带三个参数的构造方法");
}
public static void main(String[] args) {
new Date();
new Date(2024);
new Date(2024, 6);
new Date(2024, 6, 1);
}
}
通过测试可以知道:构造方法支持重载机制,具体调用哪个构造方法,需要看调用时传递的实际参数列表符合哪个构造方法。
构造方法虽然不写任何的返回值,但它在执行结束之后实际上会返回该对象在堆内存当中的内存地址,这个时候定义变量接收对象的内存地址,这个变量叫做引用变量(引用)。
请看如下代码:
public class Date {
int year; //年
int month; //月
int day; //日
//无参构造方法
public Date() {
}
//带一个参数构造方法
public Date(int year) {
}
//带两个参数的构造方法
public Date(int year, int month) {
}
//带三个参数的构造方法
public Date(int year, int month, int day) {
}
public static void main(String[] args) {
Date date1 = new Date();
System.out.println(date1);
Date date2 = new Date(2024);
System.out.println(date2);
Date date3 = new Date(2024, 6);
System.out.println(date3);
Date date4 = new Date(2024, 6, 1);
System.out.println(date4);
}
}
运行结果:
注意:在编写构造方法的时候需要注意局部变量和成员变量名字相同的情况:
public class Date {
int year; //年
int month; //月
int day; //日
//带三个参数的构造方法
public Date(int year, int month, int day) {
year = year;
month = month;
day = day;
}
public void print() {
System.out.println(year + "-" + month + "-" + day);
}
public static void main(String[] args) {
Date date = new Date(2024, 1, 1);
date.print();
}
}
//结果: 0-0-0
正确的写法:
public class Date {
int year; //年
int month; //月
int day; //日
//带三个参数的构造方法
public Date(int year, int month, int day) {
this.year = year;
this.month = month;
this.day = day;
}
public void print() {
System.out.println(year + "-" + month + "-" + day);
}
public static void main(String[] args) {
Date date = new Date(2024, 1, 1);
date.print();
}
}
//2024-1-1
5:空指针异常
当一个空引用去访问实例变量或者实例方法的时候会发生空指针异常(NullPointerException)。
将上述代码修改一下:
public class Date {
int year; //年
int month; //月
int day; //日
//带三个参数的构造方法
public Date(int year, int month, int day) {
this.year = year;
this.month = month;
this.day = day;
}
public void print() {
System.out.println(year + "-" + month + "-" + day);
}
public static void main(String[] args) {
Date date = new Date(2024, 1, 1);
date.print();
date = null;
date.print();
}
}
运行结果: