在课堂上的对象变异中的差异

时间:2015-06-21 09:39:09

标签: java

在下面的代码中obj1&的区别是什么? obj2? 我的问题是语法 -

Classname1 objectname = new Classname2();

可能是Classname1 = Classname2

Classname1的重要性。

// Superclass
class Base {
    public static void display() {
        System.out.println("Static or class method from Base");
    }

}

// Subclass
class Derived extends Base {


       public void print() {
         System.out.println("Non-static or Instance method from Derived");
   }
}


public class Test {
    public static void main(String args[ ])  {
       Base obj1 = new Derived();
       Derived obj2 = new Derived();
    }
}

3 个答案:

答案 0 :(得分:1)

在第

Classname1 objectname = new Classname2();

Classname1是变量objectname的类型; Classname2是我们分配给该变量的对象的类型。从该行我们可以推断Classname1Classname2实现的接口(如HashMap实现Map),或者Classname2是子类(直接)或{间接)Classname1HashMap延伸AbstractMap

在评论中你说:

  

obj1和amp;之间的区别是什么?我的代码中的obj2是否有?

我假设您正在谈论此代码:

Base obj1 = new Derived();
Derived obj2 = new Derived();

分配给这些变量的对象没有区别,但变量的类型存在差异,因此您对该对象的引用类型:obj1指向的对象具有print方法,但您无法通过obj1访问它,因为引用的类型是您的有Base,而不是DerivedBase没有print。相反,您可以通过print访问obj2,因为参考的类型为Derived

答案 1 :(得分:1)

你想知道这些方面的区别:

Base obj1 = new Derived();
Derived obj2 = new Derived();

在这两种情况下,构造的对象都是类Derived,但引用是不同的。您可以使用Base类型的引用,因为Derived也是Base(假设Derived扩展Base)因此可以使用。但是我们应该选择哪一个?前一个因为它做出了稳健的设计。

考虑Java中的集合框架,它具有List接口和两个实现:ArrayListLinkedList。我们可以编写程序,专门使用LinkedListArrayList。但是我们的代码依赖于那些特定的实现。所以我们应该编写我们的程序来依赖超类型List,而不是我们的程序可以用于任何List实现。

简而言之,这是OOP设计的一条规则:Program to an interface

答案 2 :(得分:0)

以下两行之间的差异 -

Base obj1 = new Derived();
Derived obj2 = new Derived();

那是 -

  1. 对于第1行 - 您正在创建一个类型为Derived的对象并将其存储在Base类型变量中,这是合法的,因为Derived类是一个子类Base的类,但是当你使用obj1时,你不能调用Derived类中定义的函数,例如 -

    obj1.print()

  2. 这会抛出错误,因为对象obj1的类型是Base(类),并且没有打印功能。为了能够为print调用obj1函数,您需要将obj1转换为Derived类并调用该函数,例如 -

    ((Derived)obj1).print()
    

    在这种情况下,您将obj1转换为Derived类型,因此编译器现在知道obj1可以调用print()函数。

    1. 在第2行中,您将直接创建Derived类型的对象并将其存储在Derived类型变量中。
    2. 这只是它们如何不同的一个例子,也可以有其他例子。