3

java新手,还在为新关键字和继承而苦苦挣扎:

public class A1 {
    void a_method (){
        System.out.println("Inside A1 method");
    }
}

public class A2 extends A1{
    void a_method(){
        System.out.println("Inside A2 method");
    }
}

public class TestA1A2 {

    public static void main(String[] args) {

        A1 a1 = new A1();
        A1 a2 = new A2();  //not sure if it created object of A1 or A2
        A2 a3 = new A2();

        a1.a_method();
        a2.a_method();
        a3.a_method();

    }
}

我正在努力理解 new 关键字,如果在上面的代码中:

A1 a2 = new A2();  //not sure if it created object of A1 or A2

a2 是 A1 还是 A2 的对象?从输出中我可以看到它调用了 A2 的方法,但我真的没有得到新的关键字。而且A2扩展了A1,是否可以调用A1的方法??

4

8 回答 8

6
A1 a2 = new A2(); 

此代码创建了一个 A2 对象,但您只能使用 a2 访问 A1 类的方法。如果在 A2 中重写了某个方法,则这是被调用的 A2 的方法。

于 2013-05-19T14:06:53.163 回答
2

您创建了一个新的 A2() 对象,因为您说的是“新 A2()”。由于 A2 也是 A1,因此您可以像 A1 一样引用它:

A1 a1 = new A2();
A2 a2 = new A2();

在上面的例子中,在a1中,你可以在a1上调用A1的所有方法。对于 a2,你可以调用 a1 AND a2 的所有方法,因为你继承了 A1 的方法。

于 2013-05-19T14:05:44.560 回答
2

这称为多态性。由于A2extends A1,您可以声明A1as A2,这将使您可以访问内部的所有非覆盖方法和内部A1的所有覆盖A1方法(顺便说一句,在覆盖时使用注释A2是一个好习惯)。@Override

在这种情况下,因为在您这样做时会A2覆盖,所以您将访问.a_method()a2.a_method()A2'sa_method()

javadoc的解释:

多态性的字典定义是指生物学中的一个原理,其中一个有机体或物种可以有许多不同的形式或阶段。这个原则也可以应用于面向对象的编程和像 Java 语言这样的语言。一个类的子类可以定义它们自己独特的行为,并且共享一些与父类相同的功能。

于 2013-05-19T14:08:29.643 回答
2

A1 a2 = 新 A2(); 这将创建一个 A2 类型的对象。

这里发生的事情是..

您正在创建 A2 类型的对象并分配给 A1 类型的引用。当您执行 new A2() 时,它将调用构造函数A2()(这是默认构造函数)并创建 A2 类型的 Object。

public class A2 extends A1{
     public A2(){
       super();
     }

    void a_method(){
        System.out.println("Inside A2 method");
    }
}
于 2013-05-19T14:14:14.877 回答
2

由于A2extends A1A2 一个A1。它是一种特殊类型A1. 它是一切A1,但可能有一些独特之处A2。一个类比是猫如何成为哺乳动物。在 Java 语言中,Cat将扩展Mammal.

A1 a2 = new A2();

此行创建了一个实例,A2因为new A2()。然而,这里的棘手之处在于,在未来,它将被视为一个A1因为A1 a2 =. 让我从线路中删除一点噪音:

A1 xx = new A2();

这完全一样,但生成的对象称为xx. 因此,我们正在创建A2该类的一个实例,我们将其命名为xx,并且接下来,我们将把它当作一个A1.

于 2013-05-19T14:15:04.090 回答
1

当您从 Java 中的类继承时,继承的类被称为超类。把它想象成更一般的类。继承的类更专业。

A1 a2 = new A2();

在这种情况下,a2(类型 A1)是通用类,通过执行操作,您可以使其成为 A2 中定义的更专业的类型

于 2013-05-19T14:10:35.347 回答
1

A1 是 A2 的父类,

A1 a2 = new A2();

创建其父类为 A1 的 A2 实例。但是因为 A2 继承自 A1,所以 a2 也是 A1。

于 2013-05-19T14:07:33.037 回答
0

A2对象也是(扩展的)A1对象。所以你可以使用它 asA2 as A1

于 2013-05-19T14:06:19.963 回答