java面向对象(上)-- 构造方法、this关键字

构造方法的定义

 实例化一个对象后,如果要为这个对象中的属性赋值,则必须要通过直接访问对象的属性或调用setXxx()的方式才可以。如果需要在实例化对象的同时就为这个对象的属性赋值,可以通过构造方法来实现。构造方法是类的一个特殊成员,它会在类实例话对象时被自动调用。 

 在一个类中如果定义的方法满足以下三个条件,该方法被称为构造方法:

  1. 方法名与类名相同。

  2. 在方法名的前面没有返回值类型的声明,包括void。

  3. 在方法中不能使用return语句返回一个值。

这时候大家可能会产生疑问,构造方法不是没有返回值吗?为什么不能用 void 声明呢?

  简单的说,这是 Java 的语法规定。实际上,类的构造方法是有返回值的,当使用 new 关键字来调用构造方法时,构造方法返回该类的实例,可以把这个类的实例当成构造器的返回值,因此构造器的返回值类型总是当前类,无须定义返回值类型。但必须注意不要在构造方法里使用 return 来返回当前类的对象,因为构造方法的返回值是隐式的。

  注意:构造方法不能被 static、final、synchronized、abstract 和 native(类似于 abstract)修饰。构造方法用于初始化一个新对象,所以用 static 修饰没有意义。构造方法不能被子类继承,所以用 final 和 abstract 修饰没有意义。多个线程不会同时创建内存地址相同的同一个对象,所以用 synchronized 修饰没有必要。

无参构造方法

 1 public class Person {
 2    //下面是类的构造方法
 3     public Person() {
 4         System.out.println("无参的构造方法被调用了....");
 5     }
 6 }
 7 
 8 class Example {
 9     public static void main(String[] args) {
10         Person p = new Person(); //实例化Person对象
11 
12     }
13  }

 运行结果:

有参构造方法   

  在一个类中除了定义无参的构造方法,还可以定义有参的构造方法。通过有参的构造方法就可以实现对属性的赋值

 1 public class Person {
 2     int age;
 3 
 4     //定义有参的构造方法
 5     public Person(int a) {
 6         age = a;
 7     }
 8     public void speak(){
 9         System.out.println("我今年" + age +"岁!");
10     }
11 }
12 
13 class Example {
14     public static void main(String[] args) {
15         Person p = new Person(20); //实例化Person对象
16         p.speak();
17     }
18  }

运行结果:

构造方法的重载  

  与普通方法一样,构造方法也可以重载,在一个类中可以定义多个构造方法,只要每个构造方法的参数类型或参数个数不同即可。在创建对象时,可以提供调用不同的的构造方法为不同的属性赋值。

 1 public class Person {
 2     String name;
 3     int age;
 4 
 5     //定义一个参数的构造方法
 6     public Person(String con_name,int con_age) {
 7         name = con_name;
 8         age = con_age;
 9     }
10     //定义一个参数的构造方法
11     public Person(String con_name) {
12         name = con_name;
13     }
14 
15     public void speak(){
16         System.out.println("大家好!我叫"+name +",我今年" + age +"岁!");
17     }
18 }
19 
20 class Example {
21     public static void main(String[] args) {
22         //分别创建两个对象p1,p2
23         Person p1 = new Person("张三");
24         Person p2 = new Person("李芳",20);
25         //通过p1,p2调用speak()方法
26         p1.speak();
27         p2.speak();
28     }
29  }

运行结果:

  注意:在java中的每个类都至少有一个构造方法,如果在一个类中没有定义构造方法,系统会自动为这个类创建一个默认的构造方法,这个默认的构造方法没有参数,在其方法体中没有任何代码,即什么也不做。由于系统提供的构造方法往往不能满足需求,因此,我们可以自己在类中定义构造方法,一旦为该类定义了构造方法,系统就不再提供默认的构造方法。在一个类中如果定义了有参的构造方法,最好再定义一个无参的构造方法,避免产生不必要的错误!!!

  简单点来说:构造方法用来初始化 java 类,提供类的初始化和实例化,以便调用。

总结:

1.当没有指定构造方法时,系统会自动添加无参的构造方法。

2.构造方法可以重载:方法名相同,但参数不同的多个方法,调用时会自动根据不同的参数选择相应的方法。

3.构造方法是不被继承的

4.当我们手动的指定了构造方法时,无论是有参的还是无参的,系统都将不会再添加无参的构造方法。

5. 构造方法不能被static、final、synchronized、abstract和native修饰。

 this关键字

  在上面的例子中,构造方法中使用的是con_age,成员变量使用的是age,这样的程序可读性很差,这时需要将一个类中表示年龄的变量进行统一的命名,例如都声明为age。但是这样做又会导致成员变量与局部变量的名称冲突,在方法中将无法访问对象的成员变量age。为了解决这个问题,java中提供了一个关键字this,用于在方法中访问对象的其他成员。

  1.通过this关键字可以明确地去访问一个类的成员变量,解决与局部变量名称冲突问题。

  

  2.通过this关键字调用成员方法。  

 1 public class Person {
 2     String name;
 3 
 4     public Person(String name) {
 5         this.name = name;
 6     }
 7 
 8     public String getName() {
 9         return name;
10     }
11 
12     public void setName(String name) {
13         this.name = name;
14     }
15 
16 
17     public void speak(){
18         System.out.println("大家好!我叫"+name +"!");
19     }
20 
21     public void openMouth(){
22         this.speak();
23     }
24 }
25 
26 class Example {
27     public static void main(String[] args) {
28         //创建对象p1,
29         Person p1 = new Person("张三");
30         //通过p1调用openMouth()方法
31 p1.openMouth(); 32 } 33 }

运行结果:

   在上面的openMouth()方法中,使用this关键字调用speak()方法,此处的this关键字可以省略不写,也就是说this.speak()和speak(),效果是完全一样的。

  3.构造方法是在实例化对象时被java虚拟机自动调用的,在程序中不能像调用其他方法一样去调用构造方法,但可以在构造方法中使用“this([参数1,参数2....])”的形式来调用其他的构造方法。

 运行结果:

在使用this关键字调用类的构造方法时,应注意以下几点:

  1.只能在构造方法中使用this调用其他的构造方法,不能再成员方法中使用。

  2.在构造方法中使用this调用构造方法的语句必须位于第一行,且只能出现一次。

  3.不能在一个类中的两个构造方法中使用this互相调用。

原文地址:https://www.cnblogs.com/wx60079/p/13392159.html