• java中的构造器


     构造器是一个创建对象时被自动调用的特殊方法,为的是初始化。构造器的名称应与类的名称一致。

           当创建一个个对象时,系统会该对象的属性默认初始化,基本类型属性的值为0(数值类型),false(布尔类型),把所有的引用类型设置为null.

           构造器可以改变这种默认的初始化。

           构造器的作用:是创建java对象的重要途径,是不是说构造器完全负责创建java对象?

           答:是创建java对象的重要途径,通过new关键字调用构造器时,构造器也确实返回了该类的对象,但这个对象并不是完全由构造器负责创建的。

            首先要注意的是Java的构造器并不是函数,所以他并不能被继承,这在我们extends的时候写子类的构造器时比较的常见,即使子类构造器参数和父类的完全一样,我们也要写super就是因为这个原因。

     
      构造器的修饰符比较的有限,仅仅只有public private protected这三个,其他的例如任何修饰符都不能对其使用,也就是说构造器不允许被成名成抽象、同步、静态等等访问限制以外的形式。
     
      因为构造器不是函数,所以它是没有返回值的,也不允许有返回值。但是这里要说明一下,构造器中允许存在return语句,但是return什么都不返回,如果你指定了返回值,虽然编译器不会报出任何错误,但是JVM会认为他是一个与构造器同名的函数罢了,这样就会出现一些莫名其妙的无法找到构造器的错误,这里是要加倍注意的。
     
      在我们extends一个子类的时候经常会出现一些意想不到的问题,我在这里说一些和构造器有关的。

    首先说一下Java在构造实例时的顺序(不讨论装载类的过程)。

     
      构造的粗略过程如下:
     
      1、分配对象空间,并将对象中成员初始化为0或者空,java不允许用户操纵一个不定值的对象。
     
      2、执行属性值的显式初始化(这里有一点变化,一会解释,但大体是这样的)。
     
      3、执行构造器
     
      4、将变量关联到堆中的对象上

     介绍一下准备知识,以备一会来详细说明这个的流程。

     

      this() 、super()是你如果想用传入当前构造器中的参数 or 构造器中的数据调用其他构造器或者控制父类构造器时使用的,在一个构造器中你只能使用this()或者super()之中的一个,而且调用的位置只能在构造器的第一行,在子类中如果你希望调用父类的构造器来初始化父类的部分,那就用合适的参数来调用super(),如果你用没有参数的super()来调用父类的构造器(同时也没有使用this()来调用其他构造器),父类缺省的构造器会被调用,如果父类没有缺省的构造器,那编译器就会报一个错误。

         注意此处,我们经常在继承父类的时候构造器中并不写和父类有关的内容,此时如果父类没有缺省构造器,就会出现编译器添加的缺省构造器给你添麻烦的问题了哦。

     

    1. public class Manager extends Employee {  
    2.   private String department;  
    3.   public Manager(String name, double salary, String dept)  
    4.  {  
    5.    super(name, salary);  
    6.    department = dept;  
    7.  }  
    8.  public Manager(String n, String dept) {  
    9.    super(name);  
    10.    department = dept;  
    11.  }  
    12.  public Manager(String dept) {  
    13.   // 这里就没有super(),编译器会自动地添加一个空参数的缺省super构造器,此时如果Employee类中没有空参数的缺省构造器,那就会导致一个编译错误  
    14.    department = d;  
    15.  }  
    16.  }  
  • 相关阅读:
    Effective Java 的笔记(二)
    设计模式系列 装饰模式
    一道多线程题目的解决方案
    Effective Java 的笔记(一)
    Java 并发编程实践
    【转】微博技术底层架构的实现
    Head First JavaScript 笔记
    JVM 学习笔记 类的加载和执行
    背包问题
    Oracle 序列号通过定时任务重置
  • 原文地址:https://www.cnblogs.com/skjsg/p/4856885.html
Copyright © 2020-2023  润新知