(2)在DOS提示符下当前目录为该源文件所在的目录,PATH环境变量已包含编译程序所在的路径编译目标路径为“D:/classes”,编译命令行是_____________
(3)为了让java经典编程300例解释器能够找到編译后的类文件,需要如何设置环境变量___________
(4)在正确设置了相关的环境变量之后,运行HelloWorld类的命令行是____________?
(1)HelloWorld.java经典编程300例公共类必须定义茬和类名同名的文件中,文件名区分大小写
2. 阅读下列代码回答问题(关于private的理解)
问:上面代码java经典编程300例编译器是否会给出错误提示?为什么
答案:不会出现错误提示,private限制了私有变量只能被同一个类访问但是没有限制同一个类的不同对象之间互相访问私有变量。實际上private是在编译时进行检查,如果想限制同类对象之间互相访问需要在动态运行时实现,开销较大而且没有必要。
3. 阅读下列代码回答问题(关于多态性的理解)
问: 写出上面代码的输出
答案:参见代码注释,子类和父类中定义同名的变量时仅仅是隐藏了,变量没囿多态性;而对于覆盖的方法java经典编程300例表现出多态性,
会调用更具体的子类里面的方法无论从哪里调用,无论使用什么引用类型调鼡
4.阅读下列代码回答问题(关于匿名内部类的理解)
这个语句在参数表中定义了一个匿名内部类,这个匿名内部类实现了接口A实例化叻一个匿名内部类的对象,并将这个对象传递给了接收接口A作为参数的方法f(A a)需要注意的是接口A中的方法f()和类B中的方法f(A a)没有任何关系,是鈈同的方法
5. 阅读下列代码回答问题(关于static的理解)
问:写出上面代码的输出。
答案: 2 1 2 1i是静态变量,类的所有实例共享同一个i通常我們不通过引用变量访问静态变量,而是通过类名访问Static.i注意Static是我们自己定义的类名,而小写的static是关键字表示静态的,为类的所有实例共享的变量或方法j是实例变量,每个对象具有不同的属于其自身的一个变量j。
6. 阅读下列代码回答问题(关于引用变量的理解)
答案:参栲代码注释输出应该是:0 1 0
7. 阅读下列代码回答问题(关于异常的理解)
答案:输出是:1 3 0 参数不能为负数! 无论什么时候!
try语句块里面的一行代碼抛出了异常,后续代码就不再执行了而是转到catch开始匹配异常类型。finally语句块里面的代码始终会被执行即使在catch语句块里面有行return语句也不會立即返回,java经典编程300例确保finally语句块执行完函数才会返回
《java经典编程300例程序设计课件》
对于广播我相信在现实生活中峩们时常都能接触到,例如学校一言不合就响起了校歌搞的全校人都能够听到,想假装没听到都不行
假如我们把学校比作一个局域网嘚话,某台主机发起了一个广播意味着局域网内的其他所有主机都会收到这个广播,那发起广播的主机是如何选择路径来给其他主机发送广播分组的呢考虑下面由几个节点组成的网络:
假如节点 R1 要做一个广播给 R2, R3, R4 发广播分组,显然一种很简单的方法就是 R1 给 R2、R3、R4 三个节点汾别发一次广播分组,这意味着 R1 一共要发送三次同样的广播分组
途中不同箭头的颜色表示 R1 给不同的节点发广播分组。
大家想一个问题:這种发送方式合理吗
是的,这种发送方式在实现上很简单源节点(R1)每次带上目的节点的地址,然后发送给它就行了
不过这种方式茬效率上是极低的,例如R1 发送的这三个广播分组都会经过同一段链路(R1-R2这段链路),而且 R2 要是再连接上 n 个节点的话代表着这 R1 需要再发送 n 次广播分组,这 n 个报文也会经过同一段链路
为了解决这个问题,我们或许可以这样做:R1 把广播分组发给它的邻居节点 R2然后 R1 就不管了,R2 再把报文发送给它的所有邻居节点 R3、R4 (除了从其接收该分组的那个邻居 R1)
显然这种方式也是挺不错的,R1 只发送了一次广播分组而且 R1-R2 這段链路也不会出现同一个广播分组重复经过的情况。
不过这种给所有邻居节点发送广播分组的方式够优雅吗?
看下面的一个网络组成:
按照刚才的方法R1 会给 R2 发送广播分组,接着 R2 会给 R3、R4 发送广播分组刚才我们说过,收到广播分组的节点会给它的所有邻居发送报文(除叻从其接受到该报文的那个邻居)
所以这个时候 R3 会给 R4 发送广播分组文,而 R4 接收到 R3 的广播分组之后R4 会给 R2 发送广播分组,R2 收到 R4 的广播分组の后 也会给 R3 再次发送广播分组…..
如果节点中形成了一个圈,那么就会像上面那样节点之间不停发送广播分组,这时网络上充斥着大量偅复的广播分组将会严重影响资源的利用。
我们也把这种情况称之为广播风暴
因此,我们必须想出某种策略来控制这种广播风暴
一種很简单的方法,就是给这一份广播分组做一个标记例如,源节点(发起广播的节点)可以将其地址以及广播序号放入这个广播分组中然后发送给它的所有邻居节点,每个节点会维护它已经收到的、转发的源地址和广播分组的序号列表
当节点收到一个广播分组时,会檢查这个广播分组是否之前接收过(可以通过源地址、报文序号来检查)如果接收过,就把该广播分组丢弃;否则把该广播分组接收,且向所有邻居节点转发
例如对于下面由 7 个节点组成的网络:
如果节点 A 要做一个广播,那么 A 就会给其邻居节点 B、C 发一份广播分组B、C 也會给其的邻居节点发送一个广播分组。意味着 B 会给 C、D 发送广播分组而 C 也会给 B、E、F 发送一份广播分组:
当 B 收到 C 发给它的报文时,B 检测到已經有了该报文所以 B 会丢弃 C 发送给它的广播分组,C 也一样会丢弃 B 发送给它的广播分组图中青色的箭头代表该广播分组会被丢弃。
从图中鈈难看出就算节点之间形成了圈,也不会出现节点之间循环转发的情况
虽然该方法简单 ,但确实有效控制了广播风暴当然,这只是控制广播风暴的方法之一实际上还有其他方法,在此我就不说了
虽然上面那种方法有效控制了广播风暴,但也存在着很多冗余广播分組(那些被丢弃的广播分组就是冗余的广播分组)
如果可以,我想让每个节点仅接收一次广播分组也不用考虑丢弃广播分组,所以理想的情况应该是这样:
有没有一种方法可以让广播分组像上面这种情况来传送呢?请大家看下面一个图:
如果把节点当作一个图的顶点大家观察下左边的图与右边的图有什么联系。
右边的图不就是左边图的生成树吗(学了这么多年的生成树,终于用到了)如果我们给每┅段链路加上相应的费用,那么我们最理想的情况就是找到一颗最小生成树
所以,我们最理想的情况就是让广播报文在最小生成树的路徑中传送于是 ,我们现在的问题就是找出这些节点组成的网络中的最小生成树
那么,如何构造一颗生成树呢下面提供一种基于中心某个中心的方法来建立一颗生成树。注意是生成树,不是最小生成树
该方法是这样的:我们先选出一个中心节点,然后其他节点向这個中心节点发送加入树报文加入树报文经过的路径,都会被嫁接到生成树上例如对于这个网络结构:
我们选择 E 为中心点,然后其他节點给 E 发送加入树报文:
1. F 节点给 E 发送加入树报文此时 E-F 链路成为初始生成树,如下图(红色路径表示生成树)
注:D 不用再发送加入树报文叻,因此它此时已经在生成树里了
3. 接着 C 给 E 发送加入树报文,C-E 加入生成树
4. 接着,A 给 E 发送报文假设 A 选择的路径是 A->C->E。不过当 A 的报文到达 C 之後由于原本 C-E 就在生成树里面了,所以 A 的报文不用经过 C-EA-C 就加入到生成树了。
5. 最后 G 通过 D 加入生成树
到此,生成树构建完毕此时生成树洳下:
然后在广播的时候,就可以沿着这条路径来转发复制广播报文了
作者:帅地,一个热爱编程的在校生我的世界不只有coding,还有writing目前维护订阅号「苦逼的码农」,专注于写算法与数据结构、java经典编程300例、计算机网络
声明:本文为作者个人投稿,版权归其所有
点擊“阅读原文”,打开 CSDN App 阅读更贴心!
喜欢就点击“好看”吧!