Java基础知识阶段二
静态方法和实例方法有何不同
静态方法和实例方法的区别主要体现在两个方面:
- 在外部调用静态方法时,可以使用“类目.方法名”的方式,也可以使用“对象名.方法名”的方式。而实例方法只有后面这种方式,也就是说,调用静态方法可以无需创建对象
- 静态方法在访问本类的成员的时候,只允许直接访问静态成员(即静态成员变量和静态方法),而不允许访问实例成员变量和实例方法,实例方法则无此限制
euqals()和“==”的区别
- 重写后equals()方法用来比较的是两个对象的内容是否相等,由于所有的类都是继承自java.long.Object类的,所以适用于所有对象,可以自己定制规则.如果没有对该方法进行覆盖的话,调用的仍然是Object类中的方法,而Object中的equals返回的却是==的判断
- "=="比较的是变量(栈)内存地址,用来判断两个对象的地址是否相同,即是否是指相同一个对象
Integer与int的区别
- 基础
- int是java提供的8种原始数据类型之一,Integer是java为int提供的封装类。
- int的默认值为0,而integer的默认值为null
- Integer可以区分出为赋值和值为0的区别,int无法表达出未赋值的情况
- 扩展
- 在JSP开发中,Integer的默认为null,所以用el表达式在文本框中显示时,值为空白字符串,而int默认的默认值为0,所以用el表达式在文本框中显示的时候,结果为0,所以,int不适合作为web层的表单数据的类型
- 在Hibernate中,如果将OID定义为Integer类型,那么Hibernate就可以根据其值是否为null而判断一个对象是否是临时的,如果将OID定义为了int类型,还需要在hbm映射文件中设置其unsaved-value属性为0
下面这条语句一共创建了多少对象: Stirng s= "a" + "b" + "c" + "d";
- 这一行代码被编译器在编译时优化后,相当于直接定义了一个“abcd”的字符串,所以上面的代码应该只创建了一个String对象
String a = new String("ab"); String b = a + "cd"创建了几个对象?
- 4个对象
- 具体来说new String("ab")有两个,分别在堆内容和常量池,cd一个;abcd一个
String、StringBuffer,StringBuilder有什么区别
- 它们之间最大的不同就是String不可变,后者可变
- StirngBuffer是线程安全的,StringBuilder是线程不安全且速度较快
创建线程的方式是什么,优缺点是什么?
方式
- 方式一:继承Thread类创建线程类
- 定义Thread类的子类,并重写该类的run方法,该run方法的方法体就代表了线程要完成的任务。因此把run()方法称为执行体。
- 创建Thread子类的实例,即创建了线程对象。
- 调用线程对象的start()方法来启动该线程。
- 方式二:通过Runnable接口创建线程类
- 定义runnable接口的实现类,并重写该接口的run()方法,该run()方法的方法体同样是该线程的线程执行体。
- 创建 Runnable实现类的实例,并依此实例作为Thread的target来创建Thread对象,该Thread对象才是真正的线程对象。
- 调用线程对象的start()方法来启动该线程。
- 方式三:通过Callable和Future创建线程
- 创建Callable接口的实现类,并实现call()方法,该call()方法将作为线程执行体,并且有返回值。
- 创建Callable实现类的实例,使用FutureTask类来包装Callable对象,该FutureTask对象封装了该Callable对象的call()方法的返回值。
- 使用FutureTask对象作为Thread对象的target创建并启动新线程。
- 调用FutureTask对象的get()方法来获得子线程执行结束后的返回值。
优缺点
- 采用实现Runnable、Callable接口的方式创见多线程
- 优势是:
- 线程类只是实现了Runnable接口或Callable接口,还可以继承其他类。
- 在这种方式下,多个线程可以共享同一个target对象,所以非常适合多个相同线程来处理同一份资源的情况,从而可以将CPU、代码和数据分开,形成清晰的模型,较好地体现了面向对象的思想。
- 劣势是:
- 编程稍微复杂,如果要访问当前线程,则必须使用Thread.currentThread()方法
- 优势是:
- 使用继承Thread类的方式创建多线程
- 优势是:
- 编写简单,如果需要访问当前线程,则无需使用Thread.currentThread()方法,直接使用this即可获得当前线程。
- 劣势是:
- 线程类已经继承了Thread类,所以不能再继承其他父类。
- 优势是: