我可以直接在Java的子类中调用父类的实例方法吗?

时间:2016-09-25 08:48:48

标签: java

我有以下两个班级。我想知道如何在B类中调用ClassAAMessage()的实例方法而不创建ClassAClassB的实例?

我在想我应该在B类中调用ClassA的实例方法,即AMessage(),如下所示:

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();
        }
    }

3 个答案:

答案 0 :(得分: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");
    }
}

答案 1 :(得分:0)

是的,您可以从子类对象直接调用父类的实例方法,前提是父类方法应该是公共的

你可以这样打电话

new ClassB().AMessage();

它也会起作用

答案 2 :(得分:0)

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

中的继承

因此,如果你有一个类ClassA,它有一个像这样的方法AMess:

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。除了实例方法之外,您还可以调用类似的静态方法。 (但是当然你可以在静态方法中调用实例方法。)

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