【问题标题】:Java- In inheritance, method can be invoked without creating a classJava-在继承中,可以在不创建类的情况下调用方法
【发布时间】:2017-02-25 18:36:41
【问题描述】:

我有父类和子类,其中父类有一个方法-getData。无论是否创建对象,我都可以直接从子类调用此方法。 我想知道该方法如何在不创建对象的情况下在子类中可用。 (它也不是静态方法) 我的理解是我们必须创建一个对象来访问这些方法。谁能解释一下为什么?

 public class testbase {

    public void getData(String Data) throws IOException{
        Properties prop1;

        prop1= new Properties();
        FileInputStream f= new FileInputStream("C:\\file.properties");
        prop1.load(f);


        String data= prop1.getProperty(Data);
        System.out.println(data);
    }

}


class testproperties_file extends testbase {

    @Test
    public void test_class() throws IOException{
        getData("name");

    }
}

【问题讨论】:

  • 什么意思“不创建对象”?你创建了一个testproperties_file 的实例,不是吗?
  • 子实例父实例。这就是继承的全部意义。如果动物会跑,那我可以让狗跑,因为狗是动物。
  • 当执行在子类中时,调用在this。它指的是当前对象。而当你调用test_class方法时,会在testproperties_file的对象上调用。

标签: java inheritance


【解决方案1】:

我想知道该方法如何在子类中可用 无需创建对象。

class testproperties_file extends testbase {
    @Test
    public void test_class() throws IOException{
       getData("name");

    }
}

这里test_class()是一个实例方法。这意味着在此方法中调用的所有代码都可能调用可用于当前类实例的方法(此处为testproperties_file)。所以,当这个方法执行时,你已经在一个对象中了。

testproperties_file 的实例继承自 testbase 类。
这意味着testbase 的所有公共和受保护的实例方法都可以在这里调用。 testbase 的公共getData() 实例方法是如此可调用的。


作为旁注,您应该使用大写和驼峰式命名您的类。 TestBaseTestPropertiesFile 更好,因为它们遵循 java 编码约定。

【讨论】:

    【解决方案2】:

    根据

    https://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html

    子类从其超类继承所有成员(字段、方法和嵌套类)。构造函数不是成员,所以子类不能继承,但是子类可以调用超类的构造函数。

    我建议你阅读更多关于inheritance

    子子类继承其父类的所有成员方法。

    如果执行控制到达任何非静态方法,则意味着创建了一个对象,并在其上调用该方法。 this 是对调用任何方法的当前执行对象的隐式引用。由于派生类的对象具有超类的行为,因此根据实际派生类的定义添加更多行为,并且如果任何行为被覆盖,则从超类派生的行为将被修改。

    【讨论】:

      猜你喜欢
      • 2014-08-18
      • 2021-11-18
      • 1970-01-01
      • 2014-03-10
      • 1970-01-01
      • 1970-01-01
      • 2012-08-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多