(1)如果同步函数被静态修饰后,使用的锁是什么呢?
通过验证,发现不是this。因为静态方法中也不可以定义this。
静态进内存是,内存中没有本类对象,但是一定有该类对应的字节码文件对象。
类名.class 该对象的类型是Class
静态同步方法,使用的锁是该方法所在类的字节码文件对象。类名.class。
面试时注意。
(2)
懒汉式与饿汉式有什么不同?
懒汉式的特点在于延迟加载。
懒汉式的延迟加载有没有问题?
有,如果多线程访问时会出现安全问题。
怎么解决懒汉式的问题?
可以加同步来解决。而加同步的方式用同步代码块或者同步函数都可以,但是稍微有些低效。不过用双重判断的方式能解决这个问题。
加同步的时候,使用的锁是哪一个?
该类所属的字节码文件对象。
实例代码:
单例设计模式
开发一般常用:饿汉式。
class Single
{
private static Single s=new Single();
private Single(){}
public Single getInstance()
{
return s ;
}
}
面试一般常考:懒汉式。
class Single
{
private static Single s=null;
private Single(){}
public Single getInstance()
{
if(s==null)
{
s=new Single();
}
return s;
}
}
多线程中的(安全/效率较高)问题的懒汉式:
class Single
{
private static Single s=null;
private Single(){}
public Single getInstance()
{
if(s==null)
{
synchronized(Single.class)
{
if(s==null)
{
s=new Single();
}
}
}
return s;
}
}
(3)当父类中的成员或方法被私有后,子类也不能继承该方法。
(4)不让类建立对象的办法:
1.把类搞成抽象(可以不定义抽象方法)
2.把类的构造函数私有化。
(5)需要被子类实现,子类对接口中的抽象方法全都覆盖后,子类才可以实例化。
(6)多态的出现代码的特点:
在多态中,(非静态)成员函数的特点,
在编译时期(javac):参阅引用型变量所属的类中是否有调用的方法。如果有,编译通过,如果没有,编译失败。
在运行时期(java):参阅对象所属的类中是否有调用的方法。
多态时就是: 父 a=new 子();
在多态中,成员变量的特点:无论编译或运行,都参考左边(引用型变量所属的类)
在多态中,静态函数的特点:无论编译或运行,都参考左边(引用型变量所属的类)
简单总结:成员函数在多态调用时,编译看左边,运行看右边。
(7)
Outer.Inner in=new Outer().new Inner();//没有被static修饰时,这样创建内部类的对象。
Outer.Inner a=new Outer.Inner();//当内部类被static修饰时,这样创建内部类的对象
(8)接口中的成员都有固定修饰符。
常量:public static final
方法:public abstract
(9)接口中所有的抽象方法都必须被实现它的子类复写。
(10)List集合判断元素是否相同,依据的是元素的equals方法。而一般的equals方法都是比较的两个对象的地址值。
有必要时子类可以复写该方法满足自己判断是否相等的条件。
(11)java ee
ide
jms
jmx
jndi
(12)import java.util.*;
class CollectDemo
{
public static void main(String[] args)
{
//把集合转数组。
/*ArrayList<String> al=new ArrayList<String>();
al.add("linger");
al.add("xuejian");
al.add("longkui");
String[] arr=al.toArray(new String[al.size()]);
for(String s:arr)
{
System.out.println(s);
}*/
//把数组转集合。
String[] arr=new String[4];
arr[0]="linger";
arr[1]="linyueru";
arr[2]="anu";
arr[3]="xiaolan";
List list=Arrays.asList(arr);
System.out.println(list);
}
}
330、面向对象的特征?
主要有以下四方面:
1.抽象:抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了
解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面,一是过程抽象,二是数据抽象。
2.继承:继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新类可
以从现有的类中派生,这个过程称为类继承。新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为
新类的基类(父类)。派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的
需要。
3.封装:封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。面向对象计算始于这个基本概念,即现实世
界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。
4.多态性:多态性是指允许不同类的对象对同一消息作出响应。多态性包括参数化多态性和包含多态性。多态性语言具有灵
活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题。
字节流FileInputStream中的read方法,用到的是字节数组byte【】
而FileReader中的read方法,用到的是字符数组char【】
这两个流中的read()方法,都是返回的int型数据。