当前位置: 首页 > 面试题库 >

在java中,我们可以将超类Object传递给子类引用吗?

范云
2023-03-14
问题内容

在Java中,我们可以将超类Object传递给子类引用吗?

我知道这是一个奇怪的问题/实际上不可行,但是我想了解这个背后的逻辑为什么在Java中不允许这样做。

class Employee {
    public void met1(){
        System.out.println("met1");
    }
}


class SalesPerson extends Employee 
{
    @Override
    public void met1(){
    System.out.println("new met1");
    }


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

}

public class ReferenceTest {
    public static void main(String[] args) {

        SalesPerson sales = new Employee(); // line 1

        sales.met1();  // line 2

        sales.met2();  // line 3
    }
}

如果Java允许编译第1行会发生什么?问题将在哪里出现?

欢迎任何输入/链接。


问题答案:

如果SalesPerson sales = new Employee();允许您的语句进行编译,那么这将破坏多态性的原理,这是该语言具有的功能之一。

另外,您应该熟悉 编译时间类型运行时类型的 含义:

变量的 编译时类型 是声明为的类型,而 运行时类型 是变量指向的实际对象的类型。例如:

Employee sales = new SalesPerson();

的编译时类型salesEmployee,运行时类型为SalesPerson。编译时类型定义可以调用的方法,而运行时类型定义实际调用期间发生的事情。

让我们暂时假设此语句是有效的:

SalesPerson sales = new Employee();

就像我说的那样,编译时类型定义了可以调用的方法,因此met2()可以进行调用。同时,Employee该类没有met2(),因此实际的调用将是不可能的。



 类似资料:
  • 假设我有一个抽象类Person。有另一个类学生扩展了Person。但是学生类有一个成员变量,比如String类型的学院,它在Person类中不存在。 我们知道我们可以从超类引用子类,例如, 人p=新学生(); 对象p会有成员学院吗?

  • 问题内容: 我想要与的关键字类似的语义。 问题答案: Java令人困惑,因为一切都是通过值传递的。但是,对于引用类型的参数(即不是原始类型的参数),引用本身是通过值传递的,因此它似乎是按引用传递的(人们常常声称它是)。情况并非如此,如下所示: 将打印到控制台。如果要打印上面的代码,Goodbye可以使用如下所示的显式引用:

  • 问题内容: 我所拥有的是一组表示消息类型的Java类(接近25个)。它们都继承自我想抽象的Message类。每种消息类型都会在Message超类提供的集合中添加一些其他字段。 我正在使用RESTeasy实现一些RESTful Web服务,并希望具有以下方法: 而不是使用25种单独的persist方法,每种方法都针对特定的消息类型进行了量身定制。 目前,我已经为Message类添加了如下注释: 然后

  • 我是一个非程序员,有非常少的代码接触,但我想修改一个现有的代码库。我大大简化了下面的代码。请让我知道,如果我可以提供任何进一步的信息或如果这是没有意义的所有!Vocab很难。:) ClassD:

  • 然后我调用子类中的方法。 我希望有一个对象创建的基础上,子类已经被调用,如果这是有意义的?

  • 问题内容: 我在MVC框架的View类上有3套。我想在controll类中引用它们。有人可以告诉我这实现了吗?下面是事件控制器。EventView类由addEvent,editEvent,deleteEvent组成,如何在Controller类中为其侦听器。有人可以在Controller类的顶部演示使用示例代码吗? 第二个问题,我只能从类本身更新a ,因此 在View类中具有代码是一种不好的做法,