java基础的一些区别

1,编译时异常与运行时异常的区别:
编译时异常 JAVA程序必须显示处理,否则程序就会发生错误,无法通过编译
运行时异常 无需显示处理,也可以和编译时异常一样处理,是程序员自身犯的错误,需要回来修改代码


2,throw 和 throws 的区别:
throw:
用在方法体内,后面跟的是异常对象名
表示抛出异常,由方法内的语句处理
只能抛出一个异常对象名
throws:
用在方法声明后面,后面跟的是异常类名
可以跟多个异常类名,中间用逗号隔开
表示抛出异常,由该方法的调用者处理


3,final finalize finally的区别
final
修饰类,表示类不能被继承
修饰方法,表示方法不能被重写
修饰变量,只能被赋值一次,变为常量
finally 
finally是try语句中的一个语句体,不能单独使用,用来释放资源
被finally控制的语句一定会执行    (好比一个人的临终遗愿,执行了才会归西)
finalize
finalize是一个方法,当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法
ps:如果被finally控制的语句前面有return,finally一样会执行,但是不会影响return的值


4,对于异常,什么时候使用try,什么时候使用throws
1,如果该功能内部可以将问题处理,用try. 如果处理不了,就用throws,交由调用者去处理
2,如果后续程序需要继续运行用try , 反之, 如果后续程序不需要继续运行就用throws
ps:如果JDK没有提供相应的异常,需要自定义异常
异常注意事项
a:子类重写父类方法时,子类的方法必须抛出相同的异常或父类异常的子类。(父亲坏了,儿子不能比父亲更坏)
b:如果父类抛出了多个异常,子类重写父类时,只能抛出相同的异常或者是他的子集,子类不能抛出父类没有的异常
c:如果被重写的方法没有异常抛出,那么子类的方法绝对不可以抛出异常,如果子类方法内有异常发生,那么子类只能try,不能throws

5,什么时候使用switch,什么时候使用if
判断固定值的时候使用switch
判断范围或者是区间的时候使用if   如果区间范围很小,也可以使用switch


6,三种循环语句的区别
do...while是先执行一次循环体,再去判断条件(至少执行一次)
while和for是先判断条件,条件符合才会去执行循环体


7,while和for的区别
如果想在循环结束后继续使用控制条件的变量,就用while,反之就用for
如果不知道该用哪个就用for语句,因为变量可以及早的从内存中释放,提高内存的使用效率


8,return与break以及continue的区别
return是结束方法
break是跳出循环
continue是跳出本次循环,执行下一次循环


9,基本数据类型的值传递与引用数据类型的值传递的区别
基本数据类型的值传递不会改变原值,因为调用后方法就会弹栈,局部变量随之消失
引用数据类型的值传递传递的是地址值,会改变原值,因为即使方法弹栈,堆内存中的对象还在,可以通过地址继续访问
JAVA中只有传值,因为地址值也是值的一种


10,成员变量和局部变量的区别
a,在类中的位置不同
局部变量在方法定义中或方法声明上
成员变量在类中方法外
b,生命周期不同
局部变量随着方法的调用而存在,随着方法调用完毕而消失
成员变量随着对象的创建而存在,随着对象的消失而消失
c,初始化值不同
局部变量没有默认初始化值,要想使用,必须先赋值
成员变量有默认初始化值
d,在内存中的位置不同
局部变量在栈内存
成员变量在堆内存


11,静态变量与成员变量的区别
a,所属不同
静态变量属于类,也称为类变量
成员变量属于对象,也称为实例变量(对象变量)
b,内存中的位置不同
静态变量存储于方法区中的静态区
成员变量存储与堆内存
c,内存中出现的时间不同
静态变量随着类的加载而加载,随着类的消失而消失
成员变量随着对象的创建而存在,随着对象的消失而消失
d,调用不同
静态变量可以通过类名调用,也可以通过对象调用
成员变量只能通过对象调用


12,this和super的区别
a,this代表当前对象的引用,谁来调用我,我就代表谁
  super代表当前对象父类的引用
b,调用成员变量
this.成员变量 调用本类的成员变量,也可以调用父类的成员变量
super.成员变量 调用父类的成员变量
c,调用构造方法
this(..) 调用本类的构造方法
super(..) 调用父类的构造方法
d,调用成员方法
this.成员方法 调用本类的成员方法,也可以调用父类的成员方法
super.成员方法 调用父类的成员方法
一句话 this可以调用本类的也可以调用父类的(构造方法除外),而super只能调用父类的


13,Override和Overload的区别   Overload可以改变返回值类型么
Oerload可以改变返回值类型,只看参数列表
Override(方法重写) 子类中出现与父类中方法声明一模一样的方法,与返回值有关,返回值是一致的
Overload(方法重载) 本来中出现的方法名一样,参数列表不同的方法, 与返回值类型无关
子类对象在调用方法的时候,先找本类再找父类


14,==与equals的区别
a,==是比较运算符,既可以比较基本数据类型,也可以比较引用数据类型,比较基本数据类型比较的是值,比较引用数据类型比较的是地址值
b,equals方法只是一种方法,只能比较引用数据类型,所有的对象都会继承Object类中的equals方法,如果没有重写Object类中的equals方法,比较的是两个对象的地址值,如果重写了
  Object类中的equals方法,比较的是两个对象的属性
  
15,String与StringBuffer的区别
String是不可变的字符序列
StringBuffer是可变的字符序列


16,StringBuffer和StringBuilder的区别
StringBuffer是线程安全的,效率低,是JDK1.0版本的
StringBuilder是线程不安全的,效率高,是JDK1.5版本的


17,数组和集合的区别
a,数组的长度是固定的
  集合的长度是可变的,可以根据元素的增加而增加
b,数组既可以存储基本数据类型,也可以存储引用数据类型,存储基本数据类型存储的是值,存储引用数据类型存储的是地址值
  集合只能存储引用数据类型,如果存储的是基本数据类型,会对其进行自动装箱变成对象
  
18,TreeSet的原理
a,自然排序
TreeSet的add()方法会将存入的对象提升为Comparable类型,调用对象的compareTo方法和集合中的对象做比较(当前存入的是谁,就是谁调用了compareTo方法),
根据compareTo方法的返回值进行存储
b,比较器顺序
创建TreeSet对象的时候可以制定一个Comparator(比较器),如果传入了Comparator的子类对象,那么TreeSet就会按照比较器中的顺序进行排序,
add()方法会自动调用Comparato接口中的compare方法排序,调用的对象(当前的传入对象)是compare方法的第一个参数,集合内的对象是compare方法的第二个参数

19,Comparable和Comparator的区别
TreeSet的构造函数如果什么都不传,就默认按照Comparable的顺序进行排序
如果传入了Comparator,就优先按照Comparator的顺序进行排序

20,继承Thread和实现Runnable接口的区别
查看源码的区别:
a.继承Thread : 由于子类重写了Thread类的run(), 当调用start()时, 直接找子类的run()方法
b.实现Runnable : 构造函数中传入了Runnable的引用, 成员变量记住了它, start()调用run()方法时内部判断成员变量Runnable的引用是否为空,
 不为空编译时看的是Runnable的run(),运行时执行的是子类的run()方法
继承Thread
好处是:可以直接使用Thread类中的方法,代码简单
弊端是:如果已经有了父类,就不能用这种方法
实现Runnable接口
好处是:即使自己定义的线程类有了父类也没关系,因为有了父类也可以实现接口,而且接口是可以多实现的
弊端是:不能直接使用Thread中的方法需要先获取到线程对象后,才能得到Thread的方法,代码复杂
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值