在下面的代码中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();
}
}
答案 0 :(得分:1)
在第
行Classname1 objectname = new Classname2();
Classname1
是变量objectname
的类型; Classname2
是我们分配给该变量的对象的类型。从该行我们可以推断Classname1
是Classname2
实现的接口(如HashMap
实现Map
),或者Classname2
是子类(直接)或{间接)Classname1
,HashMap
延伸AbstractMap
。
在评论中你说:
obj1和amp;之间的区别是什么?我的代码中的obj2是否有?
我假设您正在谈论此代码:
Base obj1 = new Derived();
Derived obj2 = new Derived();
分配给这些变量的对象没有区别,但变量的类型存在差异,因此您对该对象的引用类型:obj1
指向的对象具有print
方法,但您无法通过obj1
访问它,因为引用的类型是您的有Base
,而不是Derived
,Base
没有print
。相反,您可以通过print
访问obj2
,因为参考的类型为Derived
。
答案 1 :(得分:1)
你想知道这些方面的区别:
Base obj1 = new Derived();
Derived obj2 = new Derived();
在这两种情况下,构造的对象都是类Derived
,但引用是不同的。您可以使用Base
类型的引用,因为Derived
也是Base
(假设Derived
扩展Base
)因此可以使用。但是我们应该选择哪一个?前一个因为它做出了稳健的设计。
考虑Java中的集合框架,它具有List
接口和两个实现:ArrayList
和LinkedList
。我们可以编写程序,专门使用LinkedList
或ArrayList
。但是我们的代码依赖于那些特定的实现。所以我们应该编写我们的程序来依赖超类型List
,而不是我们的程序可以用于任何List
实现。
简而言之,这是OOP设计的一条规则:Program to an interface
。
答案 2 :(得分:0)
以下两行之间的差异 -
Base obj1 = new Derived();
Derived obj2 = new Derived();
那是 -
对于第1行 - 您正在创建一个类型为Derived
的对象并将其存储在Base
类型变量中,这是合法的,因为Derived
类是一个子类Base
的类,但是当你使用obj1
时,你不能调用Derived
类中定义的函数,例如 -
obj1.print()
这会抛出错误,因为对象obj1
的类型是Base
(类),并且没有打印功能。为了能够为print
调用obj1
函数,您需要将obj1
转换为Derived
类并调用该函数,例如 -
((Derived)obj1).print()
在这种情况下,您将obj1转换为Derived类型,因此编译器现在知道obj1
可以调用print()
函数。
Derived
类型的对象并将其存储在Derived
类型变量中。这只是它们如何不同的一个例子,也可以有其他例子。