zoukankan      html  css  js  c++  java
  • 构造方法

    在多数情况下,初始化一个对象的最终步骤是去调用这个对象的构造方法。构造方法负责对象的初始化工作,为实例变量赋予合适的初始值。构造方法必须满足以下语法规则:

    (1) 方法名必须与类名相同。

    (2)不要声明返回类型。

    (3)不能被static、final、synchronized、abstract和native修饰。构造方法不能被子类继承,所以用final和

    abstract修饰没有意义。构造方法用于初始化一个新建的对象,所以用static修饰没有意义。多个线程不会同时创建内存地址相同的同一个对象,因此用synchronized修饰没有必要。此外,Java语言不支持native类型的构造方法。

     重载构造方法

    当通过new语句创建一个对象时,在不同的条件下,对象可能会有不同的初始化行为。例如对于公司新进来的一个雇员,在一开始的时候,有可能他的姓名和年龄是未知的,也有可能仅仅他的姓名是已知的,也有可能姓名和年龄都是已知的。如果姓名是未知的,就暂且把姓名设为"无名氏",如果年龄是未知的,就暂且把年龄设为-1。

    可通过重载构造方法来表达对象的多种初始化行为。以下例程的Employee类的构造方法有三种重载形式。在一个类的多个构造方法中,可能会出现一些重复操作。为了提高代码的可重用性,Java语言允许在一个构造方法中,用this语句来调用另一个构造方法。

    举例:

    public class Employee {
    
    private String name;
    
    private int age;
    
    /** 当雇员的姓名和年龄都已知,就调用此构造方法 */
    
    public Employee(String name, int age) {
    
    this.name = name;
    
    this.age=age;
    
    }
    
    /** 当雇员的姓名已知而年龄未知,就调用此构造方法 */
    
    public Employee(String name) {
    
    this(name, -1);
    
    }
    
    /** 当雇员的姓名和年龄都未知,就调用此构造方法 */
    
    public Employee() {
    
    this( "无名氏" );
    
    }
    
    public void setName(String name){this.name=name; }
    
    public String getName(){return name; }
    
    public void setAge(int age){this.age=age;}
    
    public int getAge(){return age;}
    
    }

    以下程序分别通过三个构造方法创建了三个Employee对象:

    Employee zhangsan=new Employee("张三",25);

    Employee lisi=new Employee("李四");

    Employee someone=new Employee();

    在Employee(String name)构造方法中,this(name,-1)语句用于调用Employee(String name,int age)构造方法。在Employee()构造方法中,this("无名氏")语句用于调用Employee(String name)构造方法。

    用this语句来调用其他构造方法时,必须遵守以下语法规则:

    (1)假如在一个构造方法中使用了this语句,那么它必须作为构造方法的第一条语句(不考虑注释语句)。

    以下构造方法是非法的:

    public Employee(){

    String name="无名氏";

    this(name); //编译错误,this语句必须作为第一条语句

    }

    (2)只能在一个构造方法中用this语句来调用类的其他构造方法,而不能在实例方法中用this语句来调用类的其他构造方法。

    (3)只能用this语句来调用其他构造方法,而不能通过方法名来直接调用构造方法。

    以下对构造方法的调用方式是非法的:

    public Employee() {

    String name= "无名氏";

    Employee(name); //编译错误,不能通过方法名来直接调用构造方法

    }

  • 相关阅读:
    【BZOJ 4581】【Usaco2016 Open】Field Reduction
    【BZOJ 4582】【Usaco2016 Open】Diamond Collector
    【BZOJ 4580】【Usaco2016 Open】248
    【BZOJ 3754】Tree之最小方差树
    【51Nod 1501】【算法马拉松 19D】石头剪刀布威力加强版
    【51Nod 1622】【算法马拉松 19C】集合对
    【51Nod 1616】【算法马拉松 19B】最小集合
    【51Nod 1674】【算法马拉松 19A】区间的价值 V2
    【BZOJ 2541】【Vijos 1366】【CTSC 2000】冰原探险
    【BZOJ 1065】【Vijos 1826】【NOI 2008】奥运物流
  • 原文地址:https://www.cnblogs.com/qq1312583369/p/10958681.html
Copyright © 2011-2022 走看看