==和equals的区别和联系
==:
a) 基本类型,比较的是值
b) 引用类型,比较的是地址
c) 不能比较没有父子关系的两个对象
equals()
a) 系统类一般已经覆盖了equals(),比较的是内容。
b) 用户自定义类如果没有覆盖equals(),将调用父类的equals(比如是Object),而Object的equals的比较是地址(return (this == obj);)
c) 用户自定义类需要覆盖父类的equals()
注意:Object的==和equals比较的都是地址,作用相同
多态的技能点(前提条件,向上转型、向下转型)
实现多态的三个条件:
继承,子类重写父类方法,父类引用指向子类对象
向上转型:父类引用指向子类对象,自动转型。
通过父类引用变量调用的方法是子类覆盖或继承父类的方法,而不是父类的方法
通过父类引用变量无法调用子类特有的方法
向下转型:子类对象赋值给另一个子类的引用,强制转型
向下转型必须转换为父类引用指向的真实子类类型
向下转型时可以结合使用instanceof运算符进行强制类型转换,比如出现转换异常。
接口和抽象类的异同
抽象类和接口均包含抽象方法,抽象类和接口都不能实例化
两者的区别主要体现在两方面:语法方面和设计理念方面
在语法方面:
接口中只能定义全局静态常量,不能定义变量。抽象类中可以定义常量和变量。
接口中所有的方法都是全局抽象方法。抽象类中可以有0个、1个或多个,甚至全部都是抽象方法。
一个类只能有一个直接父类(可以是抽象类),但可以充实实现多个接口。
设计理念方面:
抽象类体现了一种继承关系,目的是复用代码,抽象类决定了类的本质是什么
接口决定了存在哪些功能,但并不是直接实现功能。一般和实现类一起组合使用
简述Java的垃圾回收机制
Java语言不需要程序员直接控制内存回收,是由JRE在后台自动回收不再使用的内存,称为垃圾回收机制。
- 可以提高编程效率。
- 保护程序的完整性。
- 其开销影响性能。Java虚拟机必须跟踪程序中有用的对象,确定哪些是无用的。
垃圾回收机制的特点
- 垃圾回收机制回收JVM堆内存里的对象空间,不负责回收栈内存数据。
- 对其他物理连接,比如数据库连接、输入流输出流、Socket连接无能为力。
- 垃圾回收发生具有不可预知性,程序无法精确控制垃圾回收机制执行。
- 可以将对象的引用变量设置为null,暗示垃圾回收机制可以回收该对象。
- 现在的JVM有多种垃圾回收实现算法,表现各异。
- 垃圾回收机制回收任何对象之前,总会先调用它的finalize方法(如果覆盖该方法,让一个新的引用变量重新引用该对象,则会重新激活对象)。
- 程序员可以通过System.gc()或者Runtime.getRuntime().gc()来通知系统进行垃圾回收,会有一些效果,但是系统是否进行垃圾回收依然不确定。
- 永远不要主动调用某个对象的finalize方法,应该交给垃圾回收机制调用。
Error和Exception的区别
Error仅靠程序本身无法恢复的严重错误,比如说内存溢出、动态链接异常、虚拟机错误。
发生Error我们只能尽可能的安全退出程序,别无他法。
Exception是Java应用程序抛出和处理的非严重错误,比如所需文件没有找到、零作除数,数组下标越界等。可分为两类:Checked异常和Runtime异常
Checked异常和Runtime异常
Runtime异常是运行时异常,不要求程序必须对它们作出处理。
比如输入不匹配InputMismatchException、ArithmeticException、空指针NullPointerException等。
即使没有使用try-catch或throws进行处理,仍旧可以进行编译和运行。
如果运行时发生异常,会输出异常的堆栈信息并中止程序执行。
Checked异常是检查异常,除了运行时异常外的其他异常类都是Checked异常。
程序必须捕获或者声明抛出这种异常,否则出现编译错误,无法通过编译。
处理方式包括两种:
通过try-catch捕获异常,通过throws声明抛出异常从而交给上一级调用方法处理。
异常处理中throws和throw的区别
作用不同:throw是程序员手动生成的异常,用于提醒和放大异常。Throw是在声明的方法内抛出异常
位置不同:throw位于方法体的内部,可以单独使用,throws必须跟在方法参数后面,不能单独使用
内容不同:throw声明一个异常,而throws可以抛出一个或多个异常
为什么引入包装类?
基本数据类型不符合面向对象的思想
集合中的元素只能是Object
JDK1.5提供了自动装箱和自动拆箱的功能,从而实现了包装类到基本数据类型的转换
包装类还可以实现基本类型变量和字符串之间的转换:
“基本类型变量------------String.valueof()------------>字符串”
Int和Intager的区别
int是java提供的8种原始数据类型之一。
Java为每个原始类型提供了封装类,Integer是java为int提供的封装类。
int的默认值为0,而Integer的默认值为null。
即Integer可以区分出未赋值和值为0的区别,int则无法表达出未赋值的情况