构造函数

构造方法:

构造方法作用:用于创建对象并且对对象进行初始化

                每个类都有构造方法  方法名和类名一样

在没有写构造方法的类中 默认隐藏着一个无参的构造方法

构造方法可以有多个   但是参数不同

                类中也可以没有构造方法,如果没有 就得用普通的方法a做构造方法要做的事情,然后在调用的时候先调用普通方法a做构造方法要做的事情,并且在每次调用该类中方法的时候都需要先调用普通方法a,这样就会比较麻烦,所以最好使用构造方法来避免此类麻烦。

在一个类被创建成对象的时候  必定是通过构造方法创建  也就是说创建对象时 必定有一个构造方法被调用
每个构造方法都默认的有一句super();  可以隐藏也可以不隐藏   指向父类的无参构造方法  相当于调用了父类的无参构造方法
java这门语言在设计的时候,每一个类都默认继承了一个父类  这个父类叫Object
super是一个关键字指向父类  this指向自己
一个关键字this 就代表了这个类   this是指向这个类创建的对象的
创建的对象没有static方法   对象创建后所有的  static修饰的方法都会被抛弃  想调用static方法 只能使用类名+方法名

        类创建对象必须使用 new +构造方法();
        创建对象 Person person = new Person();

        生成一个对象  你是能使用它去调用自己要使用的方法

构造函数与普通函数的区别:

(1)一般函数是用于定义对象应该具备的功能。而构造函数定义的是,对象在调用功能之前,在建立时,应该具备的一些内容。也就是对象的初始化内容。

(2)构造函数是在对象建立时由jvm调用给对象初始化。一般函数是对象建立后,当对象调用该功能时才会执行。

   在这里要说明一点,如果在类中我们不声明构造函数,JVM会帮我们默认生成一个空参数的构造函数;如果在类中我们声明了带参数列表的构造函数,JVM就不会帮我们默认生成一个空参数的构造函数,我们想要使用空参数的构造函数就必须自己去显式的声明一个空参的构造函数。

(3)普通函数可以使用对象多次调用,构造函数就在创建对象时调用。

(4)构造函数的函数名要与类名一样,而普通的函数只要符合标识符的命名规则即可。

(5)构造函数没有返回值类型。

构造函数要注意的细节:

(1)当类中没有定义构造函数时,系统会指定给该类加上一个空参数的构造函数。这个是类中默认的构造函数。当类中如果自定义了构造函数,这时默认的构造函数就没有了。

备注:可以通过javap命令验证。

(2)在一个类中可以定义多个构造函数,以进行不同的初始化。多个构造函数存在于类中,是以重载的形式体现的。因为构造函数的名称都相同。

构造函数在继承中的特点:

        在继承中,子类创建的对象可以调用父类的公共方法和属性,那么子类会不会调用父类的构造函数呢?子类的构造函数与父类的构造函数有什么关系?子类的构造函数需要注意些什么问题呢?下面来解答这三个问题:

1)  子类会不会调用父类的函数?

      子类继承父类,子类对象初始化时父类的构造函数也会执行,因为子类需要使用父类中的属性,子类需要知道是如何初始化的,所以子类初始化必然会调用父类的构造函数(除非父类没有属性,那么这个类的描述也太差了点,或者没有必要去创建这个类了)。

    2)  子类的构造函数与父类的构造函数有什么关系?

      子类的构造函数中默认的第一行有一条隐式语句super(),该语句会访问父类中的空参数构造函数,除非父类中没有空参数的构造函数,那么子类构造函数的第一行必须显式调用父类的构造函数,即super(int x,…) 。

    3)  子类的构造函数需要注意些什么问题呢?

      子类的构造函数中,super()语句代表调用了父类的构造函数;this()语句代表调用了子类自身的构造函数。需要注意的是,如果这两条语句显式写出来必须放在构造方法的第一行,而且这两条语句不能共存,一个构造函数中的第一行要么是this()要么是super()。

      为什么在第一行?因为需要首先进行初始化。

      为什么不能共存?因为this()代表的本类的其他构造函数,也会去调用super(),出现了this()就没有必要再出现super()了,重复调用没有意义。换言之,子类中至少有一个构造函数的开头为super(),当然可以隐式存在;也就是说至少有一个构造函数的开头不是this()。

构造函数的扩展:

    1)  所有的类都有构造函数么?构造函数可以被私有化么?

      既然构造函数用于创建对象并且初始化对象,那么当一个类不需要创建对象时,就不需要定义构造函数,但是在java中,所有的类都拥有构造函数,只是有些类的构造函数对开发人员来说是隐藏不可见的,这一点与我们的预期并不相同,不过换个角度这也很好理解,因为java是面向对象的,我们创建类的目的就是为了创建对象或者创建其子类对象,所以没有构造函数的类(无法创建对象的类)并没有什么意义。

      而对于第二个问题,一个类不想要外界创建其对象时,就可以将其构造函数私有化,本类中提供返回对象的方法,并且多数情况下提供的对象是唯一的,单例设计模式就是一个很好的例子,而当我们开发中需要保证对象唯一性的时候,往往就采取这种做法。

    2)  构造代码块与构造函数有什么相似和不同?

      构造代码块用一对“{}”表示,代码块位置没有具体的要求,但必须与类的成员同等级别,在括号的区域内,可以对所有该类的对象进行初始化,也就是说该类对象创建时都会执行到该代码块,并且其优先于构造函数执行。构造函数如前面提到的是具有针对性的,而构造代码块是作用于所有本类对象的。

相关代码如下:

封装 属性私有化,提供公开的get  set方法,get方法是取属性中的值(需要返回值),set方法是往属性中存值(没有返回值)

set和get方法的使用场景,一般来说set和get方法都是对私有域变量进行操作的,所以大多数都是使用在包含特定属性的类实体中。

构造函数