class Base {
public void add() {
System.out.println("Base ADD");
}
void subtract() {
throw new UnsupportedOperationException("Not yet implemented");
}
}
class Child extends Base {
public void add(){
System.out.println("Child ADD");
}
public void subtract() {
System.out.println("Child Subtract");
}
}
class MainClass {
public static void main(String args[]) {
Base b1 = new Base();
Base b2 = new Child();
Child b3 = new Child();
b1.add();
b2.subtract();
b2.add();
b3.subtract();
}
}
我对上面的代码有些困惑。最让我困惑的是
Base b2 = new Child();
和
b2.subtract();
我了解的是在编译时,编译器会检查天气Base
类是否具有subtract()
方法,然后在运行时,由于对象的类型是多态性Child
。
问题是我们如何或在哪里使用这条线,即 Base b2 = new Child();
在什么情况下我们应该使用这个?请帮助,那太好了!
查看语句的两个部分:
Base b2
声明一个名为b2
type 的变量Base
。如果引用为null或引用的实例Base
或的子类,则可以为该变量分配引用Base
。
然后
new Child()
创建的新实例Child
。Child
是的子类Base
,因此您可以将构造函数返回的引用分配给b2
变量。
现在,即使实际值引用了执行时的实例,您也只能“查看” Base
through的成员。但是,从任何方法已被 覆盖
在将使用的时候,他们是所谓的重写版本......所以,当你打电话b2``Child``Base
__Child
b2.subtract();
JVM找到引用的对象的 实际 类型b2
,并使用该类的实现subtract
-在这种情况下,该方法将显示“ Child Subtract”。
编辑:您专门询问了在哪里可以使用这种东西,以及它如何帮助…
您可以随时使用它来声明更通用类型的变量(超类或接口),但可以为其分配一个值,该值恰好是该接口的子类或实现。再举一个例子:
List<String> strings = new ArrayList<String>();
以一般方式声明变量的主要优点是可以保持灵活性-
稍后可以将的使用从ArrayList<T>
改为其他实现List<T>
,并且代码仍然可以正常工作。您基本上是在说:“我只需要提供的成员和担保List<T>
-我正在使用的事实ArrayList<T>
有点偶然。”
一个类似的示例是确定方法应返回的类型-
通常,您只想声明您返回的是常规类型(或接口),即使实现知道返回的是哪种具体类型。这隐藏了实现细节,使您以后可以更改它们。
主要内容:静态查找表和动态查找表,关键字,如何进行查找?在日常生活中,几乎每天都要进行一些查找的工作,在电话簿中查阅某个人的电话号码;在电脑的文件夹中查找某个具体的文件等等。本节主要介绍用于查找操作的 数据结构—— 查找表。 查找表 是由同一类型的数据元素构成的集合。例如电话号码簿和字典都可以看作是一张查找表。 一般对于查找表有以下几种操作: 在查找表中查找某个具体的数据元素; 在查找表中插入数据元素; 从查找表中删除数据元素; 静态查找表和动态查找表
主要内容:广义表的原子和子表,广义表的表头和表尾前面讲过,数组即可以存储不可再分的数据元素(如数字 5、字符 'a'),也可以继续存储数组(即 n 维数组)。 但需要注意的是,以上两种数据存储形式绝不会出现在同一个数组中。例如,我们可以创建一个整形数组去存储 {1,2,3},我们也可以创建一个二维整形数组去存储 {{1,2,3},{4,5,6}},但数组不适合用来存储类似 {1,{1,2,3}} 这样的数据。 有人可能会说,创建一个二维数组来存
主要内容:顺序存储结构和链式存储结构,前驱和后继通过前面的学习我们知道,具有“一对一”逻辑关系的数据,最佳的存储方式是使用线性表。那么,什么是线性表呢? 线性表,全名为 线性存储结构。使用线性表存储数据的方式可以这样理解,即 “把所有数据 用一根线儿 串起来,再存储到物理空间中”。 图 1 "一对一"逻辑关系的数据 如图 1 所示,这是一组具有“一对一”关系的数据,我们接下来采用线性表将其储存到物理空间中。 首先,用“一根线儿”把它们按照顺序“
HTML 表单的主要作用是接收用户的输入,当用户提交表单时,浏览器将用户在表单中输入的数据打包,并发送给服务器,从而实现用户与Web服务器的交互。 表单是控件的容器,一个表单由form元素、表单控件和表单按钮三部分组成: 1) form元素:用来创建表单,并通过 action、method和enctype三个属性,来设置表单的提交路径、提交方式、编码类型。 2) 表单控件:主要用来收集用户数据,包
问题内容: 我正在使用Java开发链表,因此我试图掌握单个链表的概念。 将为12(也与node1相同)。但是,头是什么? 更新: 引用和指针之间有什么区别? Update2: 因此,如果is 和is ,那么这并不意味着以下函数会跳过第一个节点以查看其是否为空吗? 来源:http://www.mycstutorials.com/articles/data_structures/linkedlists
问题内容: 什么是RMI注册表?它有什么作用? 问题答案: 本质上,RMI注册表是服务器注册其提供的服务的场所,也是客户端查询这些服务的场所。请参阅Java RMI简介 。摘抄: 图1显示了使用RMI时客户端建立的连接。首先,客户端必须联系RMI注册中心,并请求服务名称。开发人员B不知道RMI服务的确切位置,但是他知道足够联系开发人员A的注册表。这将使他指向他要致电的服务方向。