本帖最后由 yqw_gz_java 于 2018-1-14 11:48 编辑
java 中构造方法是创建对象是由虚拟机调用 ,初始化对象用的。在编写java程序的时候我们没有写任何的构造方法的情况下编译器会给我们生成一个默认的无参的构造方法,
如果有提供带参数的构造方法,且没有提供无参数的构造方法。那么这个类就没有无参构造方法。这个时候如果有个类继承自此类就必须得提供带参数的构造方法。
[AppleScript] 纯文本查看 复制代码 package com.qw.constructor;
/**
* 有带参数的构造方法没无参构造方法
* @author 40248
*
*/
public class A {
private String name;
public A(String name) {
this.name=name;
}
}
package com.qw.constructor;
public class B extends A{
}
这样写B类会报错,要求你提供一个带参数的构造方法。
[AppleScript] 纯文本查看 复制代码 package com.qw.constructor;
public class B extends A{
public B(String name) {
super(name);
}
}
除了B 类提带参数的构造方法,还可以A提供无参的构造方法。其实就是,让B类有方法初始化A.
[AppleScript] 纯文本查看 复制代码 package com.qw.constructor;
/**
* 有带参数的构造方法没无参构造方法
* @author 40248
*
*/
public class A {
private String name;
public A(String name) {
this.name=name;
}
public A() {
super();
// TODO Auto-generated constructor stub
}
}
构造方法,构造代码块,静态代码块的调用顺序。
静态代码块--》构造代码块--》构造方法。
有继承关系时
父类的静态代码块——》子类的静态代码块--》父类的构造代码块——》父类的构造方法--》子类的构造代码块--》子类的构造方法。
[AppleScript] 纯文本查看 复制代码 package com.qw.constructortest;
public class A {
static {
System.out.println("A的静态代码块");
}
{
System.out.println("A的构造 代码块");
}
public A() {
System.out.println("A的构造方法");
}
}
package com.qw.constructortest;
public class B extends A {
static {
System.out.println("B的静态代码块");
}
{
System.out.println("B的构造代码块");
}
public B() {
System.out.println("B的构造方法");
}
}
package com.qw.constructortest;
public class Test {
public static void main(String[] args) {
B b = new B();
}
}
输出顺序如下
A的静态代码块
B的静态代码块
A的构造 代码块
A的构造方法
B的构造代码块
B的构造方法
|