2016-09-25 37 views
1

我有以下两个类。我想知道如何在B类中调用ClassAAMessage()的实例方法,而不是创建了ClassAClassB的实例?我可以直接在Java的子类中调用父类的实例方法吗?

我想我应该如下调用ClassAAMessage()实例方法在B类:

new ClassA().AMessage(); //no compile error 

new ClassB().Amessage(); //no compile error 

父类(ClassA.java)

public class ClassA { 
    public void AMessage(){ 
     System.out.println("A Message"); 
    } 
} 

子类(ClassB的.java)

public class ClassB extends ClassA{ 

     public void BMessage(){ 
      AMessage(); //no compile error 
     } 
     public static void main(String[] args){ 
      new ClassB().BMessage(); 
     } 
    } 
+1

你显然不能在不创建实例的情况下调用一个实例方法,如果这是你想要的,因为它不是非常清楚你的问题。您发布的代码创建实例并调用其方法。这是什么,你需要做的,这个代码不? –

回答

0

当一个类扩展另一个类时,它会自动继承基类的可见字段和方法。通过可见我指的是可访问的成员私人成员不会被遗传。了解更多关于继承的http://www.tutorialspoint.com/java/java_inheritance.htm

所以,如果你有有方法AMessage像这样一类ClassA的:

public class ClassA{ 
     public void AMessage(){ 
      System.out.println("A message"); 
     } 
    } 

和ClassB延伸ClassA的是这样的:

public class ClassB extends ClassA{ 

     public void BMessage(){ 
      AMessage(); 
     } 
     public static void main(String[] args){ 
      new ClassB().BMessage(); 
     } 
    } 

ClassB的自动继承成员的ClassA,即它们的行为就好像它们是ClassB本身的成员一样。这就是为什么我们可以在没有任何实例的情况下调用ClassB中ClassA的实例方法,因为它们也属于ClassB。除了实例方法外,你也可以调用类似的静态方法。 (当然你可以静态方法里面没有呼叫实例的方法。)

作为一个额外的答案,我想表明,(虽然它是不相关的问题,但它是一个很好的做法),你应该而不是命名以大写字母开头的类(实例或静态)的任何方法。它不会产生任何编译器错误,如果你仍然这样命名,但它会影响可读性。我写过这样的名字只是为了与你的问题有关。

+0

感谢Dhruv的信息性解释。 –

+0

@VishvambruthJT的荣幸是我的。干杯 –

0

使用super关键字来调用基类方法。检查此以供参考 - http://docs.oracle.com/javase/tutorial/java/IandI/super.html

public class ChildClass extends BaseClass{ 

     public static void main(String[] args){ 
      ChildClass obj = new ChildClass(); 
      obj.Message(); 
     } 

     public void Message(){ 
      super.Message(); 
     } 
} 

class BaseClass { 
    public void Message(){ 
     System.out.println("Base Class called"); 
    } 
} 

或者你也可以像这样做,以及 -

public class ChildClass extends BaseClass{ 

     public static void main(String[] args){ 
      new ChildClass().Message(); 
     } 
} 

class BaseClass { 
    public void Message(){ 
     System.out.println("Base Class called"); 
    } 
} 
+0

所以在我的子类中,当我调用AMessage();函数直接与编译器将默认从其父类了解的任何实例? –

+0

我已经更新了我的答案,希望它有帮助。 –

0

是的,你可以从子类提供对象的父调用父类的方法是直接实例方法上课方法应公开

你可以这样叫:

new ClassB().AMessage(); 

它也将工作

相关问题