1.讲述一下GC:
参考答案:
JAVA GC(Garbage Collection,垃圾回收)机制是区别C++的一个重要特征,C++需要开发者自己实现垃圾回收的逻辑,而JAVA开发者则只需要专注于业务开发,因为垃圾回收这件繁琐的事情JVM已经为我们代劳。根据JVM规范,JVM把内存划分成了如下几个区域:
- 方法区(Method Area)
- 堆区(Heap)
- 虚拟机栈(VM Stack)
- 本地方法栈(Native Method Stack)
- 程序计数器(Program Counter Register),其中只有方法区和堆区需要进行垃圾回收,回收的对象就是那些不存在任何引用的对象。
2.说一说三种循环的使用场合
参考答案:
-
for循环必须已知循环次数,所以只能用在次数确定的场合,比如一定数量的数字累加操作等;
-
while和do-while必须知道循环条件,不必要知道次数,所以当条件已知,次数不确定的循环场合可以使用while或do-while。
-
那具体使用哪一种,要看循环条件是不需要执行就已确定的条件,还是需要执行一次后才可以知道的条件。前者使用while,后者两种都可以,一般使用do-while更加符合后者场景。
3.for和while的区别:
参考答案:
-
循环的结构不同for循环的表达式为:
for(单次表达式;条件表达式;末尾循环体){中间循环体;}。
while循环的表达式为:while(表达式){循环体}。 -
执行条件的判断方式不同for循环执行末尾循环体后将再次进行条件判断,若条件还成立,则继续重复上述循环,当条件不成立时则跳出当下for循环。while循环当满足条件时进入循环,进入循环后,当条件不满足时,执行完循环体内全部语句后再跳出(而不是立即跳出循环)。
-
使用的目的不同for循环的目的是为了限制循环体的执行次数,使结果更精确。while循环的目的是为了反复执行语句或代码块。
-
语法不同for循环的语法为:
for (变量 = 开始值;变量 <= 结束值;变量 = 变量 + 步进值) {需执行的代码 }。
while循环的语法为:while (<条件>) {需执行的代码 }。
4.说一说使用switch要注意什么?
参考答案:
- switch有两个参数:()中必须使用变量,类型必须是String、byte、short、int、char、枚举中的某一种类型,不能是long 类型。case后面跟着的必须是常量;
- switch仅适用于等值判断场合,发生区间判断的场合仅能使用if-else if-else方式。
- switch中的break一般不能省略,省略后会发生case穿透,导致两个case中的代码同时进行,仅适用于确定想让多个case执行相同语句,或多个case的执行代码互相包含时才会选择性省略case,如月份日期的输出、文件更新补丁包的覆盖等等。
- default语句一般可以省略,适合需要对确定分支之外的所有情况进行判定时使用。5.前面case定义的变量在后面的case中会发生同名冲突现象,解决方案:将每个case都封装成各自的方法或者单独加上大括号表示分隔。
5.数组有没有 length()方法?String 有没有 length()方法?
参考答案:
数组没有 length()方法,有 length 的属性。String 有 length()方法。JavaScript 中,获得字符串的长度是通过length 属性得到的,这一点容易和 Java 混淆。
6.驼峰命名法中,类、方法、变量、常量该如何命名?
参考答案:
骆驼式命名法(Camel-Case)又称驼峰式命名法,是电脑程式编写时的一套命名规则(惯例)。正如它的名称CamelCase所表示的那样,是指混合使用大小写字母来构成变量和函数的名字。程序员们为了自己的代码能更容易的在同行之间交流,所以多采取统一的可读性比较好的命名方式。
- 类:类使用大驼峰命名,即第一个字母也大写,其他单词首字母也大写;
- 变量&方法:变量和方法一般用小驼峰法标识。驼峰法的意思是:除第一个单词之外,其他单词首字母大写。譬如int myStudentCount;
- 常量:常量全字母大写,单词之间使用下划线链接。
7.面向对象封装的理解?
参考答案:
- 什么是封装:封装就是把类中的属性给上不同的访问权限,不允许外界随意修改
- 为什么封装:保护类中的数据不被破坏。
- 怎么封装:把类中的属性用不同的访问修饰符修饰,给外界提供可以操作的方法
8.关键字static用法?
参考答案:
static修饰成员方法不能访问类的非静态成员变量和非静态成员方法,static修饰成员变量被所有对象共享,在内存中只有一个副本,它当且仅当在类初次加载时会被初始化,static修饰代码块类初次被加载的时候,会按照static块的顺序来依次执行每个static块,并且只会执行一次。
9.讲解一下Java中4种权限修饰符及其作用范围。
参考答案:
private(私有的)
private可以修饰成员变量,成员方法,构造方法,不能修饰类(此刻指的是外部类,内部类不加以考虑)。被private修饰的成员只能在其修饰的本类中访问,在其他类中不能调用(这里也可以看出为什么不能修饰class,因为private本来就是作用于类内部的东西),但是被private修饰的成员可以通过set和get方法向外界提供访问方式
default(默认的)
default即不写任何关键字,它可以修饰类,成员变量,成员方法,构造方法。被默认权限修饰后,其只能被本类以及同包下的其他类访问。
protected(受保护的)
protected可以修饰成员变量,成员方法,构造方法,但不能修饰类(此处指的是外部类,内部类不加以考虑)。被protected修饰后,只能被同包下的其他类访问。如果不同包下的类要访问被protected修饰的成员,这个类必须是其子类
public(公共的)
public是权限最大的修饰符,他可以修饰类,成员变量,成员方法,构造方法。被public修饰后,可以再任何一个类中,不管同不同包,任意使用。
10.说说&和&&的区别?
参考答案:
- &和&&都可以用作逻辑与的运算符,表示逻辑与(and),当运算符两边的表达式的结果都为 true 时,整 个运算结果才为 true,否则,只要有一方为 false,则结果为 false。
- &&还具有短路的功能,即如果第一个表达式为 false,则不再计算第二个表达式,例如,对于 if(str!=null &&!str.equals(“”))表达式,当 str 为 null 时,后面的表达式不会执行,所以不会出现 NullPointerException 如果将 &&改为&,则会抛出 NullPointerException 异常。If(x33&++y>0)y 会增长,If(x33&&++y>0)不会增长
- &还可以用作位运算符,当&操作符两边的表达式不是 boolean 类型时,&表示按位与操作,我们通常使用 0x0f 来与一个整数进行&运算,来获取该整数的最低 4 个 bit 位,例如,0x31&0x0f 的结果为 0x01。
11.多态的两种表现是什么?
参考答案:
多态可以分为两种:设计时多态和运行时多态。
- 设计时多态:即重载,是指Java允许方法名相同而参数不同(返回值可以相同也可以不相同)。
- 运行时多态:即重写,是指Java运行根据调用该方法的类型决定调用哪个方法。多态目的:增加代码的灵活度。
12.请判断,两个对象值相同(x.equals(y) == true),但却可有不同的hash code,该说法是否正确,为什么?
参考答案:
不对,如果两个对象x和y满足x.equals(y) == true,它们的哈希码(hash code)应当相同。Java对于eqauls方法和hashCode方法是这样规定的:
- 如果两个对象相同(equals方法返回true),那么它们的hashCode值一定要相同;
- 如果两个对象的hashCode相同,它们并不一定相同。当然,你未必要按照要求去做,但是如果你违背了上述原则就会发现在使用容器时,相同的对象可以出现在Set集合中,同时增加新元素的效率会大大下降(对于使用哈希存储的系统,如果哈希码频繁的冲突将会造成存取性能急剧下降)。
13.是否可以从一个 static 方法内部发出对非 static 方法的调用?
参考答案:
不可以。因为非 static 方法是要与对象关联在一起的,必须创建一个对象后,才可以在该对象上进行方法调 用,而 static 方法调用时不需要创建对象,可以直接调用。也就是说,当一个 static 方法被调用时,可能还没有 创建任何实例对象,如果从一个 static 方法中发出对非 static 方法的调用,那个非 static 方法是关联到哪个对象上 的呢?这个逻辑无法成立,所以,一个 static 方法内部不可以发出对非 static 方法的调用。
14.重载与重写的区别?
重载
- 重载Overload是一个类中多态性的一种表现
- 重载要求同名方法的参数列表不同(参数类型,参数个数甚至是参数顺序)
- 重载的时候,返回值类型可以相同也可以不相同。无法以返回型别作为重载函数的区分标准
重写
- 发生在父类与子类之间
- 方法名,参数列表,返回类型(除过子类中方法的返回类型是父类中返回类型的子类)必须相同
- 访问修饰符的限制一定要不小于被重写方法的访问修饰符(public>protected>default>private)
- 重写方法一定不能抛出新的检查异常或者比被重写方法申明更加宽泛的检查型异常区别 方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性,而后者实现的是运行时的多态性。重载发生在一个类中,同名的方法如果有不同的参数列表(参数类型不同、参数个数不同或者二者都不同)则视为重载;重写发生在子类与父类之间,重写要求子类被重写方法与父类被重写方法有相同的参数列表,有兼容的返回类型,比父类被重写方法更好访问,不能比父类被重写方法声明更多的异常。重载对返回类型没有特殊的要求,不能根据返回类型进行区分。