• 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互相调用。

  • 相关阅读:
    SCRUM站立会议
    燃尽图
    第一次作业----词频统计
    构建之法读感
    final 评论 II
    final 评论 I
    第十一周PSP
    学期回顾
    第十周PSP
    Gradle学习笔记
  • 原文地址:https://www.cnblogs.com/wx60079/p/13392159.html
Copyright © 2020-2023  润新知