java和c#实现多态的区别
- c#有三种方式实现多态:1.虚方法;2.抽象类;3.接口
- java实现多态只需子类重写父类或接口的方法就行(父类方法不能被static、private、final修饰)。
- c#中父类被重写的方法必须加上virtual或abstract关键字,而java中不用。
关于instanceof关键字的理解
A instanceof B用于判断是否能将A赋值给B(包括:强制转化赋值、隐式转换赋值)。如果能则返回true
代码块相关问题
- 普通代码块(直接用大括号扩住的那种),在类被实例化时就执行一次,早于构造函数。
- 静态代码块,在类**第一次初始化(加载、链接、初始化)**时执行一次,早于普通代码块和构造函数
try catch与throws
两者都能让代码消红(即让程序编译通过),但只有try catch能捕获异常。运气好没出异常则两者结果相同。运气不好处异常了则try catch可抓住该异常使程序继续运行,而throws则会将异常丢给jvm(如果沿途没有trycatch的话),导致程序停止。
关于synchronized代码块
synchronized括号中填入什么对象即可让该对象变成开启代码块的钥匙。如synchronized(A){code},第一个进程要访问code时会拿走A,访问完后会释放A。
实现多线程的两种方式
- 让A继承Thread类,再重写run()方法。在new出A的实例调用start()方法。然后由于A继承了Thread,所以A可用Thread中的种种功能。(注意不要调用run()方法,不然只会单纯执行run()方法而不是开启一个线程执行run()方法)
- 让A实现Runnable接口,再new一个Thread类将A传入,之后操作这个Thread类就行了。
静态代理模式
- 真实对象和代理对象要实现同一个接口(为什么?因为这样可以规范双方,确保双方都为了干同一件事)
- 代理对象要代理真实角色
- 多线程的就是静态代理模式,Thread类和自己写的类都实现了Runnable接口,Thread负责提供一系列功能,自己的类专注实现某个方法