【问题标题】:While creating an object what does left side class indicates and right side class indicates?创建对象时,左侧类表示什么,右侧类表示什么?
【发布时间】:2013-09-12 00:28:08
【问题描述】:

我一直有这个疑问,所以终于在这里问了。举个例子吧。

class A{
void run(){
System.out.println("hi");
}
}
class B extends A{
void jump(){
}
}

public class test{
public static void main(String[] args){
A a = new A();  //statement 1

A a1= new B(); //statement 2
B b= (B) new A(); // statement 3

a.run();
b.run();

b.jump();
}};

现在我的基本疑问是statement1,2,3有什么区别?请有人解释一下。

【问题讨论】:

  • 如果你尝试编译它,你会发现与语句 3 的一个主要区别...
  • A不能转换为B?

标签: java class jsp private public


【解决方案1】:

现在我的基本疑问是语句 1、2、3 有什么区别?

A a = new A(); //statement 1

= 右边的位创建一个 A 类的对象;左边的位定义了存储它的变量,在这种情况下是A类型的变量; = 是一个任务。所以这会创建一个 A 类的对象,并将对它的引用保存在 A 类型的变量中。

A a1= new B(); //statement 2

= 右边的位创建一个 B 类的对象;左边的位定义了存储它的变量,在这种情况下是A类型的变量; = 是一个任务。所以这会创建一个B 类的对象,并将对它的引用保存在A 类型的变量中。这意味着当通过该变量访问对象时,您只能访问由A 定义的事物,即使该对象是B。例如,即使B 有一个jump 方法,你也不能这样做:

a1.jump(); // Compile-time error

B b= (B) new A(); // statement 3

将在运行时以 ClassCastException 失败,因为您试图将 A 存储在 B 类型的变量中。您不能将 A 实例分配给 B 变量。只有当变量赋值兼容时,您才能将实例分配给变量,这实际上意味着:

  1. 变量是类类型,对象是同一类型(你的说法1)
  2. 变量是类类型,对象的类型是该类型的子类(您的陈述2)
  3. 变量是接口类型,对象实现了该接口
  4. 变量是接口类型,对象实现了该接口的子接口

【讨论】:

  • 感谢您的解释,我的疑问是左侧类表示什么,右侧类表示什么?
【解决方案2】:

TJ 的回答非常好且冗长,只是为了补充您的原始问题。 '=' 的左侧是对右侧实际对象的引用。

这样想,左边是“房子”的地址,右边是实际的“房子”。

在第三个语句中,您很确定房子 'A' is a house 'B' 然后尝试对其进行转换。编译器会信任你,但运行时控制可能会失败,如果你的假设不正确(这里,它看起来像在运行时,它会抛出 ClassCastEsception)

另外,另一个区别是代码中的地址驻留在堆栈中,而右侧驻留在内存的堆区域。

【讨论】:

    【解决方案3】:

    这里有两个问题令人困惑,变量或表达式的类型,以及对象的类。

    每个对象都有一个类,该类在通过“new”或 clone() 创建时建立。该类在对象的生命周期内是固定的。

    引用变量或表达式要么为空,要么为指向某个对象的指针。引用变量的类型由类或接口的名称指示。只有当对象的类直接或间接匹配或扩展该类或实现接口时,它才能引用该对象。实际上,变量的类型保证了对象具有相应的成员。

    A a = new A();  //statement 1
    

    声明一个类型为 A 的变量“a”,这意味着它只能为 null 或指向 A 的指针,或类扩展 A 的对象。将其初始化为指向新创建的 A 类对象的指针。

    A a1= new B(); //statement 2
    

    声明一个类型为 A 的变量“a1”,这意味着它只能为 null 或指向 A 的指针,或类扩展 A 的对象。用指向新创建的 B 的指针初始化它。由于 B 扩展 A,允许将类型 B 表达式转换为类型 A。

    B b= (B) new A(); // statement 3
    

    这里的区别在于 A 不扩展 B。当且仅当它为 null 或指向 B 类对象的指针或扩展 B 的类时,才能将类型 A 的引用强制转换为类型 B。 A 类不扩展 B。编译器将接受这一点,因为强制转换声称“new A()”为空或引用 B 类对象或扩展 B 的类的对象。它将在运行时获得 ClassCastException时间,因为那个说法是错误的。

    引用变量或表达式的类型在编译时确定。在程序运行的过程中,它可能为 null 或引用几个不同类的对象,但只引用适合其声明类型的类。

    【讨论】:

      【解决方案4】:

      我认为您需要更多地了解多态性,即对象具有多种形式的能力。 看: Java polymorphism creating a subclass object using its superclass variable 要么: http://en.wikipedia.org/wiki/Polymorphism_(computer_science)

      【讨论】:

        猜你喜欢
        • 2011-12-28
        • 2020-04-27
        • 2021-01-21
        • 2015-04-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-10
        • 1970-01-01
        相关资源
        最近更新 更多