面试知识点杂项

1-什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”?

Java虚拟机是一个可以执行Java字节码的虚拟机进程。Java源文件被编译成能被Java虚拟机执行的字节码文件。java所谓的跨平台就是在不同平台上安装了不同的jvm,而在不同平台上生成的.class文件都是一样的,而.class文件再由对应平台的jvm解释成对应平台的机器码执行。

Java中static方法不能被覆盖,因为方法覆盖是基于运行时动态绑定的,而static方法是编译时静态绑定的。static方法跟类的任何实例都不相关

2-是否可以在static环境中访问非static变量?

静态的成员属于类,随着类的加载而加载到静态方法区内存,当类加载时,此时不一定有实例创建,没有实例,就不可以访问非静态的成员

3-Java中的方法覆盖即重写(Overriding)和方法重载(Overload)是什么意思?

Java中的方法重载发生在同一个类里面两个或者是多个方法的方法名相同但是参数不同的情况。与此相对,方法覆盖是说子类重新定义了父类的方法。方法覆盖必须有相同的方法名,参数列表和返回类型。

  1. 重写是发生在运行时的,因为编译期编译器不知道并且没办法确定该去调用哪个方法,JVM会在代码运行的时候作出决定。
  2. 重载是发生在编译时的,因为编译器可以根据参数的类型来选择使用哪个方法。

4-重写和重载的不同:

  1. 方法重写要求参数列表必须一致,而方法重载要求参数列表必须不一致。
  2. 方法重写要求返回类型必须一致(或为其子类型),方法重载对此没有要求。
  3. 方法重写只能用于子类重写父类的方法,方法重载用于同一个类中的所有方法。
  4. 方法重写对方法的访问权限和抛出的异常有特殊的要求,而方法重载在这方面没有任何限制。
  5. 父类的一个方法只能被子类重写一次,而一个方法可以在所有的类中可以被重载多次。
  6. 重载是编译时多态,重写是运行时多态。

5-Java支持多继承么?

Java中类不支持多继承,只支持单继承(即一个类只有一个父类)。 但是java中的接口支持多继承,,即一个子接口可以有多个父接口。(接口的作用是用来扩展对象的功能,一个子接口继承多个父接口,说明子接口扩展了多个功能,当类实现接口时,类就扩展了相应的功能)。

6-接口

从设计层面来说,抽象是对类的抽象,是一种模板设计,接口是行为的抽象,是一种行为的规范。

接口声明的成员变量,只能是常量。默认修饰符 public static final

而如下截图中的People接口中,定义成员变量报错:

  

推荐:永远手动给出修饰符。

//所以接口定义属性可以这么写:public interface People {

    int age=10;

    String name="输出名字";//接口里面定义的成员变量都是  public static final修饰

    public void eat();  //注意:要给出初始值

}

7-什么是值传递和引用传递?

值传递是对基本型变量而言的,传递的是该变量的一个副本,改变副本不影响原变量.

引用传递一般是对于对象型变量而言的,传递的是该对象地址的一个副本, 并不是原对象本身 。

一般认为,java内的基础类型数据传递都是值传递. java中实例对象的传递是引用传递


public void add(int a) { int b = a; } 这个可以看作是值传递,a是基本数据类型,他把他的值传给了b public void add(Object obj) { Object objTest = obj; } 这个可以看作是址传递,obj是引用数据类型,是把他栈中指向堆中的对象的地址值赋值给了objTest. 这时候就同时有两个引用指向了堆中的某个Object对象 其实这样看来,java应该只有值传递的。如果是基本数据类型,传递的就是实际的值. 如果是引用数据类型,传递的就是该引用的地址值.

8-进程和线程的区别是什么?

进程是运行中的程序,线程是进程的内部的一个执行序列

进程是资源分配的单元,线程是执行行单元

进程间切换代价大,线程间切换代价小

进程拥有资源多,线程拥有资源少

多个线程共享进程的资源

例如:

开个QQ,开了一个进程;开了迅雷,开了一个进程。

在QQ的这个进程里,传输文字开一个线程、传输语音开了一个线程、弹出对话框又开了一个线程。

所以运行某个软件,相当于开了一个进程。在这个软件运行的过程里(在这个进程里),多个工作支撑的完成QQ

的运行,那么这“多个工作”分别有一个线程。

所以一个进程管着多个线程。

9-创建线程有几种不同的方式?你喜欢哪一种?为什么?

①继承Thread类(真正意义上的线程类),是Runnable接口的实现。

②实现Runnable接口,并重写里面的run方法。

③使用Executor框架创建线程池。Executor框架是juc里提供的线程池的实现。

调用线程的start():启动此线程;调用相应的run()方法

一般情况下,常用的是实现Runnable接口的方法。

* Runnable接口有如下好处:

*①避免点继承的局限,一个类可以继承多个接口。

*②适合于资源的共享

10-线程的几种可用状态

1. 新建( new ):新创建了一个线程对象。

2. 可运行( runnable ):线程对象创建后,其他线程(比如 main 线程)调用了该对象 的 start ()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获 取 cpu 的使用权 。

3. 运行( running ):可运行状态( runnable )的线程获得了 cpu 时间片( timeslice ) ,执行程序代码。

4. 阻塞( block ):阻塞状态是指线程因为某种原因放弃了 cpu 使用权,也即让出了 cpu timeslice ,暂时停止运行。直到线程进入可运行( runnable )状态,才有 机会再次获得 cpu timeslice 转到运行( running )状态。阻塞的情况分三种:

(一). 等待阻塞:运行( running )的线程执行 o . wait ()方法, JVM 会把该线程放 入等待队列( waitting queue )中。

(二). 同步阻塞:运行( running )的线程在获取对象的同步锁时,若该同步锁 被别的线程占用,则 JVM 会把该线程放入锁池( lock pool )中。

(三). 其他阻塞: 运行( running )的线程执行 Thread . sleep ( long ms )或 t . join ()方法,或者发出了 I / O 请求时, JVM 会把该线程置为阻塞状态。            当 sleep ()状态超时、 join ()等待线程终止或者超时、或者 I / O 处理完毕时,线程重新转入可运行( runnable )状态。

5. 死亡( dead ):线程 run ()、 main () 方法执行结束,或者因异常退出了 run ()方法,则该线程结束生命周期。死亡的线程不可再次复生。

11-什么是死锁(deadlock)?

面试时就说你录用我我就告诉你什么是死锁,对面说你告诉我我再录用你

(1) 互斥条件:一个资源每次只能被一个进程使用。

(2) 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。

(3) 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。

(4) 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。

这四个条件是死锁的必要条件,只要系统发生死锁,这些条件必然成立,而只要上述条件之一不满足,就不会发生死锁。

死锁的解除与预防:

理解了死锁的原因,尤其是产生死锁的四个必要条件,就可以最大可能地避免、预防和解除死锁。所以,在系统设计、进程调度等方面注意如何不让这四个必要条件成立,如何确定资源的合理分配算法,避免进程永久占据系统资源。

此外,也要防止进程在处于等待状态的情况下占用资源。因此,对资源的分配要给予合理的规划。

使用多线程的时候,一种非常简单的避免死锁的方式就是:指定获取锁的顺序,并强制线程按照指定的顺序获取锁。因此,如果所有的线程都是以同样的顺序加锁和释放锁,就不会出现死锁了。

(其中最简单的就是破环循环等待条件。按同一顺序访问对象,加载锁,释放锁。)

12-Java集合类框架的基本接口

Collection:代表一组对象,每一个对象都是它的子元素。
Set:不包含重复元素的Collection。
List:有顺序的collection,并且可以包含重复元素。
Map:可以把键(key)映射到值(value)的对象,键不能重复。

13、位运算符(&、|、^、~等)

按位与运算符(&):两位同时为“1”,结果才为“1”,否则为0

按位或运算符(|) :参加运算的两个对象只要有一个为1,其值为1。

异或运算符(^)    :参加运算的两个对象,如果两个相应位为“异”(值不同),则该位结果为1,否则为0。

取反运算符(~)    :参加运算的一个数据,按二进制位进行“取反”运算。

左移运算符(<<)  :将一个运算对象的各二进制位全部左移若干位(左边的二进制位丢弃,右边补0)。

右移运算符(>>)  :将一个数的各二进制位全部右移若干位,正数左补0,负数左补1,右边丢弃。

杂项:

基本数据类型:

整数值型:byte,short,int,long,

字符型:char

浮点类型:float,double

布尔型:boolean

整数默认int型,小数默认是double型。Float和long类型的必须加后缀

首先知道String是引用类型不是基本类型,引用类型声明的变量是指该变量在内存中实际存储的是一个引用地址,实体在堆中。引用类型包括类、接口、数组等。String类还是final修饰的。(JVM中虚拟栈中存的是对象的地址)

 而包装类就属于引用类型,自动装箱和拆箱就是基本类型和引用类型之间的转换,至于为什么要转换,因为基本类型转换为引用类型后,就可以new对象,从而调用包装类中封装好的方法进行基本类型之间的转换或者toString(当然用类名直接调用也可以,便于一眼看出该方法是静态的),还有就是如果集合中想存放基本类型,泛型的限定类型只能是对应的包装类型。

发布了25 篇原创文章 · 获赞 6 · 访问量 7553

猜你喜欢

转载自blog.csdn.net/B_G_boy/article/details/102563020
今日推荐