java构造方法的相关内容
2007-12-11 20:00
627 查看
一 java 类当中都有构造方法,如果你没有指定构造方法,则系统会调用缺省的构造方法。
二 构造方法的作用:检查对象是否被正确的构造。
三 在继承关系中,构造函数的相关内容
基类的构造器总是在导出类的构造过程中被调用,而且按照继承层次逐渐向上链接,以使每个基类的构造器都能得到调用。这样做是很有意义的,因为构造器的一个任务就是,检查对象是否被正确的构造。导出类只能访问它自己的成员,不能访问基类中的成员(基类成员通常是private类型的)。只有基类的构造器才具有恰当的只是和权限来对自己的元素进行初始化。因此必须所有的构造函数都得到调用,否则不能构建完整的对象。
这正是编译器为什么要强制每个导出类都必须调用构造器的原因。在导出类的构造器主体中,如果没有明确指定调用某个类构造器,它就会默默的调用缺省构造器。不过不存在缺省构造器,编译器就会报错。
以上我们可以看一个例子:
class base
...{
private int i;
public base(int i)
...{
this.i = i;
System.out.println("In base : " + i);
}
}
public class test extends base
...{
private int j;
public static void main(String args[])
...{
test t = new test();
}
}
该程序编译情况:
D:/temp>javac test.java
test.java:11: 找不到符号
符号: 构造函数 base()
位置: 类 base
public class test extends base
^
1 错误
我们可以推理程序的构造过程,当主方法执行时,test t = new test(), 应该调用 test类的构造函数,而test类继承于base类,所以应该调用base类的缺省构造方法。我们可以看到base类缺省构造方法被重载了,所以test类调用不到base类的缺省构造方法。
修改如下:
class base
...{
private int i;
private base()
...{
System.out.println("In private base");
}
public base(int i)
...{
this.i = i;
System.out.println("In base : " + i);
}
}
public class test extends base
...{
private int j;
public static void main(String args[])
...{
test t = new test();
}
};
修改的程序当中,我们增加了缺省的构造方法,但是我们把它的访问权限设置为private ,那么它的继承类在构造过程当中,调用不到它,所以编译错误。
编译情况如下 :
D:/temp>javac test.java
test.java:16: 找不到符号
符号: 构造函数 base()
位置: 类 base
public class test extends base
^
1 错误
四 我们可以总结一下构造器的调用顺序:
1,调用基类构造器,这个步骤会不断的反复递归下去。
2 ,按声明顺序调用成员的初始化方法。
3 调用导出类的构造器主体。
二 构造方法的作用:检查对象是否被正确的构造。
三 在继承关系中,构造函数的相关内容
基类的构造器总是在导出类的构造过程中被调用,而且按照继承层次逐渐向上链接,以使每个基类的构造器都能得到调用。这样做是很有意义的,因为构造器的一个任务就是,检查对象是否被正确的构造。导出类只能访问它自己的成员,不能访问基类中的成员(基类成员通常是private类型的)。只有基类的构造器才具有恰当的只是和权限来对自己的元素进行初始化。因此必须所有的构造函数都得到调用,否则不能构建完整的对象。
这正是编译器为什么要强制每个导出类都必须调用构造器的原因。在导出类的构造器主体中,如果没有明确指定调用某个类构造器,它就会默默的调用缺省构造器。不过不存在缺省构造器,编译器就会报错。
以上我们可以看一个例子:
class base
...{
private int i;
public base(int i)
...{
this.i = i;
System.out.println("In base : " + i);
}
}
public class test extends base
...{
private int j;
public static void main(String args[])
...{
test t = new test();
}
}
该程序编译情况:
D:/temp>javac test.java
test.java:11: 找不到符号
符号: 构造函数 base()
位置: 类 base
public class test extends base
^
1 错误
我们可以推理程序的构造过程,当主方法执行时,test t = new test(), 应该调用 test类的构造函数,而test类继承于base类,所以应该调用base类的缺省构造方法。我们可以看到base类缺省构造方法被重载了,所以test类调用不到base类的缺省构造方法。
修改如下:
class base
...{
private int i;
private base()
...{
System.out.println("In private base");
}
public base(int i)
...{
this.i = i;
System.out.println("In base : " + i);
}
}
public class test extends base
...{
private int j;
public static void main(String args[])
...{
test t = new test();
}
};
修改的程序当中,我们增加了缺省的构造方法,但是我们把它的访问权限设置为private ,那么它的继承类在构造过程当中,调用不到它,所以编译错误。
编译情况如下 :
D:/temp>javac test.java
test.java:16: 找不到符号
符号: 构造函数 base()
位置: 类 base
public class test extends base
^
1 错误
四 我们可以总结一下构造器的调用顺序:
1,调用基类构造器,这个步骤会不断的反复递归下去。
2 ,按声明顺序调用成员的初始化方法。
3 调用导出类的构造器主体。
相关文章推荐
- Android JNI开发高级篇有关Android JNI开发中比较强大和有用的功能就是从JNI层创建、构造Java的类或执行Java层的方法获取属性等操作。 一、类的相关操作 1. jclass FindClass(JNIEnv *env, const char *name);
- Java—面向对象—构造方法及相关思维导图
- C++和JAVA中一些区别,包括指向子类的引用会调用谁的方法,子类构造函数自动调用父类构造函数时,父构造会调用的谁方法
- java文件操作相关方法
- Java构造和解析Json数据的两种方法详解一
- Java复习——属性的封装与构造方法
- Java中的构造方法总结
- Java_构造方法
- JAVA中 子类与父类构造方法的关系 个人理解
- Java构造方法
- Java读取TXT文件内容的方法
- Java子类继承父类,构造方法的执行顺序问题
- java构造方法
- Java静态语句块、语句块、构造方法执行顺序
- java中类的静态代码块、构造代码块、构造方法、静态成员的初始化顺序详解
- java的构造方法
- 韩顺平 java 第五讲第六讲第七讲 类与对象 成员方法 构造方法
- Java 方法、构造方法、finalize() 方法
- Java中的构造方法总结
- 深度理解JAVA本身的构造器及子父类构造方法的初始化顺序