1、重载的概念、特点是什么?有什么好处?
答:概念:在同一个类中,允许存在多个同名函数,只要他们的参数类型或参数个数不同即可。
特点:与返回值无关,只于参数列表有关。
好处:方便阅读,优化了程序,是多态性的一种体现。
2、构造函数的特点、作用是什么?多个构造函数之间是以什么形式存在的?
答:特点是函数名与类名相同,不用定义返回值,不可以用return语句。作用是对对象进行初始化。是以重载的形式存在的。
3、构造代码块的作用是什么?和构造函数有什么区别?
答:作用:对对象进行初始化,对象一建立就运行,且优先于构造函数运行。
区别:构造代码块是对所有对象进行统一初始化,而构造函数是给对应的对象进行初始化。
4、this是什么?有什么作用?
答:this是指向本类对象的一个指针,它只能用于方法体内,当对象创建后,Java虚拟机(JVM)就会给这个对象分配一个引用自身的指针,这个指针就是this。
this指针只能在类的非静态方法中使用,静态方法和静态的代码块中不能使用this,因为this只能和特定的对象关联,而不能和类关联,同一个类的不同对象有不同的this。
作用:
1. 表示当前对象的引用。
2. 当函数的参数和成员变量重名的时候,表示调用的是成员变量而非函数参数。
3. 用于构造函数之间互相调用,指定特定参数类型的构造函数,但是只用引用一个构造函数,且必须位于第一行。
5、static是什么?
答:static表示“静态”的意思,用来修饰成员变量和成员函数,也可以形成静态的static代码块。被static修饰的成员变量和成员方法独立于该类的任何对象。也就是说,它不依赖特定的实例,被类的所有实例共享。
只要类被加载,虚拟机就能根据类名在运行时方法区内找到它们。因此,static可以在任何对象创建之前访问,无需引用任何对象。
(1)static有以下四个特点:
1. 随着类的加载而加载
2. 优先于对象存在
3. 被所有对象所共享
4. 可以直接被类名调用
(2)static的使用注意事项:
1. 静态的方法只能使用静态的成员。而非静态的方法既可以使用静态成员又可以使用非静态成员。
2. 静态方法内没有this、super等关键字。
(3)static的利与弊:
利:
1.节省空间。只在类的加载时分配一次空间,所有对象共同享用。
2.使用方便。可以直接被类名调用,而不用事先创建任何对象。
弊:
1. 生命周期太长。
2. 访问出现局限性。
6、类变量和实例变量的区别?
答:首先,存放的位置不同。类变量随着类的加载而存在于方法区中,而实例变量随着对象的建立而存放于堆内存中。
其次,生命周期不同。类变量的生命周期最长,随着类的消失而消失。实例变量生命周期随着对象的消失而消失。
7、建立对象的过程?
8、单例设计模式的思路是什么?
答:想要保证对象唯一。
1,为了避免其他程序过多建立该类对象。先禁止其他程序建立该类对象。(构造函数私有化)
2,还为了让其他程序可以访问到该类对象,只好在本类中,自定义一个对象。(在类中创建本类对象)
3,为了方便其他程序对自定义对象的访问,可以对外提供一些访问方式。(提供一个方法可以获取到该对象)
9、继承的作用
答:1.提高了代码的复用性。
2.使类与类之间产生了关系,有了这个关系,才有了多态的特性。
10、final关键字有什么作用。
答:是一个修饰符,代表“最终”的意思。
1. 被final修饰的类不能被继承。
2. 被final修饰的方法不能被复写。
3. 被final修饰的变量是一个常量,只能被赋值一次。既可以修饰成员变量,也可以修饰局部变量。
4. 常量的作用在于方便理解和阅读,所有字母都大写,单词之间通过“_”连接。
5. 内部类定义在类中的局部位置上时,只能访问该局部被final修饰的局部变量。
11、什么是模板方法模式?
答:在定义功能时,功能的一部分是确定的,但有一部分是不确定的,而确定的部分在使用不确定的部分,那么这时就将不确定的部分暴露出去,有该类的子类去实现,这就是模板方法模式。
12、接口的定义、成员修饰符、以及意义?
答:接口用interface关键字定义,他的成员修饰符是固定的:
成员常量:public static final
成员函数:public abstract
接口的特点:
1. 接口是对外暴露的规则。
2. 接口是程序的功能扩展。
3. 接口可以用来多实现。
4. 类与接口直接是实现关系,而类在继承一个类的同时可以同时实现多个接口。
5. 接口与接口直接可以有继承关系。
13、创建线程有几种方法?有什么区别?
答:线程的创建有两种方法,一种是继承Thread类,并复写run方法,最后用start()调用。第二种是实现Runnable接口,覆盖Runnable接口中的run方法,通过Thread建立线程对象,将Runnable的子类对象赋给Thread的构造函数,最后通过start调用。
这两种方式一个是继承,一个是实现,继承Thread时,线程运行代码放在Thread的run方法中,实现Runnable时,线程运行代码放在Runnable的run方法中。
另外,采用实现Runnable接口时,可以很好的避免单继承的局限性,所以建议使用实现的方式创建线程。
14、如果同步函数被静态修饰,使用的锁是什么?
答:首先,静态同步函数的锁不是this,因为静态方法中没有this。静态进内存时,内存中没有本类对象,但是一定有该类对应的字节码文件对象,所以使用的锁是该方法所在类的字节码文件对象:类名.class。
15、单例设计模式有哪几种?有什么区别?
答:单例设计模式分为饿汉式和懒汉式,饿汉式是在创建对象的同时加载,而懒汉式是先定义一个引用,延时加载。
16、懒汉式的延时加载有没有问题?如何解决?
答:有,多线程访问时会出现安全问题,可以通过加同步代码块或同步函数来解决,不过建议使用同步代码块,因为使用同步时效率很低,使用同步代码块可以用双重判断提高效率。
17、如果使用同步代码块,那么使用的锁是哪一个?
答:是方法所属类的字节码文件对象。
18、为什么操作线程的方法都定义在Object类中?
答:因为这些方法在操作线程时,都必须要标识他们特有的锁,只有同一个锁上等待的线程可以被同一个锁上的notify唤醒,而锁可以是任意对象,所以可以被任意对象调用的方法只有定义在Object类中。
19、如何让线程停止?
答:让线程停止只有等run方法结束,开启多线程时,运行代码一般都是循环结构,只要控制住循环,就可以让run方法结束,也就是让线程结束。
当然,也有特殊情况,那就是如果线程处于冻结状态中,无法读到控制循环的标记,那么这个线程就不会结束。
当没有指定的方式让被冻结的线程回复到运行状态时,这时需要对冻结进行清除,强制让线程恢复到运行状态中来,这样就可以操作标记让线程结束。
清除冻结可以使用Thread类提供的interrupt方法。
20、什么是守护线程?
在Thread类中提供了setDeamon方法,该方法可以将某线程标为守护线程或用户线程,该方法需要在启动前被调用。在线程运行过程中,若线程池中剩余的都是守护线程,则程序结束。
21、什么是join?
答:join是Thread类中提供的方法,当A线程执行到B线程调用的jion方法时,A线程会等待,等到B线程执行完毕后再继续执行。
join方法可以用来临时加入线程执行。
22、如何设置线程优先级?
答:可以使用Thread类中的setPriority方法设置优先级。
23、yield方法有什么作用?
答:暂停当前执行的线程对象,并执行其他线程。
24、s1和s2有什么区别?
String s1 = “abc”;
String s2= newString(“abc”);
答:s1在内存中只有一个对象,而s2在内存中有两个对象。