----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------
通过在黑马论坛上回答问题的同时,我也对以前的知识进行了更进一步的巩固,然后总结的几个常见问题;
还有一部分没有提到,请看我的其他blog,所以这里我就直接省略了。
一.“==”和“equals”的用法区别?
由于java的数据类型分为基本数据类型和引用数据类型,对于“==”和“equals”的比较可以理解成事数据的比较!
基本数据类型是存储在内存中的栈中,而引用类型的变量在栈中仅仅是存储引用类型变量的地址,而其本身则存储在堆中。
equals是比较对象的内容,它是个方法,继承自Object类,可以被用户覆盖。
==是个关系运算符,当被比较者是基本类型时,比较其值是否相等;当被比较者是引用类型时,比较其是否引用同一个对象(或者说比较其是否指向同一个内存地址)。
这里需要注意的是:
1.在jdk1.5以上版本,值类型和引用类型可以自动转化,实例如下:
Integer a = new Integer(100);
int b=100;
其中:System.out.println(a==b); false,它们是不同的数据类型,但是在jdk1.5以上版本中为true,基本类型和封装类能自动转化。
2.字符串常量池,示例如下:
String s1="ABC";
String s2="ABC";
其中,System.out.println(s1==s2); 打印结果是 true,s1和s2都放在字符串缓冲池里,并且引用同一个对象。
3.A.equals(B),因为equals比较的是两个对象,所以A,B都不能为基本数据类型,否则会出编译错误。(jdk1.5以上版本中,B可以为基本数据类型,A不可以)
二,重载和重写的有哪些区别?
重载方法要满足:
1.方法名相同
2.方法的参数类型、个数、顺序至少有一项不相同
3.方法的返回类型可以不相同
4.方法的修士符可以不相同
重写方法要满足:
1.方法名相同。
2.参数列表必须完全相同。
3.返回的类型必须相同。
4.访问修饰符的限制一定要大于被重写方法的访问修饰符(public>protected>default>private)
5.重写方法一定不能抛出新的检查异常或者比被重写方法申明更加宽泛的检查型异常.例如, 父类的一个方法申明了一个检查异常IOException,在重写这个方法是就不能抛出Exception,只能抛出IOException的子类异常,可以抛出非检查异常
三.堆和栈的区别?
Java的堆是一个运行时数据区,在运行时进行动态内存分配,它分配的区域主要通过new关键字来实现,可以动态地分配内存大小,对应不再使用的数据,jvm可以通过垃圾回收机制进行回收。它的数据结构是一种链表的形式,所以对于堆中的内容进行新增、修改和删除相对与栈中的数据快,但是由于链表形式,所以读取数据需要遍历,所以没有栈形式的数据读取快;由于要在运行时动态分配内存,存取速度较慢。而堆中主要存储一些引用数据类型,也可以说是对象的内容。
栈由系统自动分配,存取速度比堆要快,仅次于寄存器,栈数据可以共享,由于存在栈中的数据大小与生命周期是确定的,所以缺少灵活性,栈中主要存储一些基本数据类型和对象的地址。
四.为什么runtimeException和他的子类都不需要申明?
runtimeException的异常报错都是在运行的时候报错,比如:空指针、内存溢出等,这些异常语法都没有问题,只是在实现的时候逻辑出现了错误,Java必须显式地抛出这些异常,并对错误进行提示,提示内容有异常的基本信息,以便进行报错处理,使程序更加健壮。
而对于Checked异常,就必须要进行显示的处理,因为不处理,就不会通过编译,也就是在编译过程就会报错了。
五.数据转型的问题?
简单数据类型的转换分为两种:自动转换和强制转换
自动转型 : 当一个较“小”的数据和较“大”的数据一起运算的时候,系统将自动将较“小”的数据转换为较“大”的数据,再进行运算。
自动转型,要遵守下面的规则:
1. 所有的byte、short、char类型的值将提升为int类型;(其中特殊的是char转换成int的时候,返回的是char的ascii码)
2.如果有一个操作数是long类型,计算结果是long类型;
3. 如果有一个操作数是float类型,计算结果是float类型;
4.如果有一个操作数是double类型,计算结果是double类型;
自动类型转顺序如下:
byte->short(char)->int->long->float->double
强制转换: 将“大”数据转换为“小”数据时,可以使用强制类型转换,但是格式为:小数据类型 变量=(小)大数据类型数值。
例如:
byte b = 2;
b=b+2; //这里为什么错了?因为b+2返回值的类型是int,原因是byte会自动转型成int。
正确写法:
第一中写法:
b=(byte)(b+2); //这里强行转换成byte
第二中写法:
b+=2;
可以拆分为:先b+2,计算完结果,给b赋值,如下流程:
byte b = 2; //--这里你是先开始赋值
b+2=4;
b=4;
六.static和final的各自用法
Static:—修饰符,被修饰的成员具备一些特点:1.随着类的加载而加载 2.比对象优先存在3.可以供其他对象共享 4.可以通过类名调用。其中需要注意的是静态方法只能访问静态成员,静态方法中不可以写this,super关键字。
Final:—修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。因此一个类不能既被声明为 abstract的,又被声明为final的。将变量或方法声明为final,可以保证它们在使用中不被改变。被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改。被声明为final的方法也同样只能使用,不能重写。
七.abstract class和interface有什么区别!
abstract class:声明方法的存在而不去实现它的类被叫做抽象类,不能创建abstract类的实例,不能有抽象构造函数或抽象静态方法。然而可以创建一个变量,其类型是一个抽象类,并让它指向具体子类的一个实例。Abstract类的子类为它们父类中的所有抽象方法提供实现,否则它们也是抽象类为。
抽象类和抽象方法原则:
(1)必须使用abstract修饰,抽象方法不能有方法体。
(2)抽象类不能被实例化。
(3)抽象类的构造器不能用于创建实例,主要是用于被子类调用。
(4)含有抽象方法的类,就一定是抽象类。
(5)abstract修饰的方法要被子类使用,因此abstract方法不能定义为private访问权限。
interface:是抽象类的变体。接口中的所有方法都是抽象的,没有一个有程序体。多继承性可通过实现这样的接口而获得。接口只可以定义static final成员变量。接口的实现与子类相似,除了不能继承。它可以在实现了该接口的类的任何对象上调用接口的方法。一个类可以实现一个和多个接口,多个接口之间使用逗号隔开。instanceof运算符可以用来决定某对象的类是否实现了接口。
接口的好处是将实现与表现分离。抽象类与接口都用于抽象,但是抽象类(Java中)可以有自己的部分实现,而接口则完全是一个标识(同时有多重继承的功能)。
它们相同点:
(1)都不能实例化
(2)都可以包含抽象方法
它们不同点:
(1)接口里只能包括抽象方法,不能包含已经提供实现的方法;抽象类则可以包含已经实现的方法。
(2)接口里不能定义静态方法;抽象类可以定义静态方法。
(3)接口里只能定义静态常量属性,不能定义普通属性;抽象类里既可以定义普通属性,也可以定义静态常量属性。
(4)接口不包含构造器;抽象类可以包含构造器,抽象类里的构造器并不是用于创建对象,而是让子类调用这个构造器来完成属与抽象类的初始化操作。
(5)接口里不能包含初始化块,但抽象类则完全可以包含初始化块。
(6)一个类最多只能有一个直接父类,包括抽象类;但一个类可以直接实现多个接口,通过实现多个接口可以弥补Java中的单继承。