2014-02-13 123 views
0

这两个调用有什么区别?这应该如何正确完成?构造函数中的可重写方法调用 - 调用方法的正确方法是什么?

//package test; 

public class SomeClass { 

    public SomeClass() { 

     doSomething();//Warning - Overridable method call in constructor 
     SomeClass.this.doSomething();//Seems OK 
    } 

    public void doSomething() { 
     //... 
    } 
} 

我想使用doSomething()只是为了方便在同一班。我无意在以后重写它。一个想法是宣布它final。但仍然不清楚在这种情况下是否可以安全使用SomeClass.this.doSomething();

+1

编译器警告通知有点说明会发生什么。如果一个子类覆盖了'doSomething'方法,它可以改变创建类实例时的行为,这可能是危险的或者不是,这取决于你的设计。请注意,这是一个警告,而不是编译器异常。 –

+0

你想让这个方法被覆盖吗?如果是,不,或依赖于谁?然后为您的doSomething()方法使用public,private或protected/package作用域 –

+1

关于“如何正确完成”:如果可能,您可以尝试避免这样的事情。要么不要调用该方法,要么将其声明为“final”。这并不总是可能,但你至少应该考虑它。 – Marco13

回答

2

编译器警告通知有些说明会发生什么。如果一个子类重写doSomething方法,它可以改变创建类实例时的行为,这可能是危险的或不是,这取决于你的设计。请注意,这是一个警告,而不是编译器异常。

为了证明这一点,只是扩展你的代码进行测试:

class SomeClass { 

    public SomeClass() { 

     doSomething();//Warning - Overridable method call in constructor 
     SomeClass.this.doSomething();//Seems OK, but is not 
    } 

    public void doSomething() { 
     System.out.println("parent"); 
    } 
} 

public class SomeOtherClass extends SomeClass { 
    @Override 
    public void doSomething() { 
     System.out.println("child"); 
    } 

    public static void main(String[] args) { 
     SomeClass a = new SomeClass(); 
     SomeOtherClass b = new SomeOtherClass(); 
    } 
} 

打印:

parent 
parent 
child 
child 

如果你只是想,没有其他类可以覆盖doSomething方法,其标记为final

class SomeClass { 

    public SomeClass() { 

     doSomething();//Warning - Overridable method call in constructor 
     SomeClass.this.doSomething();//Seems OK 
    } 

    public final void doSomething() { 
     System.out.println("parent"); 
    } 
} 

然后,如果任何子类试图覆盖它,c ompiler会抛出一个错误:

public class SomeOtherClass extends SomeClass { 
    @Override 
    public void doSomething() { //compiler error 
     System.out.println("child"); 
    } 
    //... 
} 
+0

非常好的例子,谢谢:)我现在明白了。另外 - 'SomeClass.this.doSomething();' - 我认为在这种情况下是可以的 - 我认为如果它稍后会被覆盖并没有什么区别 - 该方法将被按原样从SomeClass中调用。我对吗? –

+0

@ErnestasGruodis否,因为您调用'this',它将调用当前对象实例并执行属于当前对象类型的方法。否则,可能会打印*父亲父母孩子父母*。 –

+0

是的,你是对的.. :)愚蠢的我可以说什么:)它是如此简单..现在的问题是100%的回答。确实感谢您的帮助。 –

相关问题