前言:第二天打卡,闪过一丝丝放弃的念头,但是今天的知识点非常简单常见,看来至少能坚持两天咯!开始研究今天的内容想买本java虚拟机有关的书了,还想买本maven的书,因为昨天慕课网的spingboot小项目的报错我还没找到原因(找到了,拼写错误,但是检查的过程需要对maven,spring熟练才行)。
一、int 和 Integer 有什么区别
(参考链接写的很好,以下内容为直接复制加补充)
Java是面向对象的编程语言,一切都是对象,但是为了编程的方便还是引入了基本数据类型,为了能够将这些基本数据类型当成对象操作,Java为每一个基本数据类型都引入了对应的包装类型(wrapper class),int的包装类就是Integer,从Java 5开始引入了自动装箱/拆箱机制,使得二者可以相互转换,对应如下:
原始类型:boolean,char,byte,short,int,long,float,double
包装类型:Boolean,Character,Byte,Short,Integer,Long,Float,Double
顺便一提,Java中的基本数据类型只有以上8个,除了基本类型(primitive type),剩下的都是引用类型(reference type)。
所以最基本的一点区别是:Ingeter是int的包装类,int的初值为0,Ingeter的初值为null。除此之外还有区别,请看代码: public class TestInteger {
public static void main(String[] args) {
int i = 128;
Integer i2 = 128;
Integer i3 = new Integer(128);
System.out.println(i == i2); //Integer会自动拆箱为int,所以为true
System.out.println(i == i3); //true,理由同上
System.out.println(i2 == i3);//false 无论如何,Integer与new Integer不会相等。不会经历拆箱过程,new出来的对象存放在堆,而非new的Integer常量则在常量池(在方法区),他们的内存地址不一样,所以为false。
Integer i4 = 127;//编译时被翻译成:Integer i4 = Integer.valueOf(127);
Integer i5 = 127;
System.out.println(i4 == i5);//true
Integer i6 = 128;
Integer i7 = 128;
System.out.println(i6 == i7);//false
Integer i8 = new Integer(127);
System.out.println(i5 == i8); //false
Integer i9 = new Integer(128);
Integer i10 = new Integer(123);
System.out.println(i9 == i10); //false
}
}
复制代码
为什么i4和i5比是true,而i6和i7比是false呢?关键就是看valueOf()函数了,这个函数对于-128到127之间的数,会进行缓存, Integer i5 = 127时,会将127进行缓存,下次再写Integer i6 = 127时,就会直接从缓存中取,就不会new了。所以i4和i5比是true,而i6和i7比是false。
而对于后边的i5和i8,以及i9和i10,因为对象不一样,所以为false。
以上的情况总结如下:
1,无论如何,Integer与new Integer不会相等。不会经历拆箱过程,new出来的对象存放在堆,而非new的Integer常量则在常量池(在方法区),他们的内存地址不一样,所以为false。(提到堆和方法区,此处插一个jvm内存模型扩展)
2,两个都是非new出来的Integer,如果数在-128到127之间,则是true,否则为false。因为java在编译Integer i2 = 128的时候,被翻译成:Integer i2 = Integer.valueOf(128);而valueOf()函数会对-128到127之间的数进行缓存。
3,两个都是new出来的,都为false。还是内存地址不一样。
4,int和Integer(无论new否)比,都为true,因为会把Integer自动拆箱为int再去比。
参考链接:
二、重载和重写的区别
(这里的答案很凑巧在昨天的文章Java面试通关要点汇总集答案(一)——面向对象的特征 final, finally, finalize 的区别里提过了,在final关键字修饰方法的时候提的,回顾一下,final修饰的方法不能重写可以重载)
重写(override)
override是重写(覆盖)了一个方法,以实现不同的功能。一般是用于子类在继承父类时,重写(重新实现)父类中的方法。
重写(覆盖)的规则:
- 重写方法的参数列表必须完全与被重写的方法的相同,否则不能称其为重写而是重载.
- 重写方法的访问修饰符一定要大于被重写方法的访问修饰符(public>protected>default>private)。
- 重写的方法的返回值必须和被重写的方法的返回一致;
- 重写的方法所抛出的异常必须和被重写方法的所抛出的异常一致,或者是其子类;
- 被重写的方法不能为private,否则在其子类中只是新定义了一个方法,并没有对其进行重写。
- 静态方法不能被重写为非静态的方法(会编译出错)。
总结:重写(两同两小一大):不同类中,子类继承extends父类,子类包含与父类同名的方法。方法名相同、形参列表相同;子类方法返回值比父类的小或者相等;子类方法的访问权限比父类方法的大)
重载(overload)
- 方法重载是让类以统一的方式处理不同类型数据的一种手段。多个同名函数同时存在,具有不同的参数个数/类型。重载是一个类中多态性的一种表现。
- Java的方法重载,就是在类中可以创建多个方法,它们具有相同的名字,但具有不同的参数和不同的定义。调用方法时通过传递给它们的不同参数个数和参数类型给它们的不同参数个数和参数类型给它们的不同参数个数和参数类型来决定具体使用哪个方法, 这就是多态性。
- 重载的时候,方法名要一样,但是参数类型和个数不一样,返回值类型可以相同也可以不相同。无法以返回型别作为重载函数的区分标准。
参考链接:
-over