【问题标题】:Can I call instance method of a parent class directly in child class in Java?我可以在Java的子类中直接调用父类的实例方法吗?
【发布时间】:2016-09-25 08:48:48
【问题描述】:

我有以下两个课程。我想知道如何在没有创建ClassAClassB 的实例的情况下在B 类中调用ClassA 的实例方法,即AMessage()

我在想我应该在 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();
        }
    }

【问题讨论】:

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

标签: java


【解决方案1】:

当一个类扩展另一个类时,它会自动继承基类的可见字段和方法。可见我的意思是可访问的成员。私有成员不被继承。在http://www.tutorialspoint.com/java/java_inheritance.htm中了解更多关于继承的信息

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

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

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

【讨论】:

  • @VishvambruthJT 很高兴是我的。干杯
【解决方案2】:

使用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");
    }
}

【讨论】:

  • 所以当我调用 AMessage();没有任何实例,编译器默认会从父类中理解它的任何实例?
【解决方案3】:

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

你可以这样调用

new ClassB().AMessage();

它也可以工作

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多