先说构造方法 当你new出一个对象时,它就会被调用.
特性:
1.名字必须与类名相同
2.没有返回值类型,设置void也不行
3.创建对象时由编译器自动调用,并且在对象的生命周期内只调用一次
4.构造方法可以重载(根据自己的需求提供不同的参数的构造方法
public class Person {
public String name;
public int age;
public Person() { //构造方法
}
public void show() {
System.out.println("姓名: " + name + " 年龄: " + age);
}
}
)
如果你不主动写这个构造方法 Java会给每个类一个默认的构造方法 并且会处于隐藏 不会显示
class Person {
public String name;
public int age;
public Person() { //构造方法
System.out.println("这是一个构造方法");
}
public void show() {
System.out.println("姓名: " + name + " 年龄: " + age);
}
}
public class Test {
public static void main(String[] args) {
//在这句话执行完之前 会调用Person类的构造方法
Person person1 = new Person();
}
}
运行结果:
Person()构造方法没有任何参数 我们也将它称为无参构造
一般的我们通过调用有参构造来给成员变量赋值
class Person {
public String name;
public int age;
public Person() { //构造方法
System.out.println("这是一个构造方法");
}
public Person(String name1, int age1) {
name = name1;
age = age1;
}
public void show() {
System.out.println("姓名: " + name + " 年龄: " + age);
}
}
public class Test {
public static void main(String[] args) {
//在这句话执行完之前 会调用Person类的构造方法
Person person1 = new Person();
//调用有参构造
Person person2 = new Person("张三",22);
person2.show();
}
}
运行结果:
我们会发现通过构造方法我们就可以对成员变量进行赋值
有一个细节:当我们提供了有参构造那么Java将不会再给我们提供无参构造
class Person {
public String name;
public int age;
public Person(String name1, int age1) {
name = name1;
age = age1;
}
public void show() {
System.out.println("姓名: " + name + " 年龄: " + age);
}
}
public class Test {
public static void main(String[] args) {
//这句就会报错
Person person1 = new Person();
Person person2 = new Person("张三",22);
person2.show();
}
}
下面就会报错 原因就在于你写了一个构造方法 那么java就不会再给你提供无参构造方法了
这时就需要你手动写进去
接下来就说说this
先来看个例子吧
这是一个有参构造方法 目的很简单 我们想通过构造方法给成员变量赋值
但是我们通过下面的代码会发现 形参与我们的成员变量命名一样 那这样的话编译器会认为这时形参给形参赋值
public Person(String name, int age) {
name = name;
age = age;
}
那如何避免这种情况呢
没错 this
this 代表的是当前对象的引用
当前对象的引用是 person1 而person1中存的是 new Person()的地址
故this存的就是new Person()的地址
通过地址就可以找到要被赋值name成员变量 就相当于 person1.name
这样就可以解决重命名的问题了
public Person(String name, int age) {
this.name = name;
this.age = age;
}
再看一个例子
class DataUtil {
public int year;
public int month;
public int day;
public void setdataUtil(int year, int month, int day) {
this.day = day;
this.year = year;
this.month = month;
}
}
public class Test {
public static void main(String[] args) {
DataUtil dataUtil = new DataUtil();
dataUtil.setdataUtil(2001,6,3);
}
}
在我们调用方法时 其实讲的细一点 方法里面还有一项
public void setdataUtil(DataUtil this, int year, int month, int day) {
this.day = day;
this.year = year;
this.month = month;
}
在我们调用的时候相当于把引用的地址传给了this
当然了 下面这样写是错了 目的想让大家了解在调用方法的时候 它会把引用的地址传递给this
dataUtil.setdataUtil(dataUtil,2001,6,3);
欧克 到此就结束了 希望对大家有点帮助
溜了溜了