这部分的知识,由于比较杂,没有进行分类
链接1
链接2
Static方法:
可以不用创建对象就可以使用static方法,如果不用Static修饰,普通的方法需要创建对象才能使用方法。 Static修饰的方法,是不能访问非静态成员方法 / 变量的;但是,在非静态成员方法里面可以访问静态成员方法 / 变量。 Static变量:(可节约部分变量的内存)
可以被所有类创建的对象所共享,在实际的内存中只有一个副本,并且仅在类初次加载时被初始化。非静态变量,在每次加载对象时候,产生一次副本,且各个副本互相不影响。
2. Java访问权限?
链接
修饰符 同一个包 不同的包 类的位置 同一个类内部 不同类 子类 不是子类 private Yes defaule Yes Yes protected Yes Yes Yes public Yes Yes Yes Yes
权限的顺序: private > default > protected > public
3. Java 中是否可以重写一个 private 或者 static 方法?
链接
static方法:不能,因为static是静态绑定的,而方法重写(覆盖)是基于动态绑定的。 private方法:不能,因为private的作用范围是当前类,不能被其他类访问,所以不能被重写。
4. 构造方法有哪些特性?
1.名字与类相同 2.没有返回值,但是不能用void修饰构造函数 3.生成类的对象时,自动调用构造函数,无需调用。
备注:如果一个类没有声明构造函数,也会有默认的无参构造函数。构造函数可以进行重载,并且在代码中是一种常用的手段。
5. 在 Java 中定义一个不做事且没有参数的构造方法有什么作用?
链接
父类中如果没有定义构造方法,会自动调用默认的无参数的构造方法,防止出错。如果这个时候没有构造函数的话,生成对象就会出错。 父类中如果有构造方法,则默认的无参构造方法将不存在。如果需要无参构造方法,则需要在父类中手动定义一个无参构造方法。
链接
final关键字修饰类
被final修饰的类是最终类,意思就是不能有子类。(“太监类”,“断子绝孙类”) final关键字修饰方法
被final修饰的方法是最终方法,子类可以继承使用,但是不能修改。 final修饰变量
被final修饰的变量是常量,一旦赋值,不可能被修改,而且必须在初始化对象的时候赋值。 成员变量:final修饰的成员变量必须在声明的时候初始化或者在构造器中初始化,否则就会编译报错。 局部变量:final修饰的局部变量必须在声明的时候赋值,如果不赋值,虽然在声明的时候不出错,但是在编译的时候会报错。 方法参数:如果使用final修饰方法的形参,在方法中是不能改变该参数的。
7. 静态变量和实例变量(成员变量)的区别?
链接
静态变量不属于某个实例而是属于类,所以也称为类变量,只要程序加载了类,静态变量就会被分配内存空间;实例变量只能通过创建对象才能被分配空间。总之,实例变量必须创建对象后才可以使用,静态变量可以直接使用类名来使用。
8. short s1 = 1;s1 = s1 + 1;有什么错?那么 short s1 = 1; s1 += 1;呢?有没有错误??
链接
short s1 = 1;s1 = s1 + 1;
short s1 = 1; s1 += 1;
正确,执行 s1 += 1;
实际上是(short)s1 = s1 + 1;
9. Integer 和 int 的区别?
链接
1.Integer是一种包装类,int是Java的一种数据类型 2.Integer必须在实例化后才能使用,而int变量不需要 3.Integer实际是对象的引用,而int则是直接存储的数据值 4.Integer的默认值是null,int的默认值是0
10. 装箱和拆箱的区别?
链接
Java是一种面向对象的语言,但是他不是纯粹的面向对象的语言。Java中存在基本数据类型,谈不上对象。为了向纯面向对象靠拢,Java5的时候退出了基本数据类型的包装类型。 装箱就是将基本数据类型转化为包装类型,拆箱就是将包装类型转化为基本数据类型。 Integer的Integer.valueOf(int i)
方法可以实现自动装箱;而Integer的intValue()
方法可以实现自动拆箱
package day1119 ;
public class TestBox {
public static void main ( String [ ] args) {
Integer a = 1 ;
int b = a;
}
}
11. switch 语句能否作用在 byte 上,能否作用在 long 上,能否作用在 String 上?
switch只能使用int类型或者枚举类型,而byte char short可以隐式的转换为int类型,所以byte char short可以在switch中使用;而long的范围比int大,不能隐式的转换为int,所以不能在switch中使用;String不符合语法规则,不能使用。 但是新版本的JDK1.7中引入新特性,所以switch语句可以接收String类型。
12. final、finally、finalize?
链接
final用于声明属性、方法和类,分别表示属性不可变、方法不可覆盖、类不可被继承(不能派生出新的子类)。
初始化:被final修饰的变量一定要初始化。
1.在定义的时候初始化; 2.final成员变量可以在初始化快中初始化,但不可以在静态初始化快中初始化; 3.静态final成员变量可以在静态初始化快中初始化; 4.在类的构造器中初始化,但是静态final成员变量不可以在构造方法中初始化。 finally作为异常处理的一部分,他只能用在try/catch语句中,并且还附带着一个语句块,表示这段语句最终一定被执行,经常用在需要释放资源的情况下。 finalize是object类的一个方法,可以利用此方法来实现资源的回收。
13. == 和 equals 的区别?
链接
equals()是超类Object中的方法;==是操作符。 比较对象的不同:
1.equals()比较的是两个对象 2.==比较的是两个数据类型 运行速度的不同:
1.方法eqals()的速度没有==运行速度快 2.==的速度快,因为只是比较引用
14. 两个对象的 hashCode() 相同,则 equals() 也一定为 true 吗?
链接
15. 为什么重写 equals() 就一定要重写 hashCode() 方法?
首先,s1.equals(s2)
在两个对象内容是一样的情况下一定相等。 如果有两个对象,则有两个地址;默认的hashcode()
是根据内存地址经hash算法得到的,两个地址不一样,所以会有可能产生两个不一样的hashcode()
。而根据hashcode()
的规定:两个对象相等,hashcode()
一定相等。这就产生了矛盾。 所以需要将hashcode()
的内存关联算法改成属性关联算法,这样经过重写后的hashcode()
在两个对象相等的情况下,所得到的hashcode才能是一样的。
以下是hashcode()
的一些规定:
两个对象相等,hashcode()
一定相等; 两个对象不等,hashcode()
不一定不等; hashcode()
相等,两个对象不一定相等;hashcode()
不等,两个对象一定不等;
16. & 和 && 的区别?
链接
&
是按位与,二进制知识。&&
是逻辑与,具备短路功能。只要第一个表达式为false,将不再看第二个表达式。
17. Java 中的参数传递时传值呢?还是传引用?
链接
java中只有值传递,这个值是实际对象的引用。java的求值策略,按照参数严格意义上叫做按共享传递。
18. Java 中的 Math.round(-1.5) 等于多少?
链接
ceil的意思是天花板,向上取整 floor的意思是地板,向下取整 round的意思是四舍五入,即将原来的数加上0.5后再向下取整。math.ceil(x) = math.floor(x+0.5)
Math.round(-1.5) = math.floor(-1.5+0.5)
19. Java 中如何实现对象的克隆?
链接1(包含其他面试问题及答案) 链接2
实现cloneable接口,重写clone方法
但是这种方法是浅克隆(复制),只是复制变量的引用,并没有开辟另一块空间。 采用递归调用clone和采用序列化对象实现深克隆
20. 什么是 Java 的序列化,如何实现 Java 的序列化?
链接
序列化是指将Java对象转换为字节序列的过程;而反序列化则是将字节序列转换为Java对象的过程。 通过serializable接口的实现可以将对象转换为一个字节序列;
21. 什么情况下需要序列化?
当你想把内存中的对象保存到一个文件中或者数据库中的时候 当你想用套接字在网络上传送对象的时候 当你想通过RMI传输对象的时候
22. Java 的泛型是如何工作的 ?
链接
泛型就是参数化类型,当成一个参数传递给一个类或者是方法。 泛型的定义和使用:
泛型类:
只要在对泛型类创建对象的时候,在尖括号中赋值相应的类型便是。T就会被替换成对应的类型。泛型不仅仅可以接收一个类型参数,还可以接收多个类型参数。 泛型方法:
泛型方法和泛型类稍有不同的是,类型参数也就是尖括号的那部分是写在返回类型前面的。被称为类型参数,而方法中的T被称为参数化类型,它不是运行时的真正的参数。泛型类如果和泛型方法都有泛型,他们的各自的泛型是没有相互联系的,泛型方法始终以自己定义的类型参数为准,两者不相干。 泛型接口和泛型类是差不多的 泛型的值得注意的地方:
泛型类或者泛型方法中,不接受8种基本数据类型 泛型不能创建具体类型的泛型数组 (类型擦除带来的影响)
23. 什么是泛型中的限定通配符和非限定通配符 ?
链接
在现实编码中,希望泛型可以处理某一范围的数据类型(比如:某个类和它的子类),由此产生通配符的概念。通配符的出现是为指定泛型中的类型范围。 无限定通配符>
:
无限定通配符删减了增加具体类型的能力,只保留了与具体功能无关的功能。个人认为,这样提高了代码的可读性,快速推断出源代码作者的意图。 有上限的通配符<?extends T>
:
有下限的通配符 super T>
24. 什么是类型擦除 ?
链接
泛型信息只存在于代码编译阶段,在进入JVM之前,与泛型相关的信息会被擦除,专业术语叫做类型擦消。(关键字:反射)
25. 什么时候用 assert
链接