1、覆盖与重载的关系是 覆盖只发生在父类与子类之间,而重载可以发生在同一个类中。
方法的重载:
定义:同一个类或与他的派生类中,方法名相同而参数列表不同的方法。其中参数列表不同指的是参数的类型,数量,类型的顺序这三种至少有一种不同。
方法重载与下列无关:与返回值类型无关;与需要师傅无关;
构造方法也可以重载
方法的重写:
定义:在继承关系的子类中,定义一个与父类相同的方法
判断是否重写的方式:在方法之前加上@ Overri de
方法重写的特点:
在继承关系的子类中重写父类的方法
重写的方法必须方法名相同,参数列表也相同
重写的方法的返回值类型应该与父类中被重写方法的返回值类型相同或是他的子类类型
重写的方法的访问权限应该与父类中被重写方法的访问权限相同或高于它的访问权限
重写的方法不能抛出比父类更加宽泛的异常
方法重写的注意事项:
构造方法不能被重写,因为构造方法名必须和类名相同
private修饰的成员方法补不能被重写
static修饰的方法不能被重写
final修饰的方法不能被重写
当子类重写了父类中的方法后,子类对象调用该方法时调用的是子类重写后的方法。
2、下面的程序输出的是Fmnwxy
String x="fmb";
x.toUpperCase();
String y=x.replace('f','F');
y=y+"wxy";
System.outprintln(y);
String x=“fmn”; “fmn”是在常量池里的不可变对象。
x.toUpperCase(); 在堆中new一个"FMN"对象,但无任何引用指向它。
String y=x.replace(‘f’,‘F’); 在堆中 new一个"Fmn"对象,y指向它。
y=y+“wxy”; 在堆中 重新new一个"Fmnwxy"对象, 修改y指向,现在y指向它。
3、static修饰某个字段时,肯定会改变字段创建的方式(每个被static修饰的字段对于每一个类来说只有一份存储空间,而非static修饰的字段对于每一个对象来说都有一个存储空间)
static属性是属于类的,所以对象共同拥有,所以既可以通过类名.变量名进行操作,又可以通过对象名.变量名进行操作
4、
public interface IService{
String NAME="default";
}
与上面等价表示的是 public statitc final String NAME=“default”;
为什么是public:因为接口必然是要被实现的,如果不是public,这个属性就没有意义了;
为什么是static:因为如果不是static,那么由于每个类可以继承多个接口,那就会出现重名的情况;
为什么是final:这是为了体现java的开闭原则,因为接口是一种模板,既然是模板,那就对修改关闭,对扩展开放。
5、sleep和wait
(1)这两个方法来自不同类,sleep来自Thread,wait来自Object类。sleep是Thread的静态类方法,谁调用的谁去睡觉,即使在a线程里调用了b的sleep方法,实际上还是a去睡觉,要让b线程睡觉要在b的代码中调用sleep。
(2)最主要是sleep方法没有释放锁,而wait方法释放了锁,使得敏感词线程可以使用同步控制块或者方法。
sleep不出让系统资源;wait是进入线程等待池等待,出让系统资源敏感词线程可以占用CPU。一般wait不会加时间限制,因为如果wait线程的运行资源不够,再出来也没用,要等待敏感词线程调用notify/notifyAll唤醒等待池中的所有线程,才会进入就绪队列等待OS分配系统资源。sleep(milliseconds)可以用时间指定使它自动唤醒过来,如果时间不到只能调用interrupt()强行打断。
Thread.Sleep(0)的作用是:触发操作系统立刻重新进行一次CPU竞争。
(3)适用范围:wait,notify和notifyAll只能在同步控制方法或者同步控制块里使用,而sleep可以在任何地方使用
synchronized(x){
x.notify()
//或者wait()
}
(4)sleep必须捕获异常,而wait,notifynotifyAll不需要捕获异常
6、java提供一个系统级的线程,即垃圾回收器线程。用于对每一个分配出去的内存空间进行跟踪。当JVM空闲时,自动回收每块可能被回收的内存,GC是完全自动的,不能被强制执行。程序员最多只能用System.gc()来建议执行垃圾回收器回收内存,但是具体的回收时间是不可知的。当对象的引用变量被赋值null,可能被当成垃圾。
7、以下代码执行的结果显示是0
public class Demo{
public static void main(String args[]){
int count=0;
int num=0;
for(int i=0;i<100;i++){
num=num+i;
count=count++;
}
System.out.println("num*count="+(num*count));
}
}
count=count++原理temp=count;count=count+1;count=temp;因此count始终是0,这仅限于java与c是不一样的
8、抽象类和接口区别:
区别1:抽象类体现继承关系,一个类只能単继承。接口体现实现关系,一个类可以多实现。
区别2:抽象类中可以定义非抽象方法和抽象方法,子类继承后可以直接使用非抽象方法。接口的方法都是抽象的,必须由子类去实现。接口中的成员都有固定的修饰符。
区别3:抽象类有构造方法,用于给子类对象初始化。而接口没有构造方法。
特点1:抽象类不可以实例化,即不能用new创建对象。抽象类必须由其子类覆盖了所有的抽象方法后,该子类才可以实例化,否则,这个子类也是抽象类。
特点2:抽象类abstract关键字不能和哪些关键字共存:
final 因为final修饰的方法不能被继承。
static因为类.方法(),此方法没有方法体,没有意义。
private 因为抽象方法是要被子类覆盖的,加上private子类就不知道这个方法了。
特点3:接口中声明变量必须是final、public 、static的,接口中定义的方法都是abstract、public的。接口里的数据成员必须初始化,且全是常量,不是变量。
特点4:接口是抽象类的 变体( 你没看错 ),接口也可以通过关键字extends来继承其他接口。格式如下所示:
class 类名称 implements 接口A,接口B{ //接口的实现}
interface 子接口名称 extends 父接口1,父接口2,…{}
9、1)Bootstrap ClassLoader
负责加载 $ JAVA_HOME中jre/lib/rt.jar里所有的class,由C++实现,不是ClassLoader子类
2)Extension ClassLoader负责加载java平台中扩展功能的一些jar包,包括$JAVA_HOME中jre/lib/*.jar或-Djava.ext.dirs指定目录下的jar包
3)App ClassLoader负责记载classpath中指定的jar包及目录中class
4)Custom ClassLoader
属于应用程序根据自身需要自定义的ClassLoader,如tomcat、jboss都会根据j2ee规范自行实现ClassLoader加载过程中会先检查类是否被已加载,检查顺序是自底向上,从Custom ClassLoader到BootStrap ClassLoader逐层检查,只要某个classloader已加载就视为已加载此类,保证此类只所有ClassLoader加载一次。而加载的顺序是自顶向下,也就是由上层来逐层尝试加载此类。
10、有关会话跟踪技术描述正确的是
Cookie是Web服务器发送给客户端的一小段信息,客户端请求时,可以读取该信息发送到服务器端;关闭浏览器意味着临时会话ID丢失,但所有与原会话关联的会话数据扔保留在服务器上,直至会话过期;
在禁用Cookie时可以使用URL重写技术跟踪会话。
916

被折叠的 条评论
为什么被折叠?



