可能重复:
当访问“超级”关键字的使用非覆盖超类方法
我是新来的Java和已经读了很多关于它最近获得关于语言更多的知识和经验。 我有一个关于继承的方法和扩展类的问题时,编译器插入自动代码。
我一直在读,如果我创造A级的一些方法,包括让说,一个名为方法checkDuePeriod()
然后创建延伸的A类和方法B类。
如果我再调用方法checkDuePeriod()
B类内不使用super.checkDuePeriod()
语法,在编译期间将编译器包括super.
前checkDuePeriod()
或将编译器包括事实super()
编译的类时自动构造意味着super.
方法调用的类A是B类电话?
我有点糊涂了这一点。 提前致谢。
超类的实现的常规方法是不会自动在子类调用,但超类的构造函数的形式必须在子类的构造函数被调用。
在某些情况下,调用super()
是隐含的,例如当超类有一个默认的(无参数)构造函数。 然而,如果在超类中不存在默认的构造函数,子类的构造函数必须直接或间接调用父类的构造函数。
默认构造方法例如:
public class A {
public A() {
// default constructor for A
}
}
public class B extends A {
public B() {
super(); // this call is unnecessary; the compiler will add it implicitly
}
}
超类没有默认的构造函数:
public class A {
public A(int i) {
// only constructor present has a single int parameter
}
}
public class B extends A {
public B() {
// will not compile without direct call to super(int)!
super(100);
}
}
如果调用checkDuePeriod()
B中没有super.
,意味着你要调用属于这种情况(所代表的方法this
B.所以B内部),它相当于说this.checkDuePeriod()
所以它只是没有让编译器添加有意义super.
在前面。
super.
是的东西,你必须明确地添加到告诉你要拨打的A的版本的方法的编译器(它是特别需要的情况下,B已覆盖由一种方法提供的实现)。
超()作为一个默认构造函数(构造函数没有参数)的调用可以直接或非直接的,但它是garants扩展的类的字段正确初始化 。
例如:
public class A {
StringBuilder sb;
public A() {
sb = new StringBuilder();
}
}
public class B extends A {
public B() {
//the default constructor is called automatically
}
public void someMethod(){
//sb was not initialized in B class,
//but we can use it, because java garants that it was initialized
//and has non null value
sb.toString();
}
}
但是,在方法的情况下:
方法来实现一些逻辑。 如果我们需要重写,我们使用超类的逻辑
public class B extends A {
public B() {
}
public boolean checkDuePeriod(){
//new check goes here
}
}
而如果我们只是执行一些额外的检查,利用超的checkDuePeriod()的返回值,我们应该做这样的事
public class B extends A {
public B() {
}
public boolean checkDuePeriod(){
if(super.checkDuePeriod()){
//extra check goes here
}else{
//do something else if need
}
return checkResult;
}
}
首先关于Constructors
:
-当曾经的object
是创建一个类,它的constructor
初始化和当时立即 constructor
了S的uper-class
被称为直到Object
类,
-在这个过程中的所有实例变量的声明和初始化。
-考虑这种情况。
狗是一个sub-class
犬的犬和是一个sub-class
动物
现在,当狗对象初始化之前,对象实际上形式,犬类对象必须是形式,而犬对象之前,可以形成动物类对象将要形成,而在此之前Object类的对象必须是形式,
所以对象的形成的序列是:
Object ---> Animal ---> Canine ---> Dog
因此, Constructor of the Super-Class is Called before the Sub-Class
。
现在用Method
:
The most specific version of the method that class is called.
例如:
public class A{
public void go(){
}
}
class B extends A{
public static void main(String[] args){
new B().go(); // As B has not overridden the go() method of its super class,
// so the super-class implementation of the go() will be working here
}
}