构造方法
1.java继承中对构造方法是不继承的,只是调用(隐式或显式)
2.构造方法作用:(1).构造出来一个类的实例 (2).对构造出来一个类的实例(对象)初始化。
3.构造方法的名字必须与定义他的类名完全相同,没有返回类型,甚至连void也没有。
4.主要完成对象的初始化工作,构造方法的调用是在创建一个对象时使用new操作进行的。
5.类中必定有构造方法,若不写,系统自动添加无参构造方法。!!!接口不允许被实例化,所以接口中没有构造方法。!!!
6.构造方法不能被static、final、synchronized、abstract和native修饰。
7.构造方法在初始化对象时自动执行,一般不能显式地直接调用.当同一个类存在多个构造方法时,java编译系统会自动按照初始化时最后面括号的参数个数以及参数类型来自动一一对应。
完成构造函数的调用。
8.构造方法分为两种:无参构造方法,有参构造方法
构造方法可以被重载。
没有参数的构造方法称为默认构造方法,与一般的方法一样,构造方法可以进行任何活动,但是经常将他设计为进行各种初始化活动,比如初始化对象的属性。
9.构造代码块:
(1)作用:给对象进行初始化,对象一建立就执行,而且优先于构造函数执行
(2)构造代码块和构造函数的区别:
构造代码块是给所有不同对象的共性进行统一初始化,构造函数是给对应的对象进行初始化
10.在Java中,当创建一个子类对象时,是不会先创建父类对象的。但是创建子类对象时,会去先调用父类的构造函数。
子类调用父类的构造器,不代表父类对象就要创建.
子类创建对象,是真的有一个对象的实体在内存中,父类对象的实体是不会被在内存new出来的.
父类构造函数执行,只是执行了构造函数而已。要弄清楚,执行构造函数和new对象是两码事
11.一般情况下,我们自定义的类都要手动给出无参构造方法。
看下面程序
public class Constructor {
public static void main(String[] args) {
Son s = new Son(11);
}
}
class Father {
public Father() {
System.out.println(100);
}
public Father(int a) {
System.out.println(a);
}
}
class Son extends Father {
public Son() {
}
public Son(int c) {
System.out.println(200);
}
}
结果是
100
200
分析:
当执行Son s = new Son(11);这句话时,先调用子类的构造方法:
public Son(int c) {
System.out.println(200);
}
在输出语句System.out.println(200);之前会调用父类的无参构造方法:
public Son(int c) {
super();//这一句你不写时,在构造方法中系统会帮你默认加上
System.out.println(200);
}
所以这里的结果就为100;200
结论:在创建子类的对象时,Java虚拟机首先执行父类的构造方法,然后再执行子类的构造方法。
在多级继承的情况下,将从继承树的最上层的父类开始,依次执行各个类的构造方法
,这可以保证子类对象从所有直接或间接父类中继承的实例变量都被正确地初始化。
将上面程序修改一下
public class Constructor {
public static void main(String[] args) {
Son s = new Son(11);
}
}
class Father {
public Father() {
System.out.println(100);
}
public Father(int a) {
System.out.println(a);
}
}
class Son extends Father {
public Son() {
}
public Son(int c) {
super(c);
System.out.println(200);
}
}
结果是
11
200
分析
这里子类的构造函数不再是之前那样,而是:
public Son(int c) {
super(c);//首先记住super必须第一行;这里显式调用了父类的有参构造函数之后,系统就不再调用无参的父类构造函数了;
System.out.println(200);
}
所以结果就为:11;200
结论:
1.如果不显式调用父类有参构造函数,系统会默认调用父类无参构造函数super();
2.如果显式调用了父类的有参构造函数,系统将不会默认调用无参的父类构造函数;
3.在一个类中如果你不写构造函数,是有一个默认的构造函数的。 如果你写了一个有参的构造函数,那么系统将不提供这个无参数的构造函数,此时我们建议自己手动添加这个无参数的构造函数。 因为在有些方法调用的过程中,会调用这个无参数的构造函数,这样就会出现错误! 为了避免这种错误的发生,我们手动添加这个无参数的构造函数
关于this调用本类构造函数的用法
class Extends {
public static void main(String[] args) {
Son s1 = new Son();
System.out.println(s1.getName() + "..." + s1.getAge());
System.out.println("--------------------");
Son s2 = new Son("张三",23);
System.out.println(s2.getName() + "..." + s2.getAge());
}
}
/*
* A:案例演示
* 父类没有无参构造方法,子类怎么办?
* super解决
* this解决
* B:注意事项
* super(…)或者this(….)必须出现在构造方法的第一条语句上
*/
class Father {
private String name; //姓名
private int age; //年龄
/*public Father() { //空参构造
System.out.println("Father 空参构造");
}*/
public Father(String name,int age) { //有参构造
this.name = name;
this.age = age;
System.out.println("Father 有参构造");
}
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;
}
}
class Son extends Father {
public Son() { //空参构造
this("王五",25); //本类中的构造方法
//super("李四",24); //调用父类中的构造方法
System.out.println("Son 空参构造");
}
public Son(String name,int age) { //有参构造
super(name,age);
System.out.println("Son 有参构造");
}
}
在上述代码中:
public Son() {
this("王五",25);
System.out.println("Son 空参构造");
}
这行代码中的this是在调用本类的有参构造方法
public Son(String name,int age) {
super(name,age);
System.out.println("Son 有参构造");
}
然后本类的有参构造方法中的第一行,会调用父类的有参构造方法完成父类参数的初始化
super和this的区别
this和super的区别和应用
A:this和super都代表什么
* this:代表当前对象的引用,谁来调用我,我就代表谁
* super:代表当前对象父类的引用
B:this和super的使用区别
a:调用成员变量
* this.成员变量 调用本类的成员变量,也可以调用父类的成员变量(如果本类没有该成员变量的条件下,其实这种调用就是继承下来了)
* super.成员变量 调用父类的成员变量
b:调用构造方法
* this(...) 调用本类的构造方法
* super(...) 调用父类的构造方法super(name,age),把name和age传给父类构造方法
c:调用成员方法
* this.成员方法 调用本类的成员方法,也可以调用父类的方法 this.getName
* super.成员方法 调用父类的成员方法 super.getName