牛客网做题5.30

(1)普通的类方法是可以和类名同名的,和构造方法唯一的区分就是,构造方法没有返回值。

(2)RMI的理解

RMI(Remote Method Invocation)远程方法调用是一种计算机之间利用远程对象互相调用实现双方通讯的一种通讯机制。使用这种机制,某一台计算机上的对象可以调用另外一台计算机上的对象来获取远程数据。RMI是Enterprise JavaBeans的支柱,是建立分布式Java应用程序的方便途径。在过去,TCP/IP套接字通讯是远程通讯的主要手段,但此开发方式没有使用面向对象的方式实现开发,在开发一个如此的通讯机制时往往令程序员感觉到乏味,对此RPC(Remote Procedure Call)应运而生,它使程序员更容易地调用远程程序,但在面对复杂的信息传讯时,RPC依然未能很好的支持,而且RPC未能做到面向对象调用的开发模式。针对RPC服务遗留的问题,RMI出现在世人面前,它被设计成一种面向对象的通讯方式,允许程序员使用远程对象来实现通信,并且支持多线程的服务,这是一次远程通讯的革命,为远程通信开辟新的里程碑。

RMI的开发步骤

先创建远程接口及声明远程方法,注意这是实现双方通讯的接口,需要继承Remote

开发一个类来实现远程接口及远程方法,值得注意的是实现类需要继承UnicastRemoteObject

通过javac命令编译文件,通过java -server 命令注册服务,启动远程对象

最后客户端查找远程对象,并调用远程方法

(3)八进制

八进制,以8为基数的算法,逢8进1.所以8在八进制就是010,前面那个0是为了和十进制区分用的,也叫转译符。

(4)

题目:什么操作会使得当前线程停止。

A:一个InterruptedException 异常被捕获  大家都知道的嘛 (一般通过interrupt方法 中断线程)  如果抓到一个线程  都会关紧catch里面 然后中断当前操作,A正确。

B:线程执行了wait()方法。   线程使用了wait方法,会强行打断当前操作,(暂停状态,不会中断线程) 进入阻塞(暂停)状态,然后需要notify方法或notifyAll方法才能进入就绪状态。 B 正确。

C:当前线程创建了一个新的线程。   新创建的线程不会抢占时间片,只有等当前线程把时间片用完,其他线程才有资格拿到时间片去执行。

D:一个高优先级别的线程就绪。  如C相同,你优先级别再高 也待等我现在弄完才会给你。(就像我们玩游戏,会员虽然有排队优先权,但是还是要等正在登陆的用户进去游戏之后才能抢到他原来那个位置,不能说我在过关卡的过程中你一脚把我踢开,然后霸占我的位置吧,我原来的那些数据咋办!!!)

E:线程在MediaTracker上执行了waitforID()调用。  

这个应该大家也不太熟悉。这个类是awt里面的,我查API才知道。

然后他的功能是加载图像,直到完成之前,该方法一直等待!这个方法是必须要抛出A选项的InterruptedException 异常的

(5)关于 abstract 关键字的说法

1abstract类不能与final,static使用。final修饰方法,子类可以调用,但不能覆盖。

2最好不要有private因为私有和抽象放在一起,子类如果想重写父类的私有方法根本继承不过来,也就无法重写

3抽象类中可以有非抽象方法

4抽象类中可以都是非抽象的,但是抽象方法一定要在类和接口中

(6)

要理解Java程序初始化顺序,就得理解虚拟机从加载、编译、运行一个类的过程:

静态代码域:包括静态变量、静态代码块,这些是随着虚拟机加载得时候就要执行得,且只会执行一次,它们之间得优先级是同等的,根据出现的先后来决定次序。

当运行一个子类程序时,JVM首先会先完成加载:

先父类再子类,所以会先执行父类和子类的静态代码域。

加载完成后,开始编译执行(走main方法入口):

main方法的代码是要new一个子类,所以首先会去初始化父类再去构造子类。而初始化父类的操作是,先是非静态代码块/变量,最后是构造函数。完成了父类的创建后,按照相同的规则去构造子类。

下面也可以理解为

Java程序初始化的执行顺序:父类静态变量—>父类静态代码块—>子类静态变量—>子类静态代码块—>父类非静态变量—>父类非静态代码块—>父类构造方法—>子类非静态变量—>子类非静态代码块—>子类构造方法

(7)当类加载时,static静态方法随着类加载而初始化,此时实例对象还未被创建,但是非静态成员变量需要等到实例对象创建才会被初始化,故无法被引用。所以在静态方法中我们无法引用非静态变量,非静态成员只能被类的实例化对象引用

(8)在jdk1.5之后,下列 java 程序输出结果为

int i=0;

Integer j = new Integer(0);

System.out.println(i==j);

System.out.println(j.equals(i));

true,true

本题是一个自动拆装箱的考题(自动拆装箱JDK需在1.5上),下面的讨论都不针对新开辟对象的情况:
1、基本型和基本型封装型进行“==”运算符的比较,基本型封装型将会自动拆箱变为基本型后再进行比较,因此Integer(0)会自动拆箱为int类型再进行比较,显然返回true;
2、两个Integer类型进行“==”比较,如果其值在-128至127,那么返回true,否则返回false, 这跟Integer.valueOf()的缓冲对象有关,这里不进行赘述。
3、两个基本型的封装型进行equals()比较,首先equals()会比较类型,如果类型相同,则继续比较值,如果值也相同,返回true
4、基本型封装类型调用equals(),但是参数是基本类型,这时候,先会进行自动装箱,基本型转换为其封装类型,再进行3中的比较。

猜你喜欢

转载自blog.csdn.net/weixin_41673515/article/details/90695233
今日推荐