java中的继承-我无法理解的东西

java中的继承-我无法理解的东西,java,Java,关于Java中的继承,我有一个无法理解的问题: 我有两门课: public class C { public void foo(D d) { System.out.println("cd"); } } public class D extends C { public void foo(C c) { System.out.println("dc"); } public void foo(D d

关于Java中的继承,我有一个无法理解的问题:

我有两门课:

public class C
{
    public void foo(D d)
    {
         System.out.println("cd");  
    }
}

public class D extends C
{
    public void foo(C c)
    {
         System.out.println("dc");  
    }

    public void foo(D d)
    {
         System.out.println("dd");  
    }
}
主要内容:

public static void main(String[] args)
{
    C cd = new D();
    D dd = (D)cd;   
}

cd
dd
的类型是什么?为什么?

这里涉及两种不同的类型:

  • 变量的类型
  • 变量引用的对象的类型
  • 变量的类型与当前引用的对象的类型无关,反之亦然,对象的类型不取决于访问它的变量的类型。因此,当您将对象指定给另一个不同类型的变量时,其类型不会受到影响

    所以

    • 变量
      cd
      的类型是
      C
    • 它引用的对象的类型是
      D

      • 所以我们可以这样介绍继承的概念

        从前一个类中确定并拖动其“”的特性和质量,并为我们自己创建一个类似前一个类的新类,具有前一个类的特性和质量。然后,前一个类将是超级类,新类将是子类

        孩子们有他们父母的特点和品质

        import javax.swing.*;
        class Form extends JFrame{
        
        }
        class Demo{
                public static void main(String[] args){
                    Form f1=new Form();
                    f1.setSize(300,300);
                    f1.setTitle("Form");
                    f1.setDefaultCloseOperation(Form.EXIT_ON_CLOSE);
                    f1.setVisible(true);
                }
        }
        

        我将从以下几点开始回答:

      • 类D扩展了类C,因此类D是类C的子类
      • 左侧变量称为参考变量,右侧带有新运算符的赋值称为对象
      • 第一行显示D(子类)对象被分配给父类的引用变量表示cd是父类类型的引用变量,它保存子类的对象。表示在运行时,编译器将检查子类是否为父类类型,如果是,则将强制转换它并显示子方法输出
      • 每当在cd上调用foo方法时,它都会调用子类中存在的foo方法
      • 第二行显示D(子类)引用变量dd保存D(子类)的对象
      • 这意味着。cd是类C(父)的引用,现在隐式转换为类D(子)。
        子类引用变量(dd)再次存储子类(D)的对象。

        为什么cd是C?新的D()是什么意思?
        newd()
        表示您创建了一个
        D
        类型的对象。
        cd
        变量的类型是
        C
        ,因为您已将
        cd
        变量的类型声明为
        C
        。我看不出这是如何回答这个问题的。此外,有些句子非常令人困惑。宾语始终是
        D
        。强制转换只会将视图缩小为对象,但不会更改对象本身。因此,您可以将视图缩小为
        动物
        。它仍然是一只
        ,但您希望编译器忘记这一点,并像对待动物一样处理它。这使得可以将
        添加到
        列表
        中,当您稍后获得该列表中的项目时,它们仍然是
        ,但您只知道它们是
        动物
        。使用铸造,您可以尝试再次提升视图。但是,在您尝试将
        投射到
        之前,您应该检查
        instanceof