Fork me on GitHub

java_oop_关键字

空白符
注释

标识符
分隔符
操作符
字面量
关键字

instanceof

java 中的instanceof 运算符是用来在运行时指出对象是否是特定类的一个实例。instanceof通过返回一个布尔值来指出,这个对象是否是这个特定类或者是它的子类的一个实例。

用法:
result = object instanceof class
参数:
Result:布尔类型。
Object:必选项。任意对象表达式。
Class:必选项。任意已定义的对象类。
说明:
如果 object 是 class 的一个实例,则 instanceof 运算符返回 true。如果 object 不是指定类的一个实例,或者 object 是 null,则返回 false。

但是instanceof在Java的编译状态和运行状态是有区别的:

在编译状态中,class可以是object对象的父类,自身类,子类。在这三种情况下Java编译时不会报错。

在运行转态中,class可以是object对象的父类,自身类,不能是子类。在前两种情况下result的结果为true,最后一种为false。但是class为子类时编译不会报错。运行结果为false。

接口Person

public interface Person {
public void eat();
}

实现类People

public class People implements Person {
private int a=0;
 @Override
 public void eat() {
  System.out.println("======"+a);
  
 }

}

子类xiaoming:

public class xiaoming extends People {
private String name;

@Override
public void eat() {
 System.out.println("+++++++++");
}
}

主函数

public static void main(String[] args) {
  People p=new People();
  xiaoming x=new xiaoming();
  System.out.println(p instanceof Person);
  System.out.println(p instanceof xiaoming); -----2
  System.out.println(x instanceof Person);
  System.out.println(x instanceof People);
 }

注意:上面2处的代码在编译时不会报错。

运行结果:

true
false
true
true

 

只要有jdk,文本编辑器,就可以实现代码

以下是在win10下的命令行中实现的效果

 

http://haolloyin.blog.51cto.com/1177454/332426/

IService接口:

 

import java.rmi.Remote;
import java.rmi.RemoteException;
public interface IService extends Remote {
  //声明服务器端必须提供的服务
  String service(String content) throws RemoteException;
}

 

ServiceImpl实现类:

import java.rmi.RemoteException;
//UnicastRemoteObject用于导出的远程对象和获得与该远程对象通信的存根。
import java.rmi.server.UnicastRemoteObject;

public class ServiceImpl extends UnicastRemoteObject implements IService {

  private String name;

  public ServiceImpl(String name) throws RemoteException {
    this.name = name;
  }
  @Override
  public String service(String content) {
    return "server >> " + content;
  }
}

 

Server类:

 

/*
* Context接口表示一个命名上下文,它由一组名称到对象的绑定组成。
* 它包含检查和更新这些绑定的一些方法。
*/
import javax.naming.Context;
/*
* InitialContext类是执行命名操作的初始上下文。    
* 该初始上下文实现 Context 接口并提供解析名称的起始点。
*/
import javax.naming.InitialContext;
public class Server {
  public static void main(String[] args) {
    try {
      //实例化实现了IService接口的远程服务ServiceImpl对象
      IService service02 = new ServiceImpl("service02");
      //初始化命名空间
      Context namingContext = new InitialContext();
      //将名称绑定到对象,即向命名空间注册已经实例化的远程服务对象
      namingContext.rebind("rmi://localhost/service02", service02);
    } catch (Exception e) {
      e.printStackTrace();
    }
    System.out.println("服务器向命名表注册了1个远程服务对象!");
  }
}

 

Client类:

import javax.naming.Context;
import javax.naming.InitialContext;

public class Client {
  public static void main(String[] args) {
    String url = "rmi://localhost/";
    try {
      Context namingContext = new InitialContext();
      // 检索指定的对象。 即找到服务器端相对应的服务对象存根
      IService service02 = (IService) namingContext.lookup(url
          + "service02");
      Class stubClass = service02.getClass();
      System.out.println(service02 + " 是 " + stubClass.getName()
          + " 的实例!");
      // 获得本底存根已实现的接口类型
      Class[] interfaces = stubClass.getInterfaces();
      for (Class c : interfaces) {
        System.out.println("存根类实现了 " + c.getName() + " 接口!");
      }
      System.out.println(service02.service("你好!"));
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}

javac Server.java

javac Client.java

 

start是win cmd命令,rmiregistry是jdk命令
start rmiregistry
start java Server
java Client

D:\code\testjava>java Client
Proxy[IService,RemoteObjectInvocationHandler
[UnicastRef
[liveRef:
[endpoint:[192.168.30.219:63188](remote),
objID:[-73e8973b:15e82f8d067:-7fff, 7236802699799293841]]]]]
是 com.sun.proxy.$Proxy0 的实例!
存根类实现了 java.rmi.Remote 接口!
存根类实现了 IService 接口!
server >> 你好!

 

posted on 2017-07-14 09:08  阳光-源泉  阅读(478)  评论(0编辑  收藏  举报

导航