Java概念总结(一)【面向对象--多线程】

来源:互联网 发布:知乎 比逗 编辑:程序博客网 时间:2024/05/16 00:53

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在内存中有两个对象。