一、Java 中的数据类型有哪些?
分为两类
①基本数据类型(有8种):
数值型(6种):整数型(int、byte、short、long)浮点型(flout、double)
非数值型(2种):char、boolean
②引用数据类型 :
数组、class、接口
二、如何实现 Java 中的多态?
(1)什么是多态
①多态是java面向编程的三大特征之一(继承、封装)
②多态就是同一个对象,在不同时刻,代表的对象不一样,指的是对象的多种形态。
(2)实现条件
①是继承(需要有子类继承父类的继承关系)
②需要子类的重写( 子类需要对父类中的一些方法进行重写,然后调用方法时就会调用子类重写的方法,而不是原本父类的方法)
③向上转型(在多态中需要将子类的引用赋给父类对象,只有这样该引用才能够具备技能调用父类的方法和子类的方法)
(3)如何实现
-
子类继承父类(extends)
-
类实现接口(implements)
三、Java 中的 try-catch 机制是什么?有什么用处? Java 中的异常处理有哪些常见的异常?
(一)try-catch 机制
①是什么
try-catch是用来捕捉异常,并进行安全输出。这种异常是一种代码中逻辑上的异常,而不是编译异常。
系统会根据运行上产生的异常类型来匹配catch块中的异常类型
- 如果产生的异常与 catch块异常匹配成功,则执行catch中的内容
- 如果产生的异常与catch块匹配失败,则自动抛出这个异常,但这种异常抛出行为是不安全的:它会终止系统进程继续执行,换言之,异常后面的代码将不会被执行,异常处的代码执行失败。为此,通常为了安全考虑,我们可以在catch块后面添加finally块。
②代码
try {
//业务代码(可能报异常的代码)
} catch (NullPointerException e) {
// 异常处理块1
}catch(Exception e2){
//异常处理块2
}finally{
//资源回收块
}
③注意事项
- try语句块中出现错误的语句之后的内容都不会执行
- try语句块中没有异常发生时,catch不会执行
- catch可以写多个,针对try中不同的异常可以分别捕获
- finally语句块主要作用是回收资源,比如:关闭数据库连接,网络连接,磁盘文件,输入输出流等等。这些资源必须显示的回收,Java的垃圾回收机制不会回收任何物理资源,它只回收堆内存中对象所占用的内存。
- 无论try语句块中的代码是否出现异常,也不管catch块中的代码是否执行,finally中的代码块都会被执行。
②优点
- 可以让程序具有更好的容错性,程序更加健壮
(二)常见的异常
-
java.lang.NullPointerException(空指针异常)
调用了未经初始化的对象或者是不存在的对象 -
java.lang.ClassNotFoundException(指定的类不存在)
这里主要考虑一下类的名称和路径是否正确即可,通常都是程序试图通过字符串来加载某个类时可能引发 异常 -
java.lang.NumberFormatException(字符串转换为数字异常)
-
java.lang.IndexOutOfBoundsException(数组下标越界异常)
-
java.lang.IllegalArgumentException(方法的参数错误)
-
java.lang.NoSuchMethodException(常方法不存在异)
-
java.lang.EOFException(文件已结束异常)
-
java.lang.OutOfMemoryException(内存不足错误)
当可用内存不足以让Java虚拟机分配给一个对象时抛出该错误。
当程序在输入的过程中遇到文件或流的结尾时,引发异常。因此该异常用于检查是否达到文件或流的结尾
四、什么是 Java 中的接口?为什么要使用接口?
(一)定义
- 有时必须从几个类中派生出一个子类,继承它们所有的属性和方法。但是,Java不支持多重继承。有了接口,就可以得到多重继承的效果。
- 有时必须从几个类中抽取出一些共同的行为特征,而它们之间又没有is-a的关系,仅仅是具有相同的行为特征而已。(例如:鼠标、键盘、打印机、扫描仪、摄像头、充电器、MP3机、手机、数码相机、移动硬盘等都支持USB连接)
- 使用:用interface来定义
(二)作用
- 把使用接口的人和实现接口的人分开,实现接口的人不必要关心谁去使用,而使用接口的人也不用关心谁实现的接口,由接口将他们联系在一起。
五、Java 中的继承是什么?它的好处是什么?
(一)定义
- 继承是面向对象语法的三大特征之一(继承、多态、封装)
- java 继承使用extends关键字关键字来实现
(二)作用
- 子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。
- 通过继承可以快速创建新的类,实现代码的重用,提高程序的可维护性,节省大量创建新类的时间,提高开发效率和开发质量。
六、Java 中的抽象类是什么?它与接口有什么区别?
- 抽象就是把事物的共同特征总结为一点。 他和具体又是相对的。
- Java语言中,用abstract 关键字来修饰一个类时,这个类叫作抽象类。
- 抽象类是它的所有子类的公共属性的集合,是包含一个或多个抽象方法的类。抽象类可以看作是对类的进一步抽象。在面向对象领域,抽象类主要用来进行类型隐藏。
(二)使用
- 无法完整描述一个类,只能抽象化概念来使用
- 抽象类中可以有零个或多个抽象方法,也可以包含非抽象的方法。
- 抽象类中可以没有抽象方法,但是,有抽象方法的类必须是抽象类
- 抽象类是对一种事务的抽象,是对整个类进行抽象,包括属性,行为(方法)。
- 接口是对行为(行为)的抽象。
七、Java 中的泛型是什么?它的用处是什么?
(一)定义
- 泛型:把类型明确的工作推迟到创建对象或调用方法的时候才去明确的特殊的类型
①不用强制转换
- 早期Java是使用Object来代表任意类型的,但是向下转型有强转的问题,这样程序就不太安全
- 没有泛型,集合会怎么样Collection、Map集合对元素的类型是没有任何限制的。
- 把对象扔进集合中,集合是不知道元素的类型是什么的,仅仅知道是Object。因此在get()的时候,返回的是Object。外边获取该对象,还需要强制转换
②代码更加简洁
③程序更加健壮
只要编译时期没有警告,那么运行时期就不会出现ClassCastException异常
④可读性和稳定性
在编写集合的时候,就限定了类型
八、什么是 Java 中的自动装箱和拆箱?
- 除了8大基础类型之外一切皆为对象,但为了方便面向对象开发,基础类型也有对应的包装类。但包装类和基础类型在赋值或比较时要进行类型转化,使用起来不够丝滑,感觉他们之间有很大的鸿沟。所以jdk1.5之后就推出了自动装箱和自动拆箱机制,使开发更加方便,代码更加简洁。
(一)自动装箱
- 自动装箱就是在编译时自动将基础类型转化与之对应的包装类。
(二)自动拆箱
- 自动拆箱刚好与之相反,就是在编译时自动将包装类转化为与之对应的基础类型。
九、请详细描述 Java 中的多线程。
(一)定义
- 多线程是一种同时执行多个线程的技术,它不允许进程或操作系统生成计算机中运行的程序的多个副本,而是在不创建程序多个副本的情况下,同时管理多个用户或同一用户的多个请求。
(二)使用
- 在Java中负责线程的这个功能的是Java.lang.Thread 这个类
- 可以通过创建 Thread 的实例来创建新的线程。
- 每个线程都是通过某个特定Thread对象所对应的方法run( )来完成其操作的,方法run( )称为线程体。
- 通过调用Thead类的start()方法来启动一个线程。
十、Java 中的单例模式是什么?如何实现单例模式?
(一)定义
- 单例模式是指在内存中只会创建且仅创建一次对象的设计模式。在程序中多次使用同一个对象且作用相同时,为了防止频繁地创建对象使得内存飙升,单例模式可以让程序仅在内存中创建一个对象,让所有需要调用的地方都共享这一单例对象。
(二)类型
- 懒汉式:在真正需要使用对象时才去创建该单例类对象
- 饿汉式:在类加载时已经创建好该单例对象,等待被程序使用
十一、什么是面向对象? 面向对象的三大特征是什么?
最早的是面向过程,随后发展出了面向对象。
(一)面向过程
- 面向过程是一种以过程为中心的编程思想,其原理就是将问题分解成一个一个详细的步骤,然后通过函数实现每一个步骤,并依次调用。
- 面向过程我们所关心的是解决一个问题的步骤,举个例子,汽车发动、汽车熄火,这是两个不同的事件,对于面向过程而言,我们关心的是事件本身,因此我们会使用两个函数完成以上两个动作,然后依次调用即可。
(二)面向对象
- 面向对象则是一种以对象为中心的编程思想,就是通过分析问题,分解出一个一个的对象,然后通过不同对象之间的调用来组合解决问题。建立对象的目的不是为了完成某个步骤,而是为了描述某个事物在解决整个问题的过程中的行为。
- 封装就是将一个类的某些信息隐藏在类的内部,不允许外界直接访问,而是提供某些方法实现对隐藏信息的访问和操作。
- 封装的好处就是增强了数据安全性以及隐藏了类的实现细节,使用者无需了解具体实现细节,只需通过特定的接口进行访问,这样也方便类自身的实现和修改。
- 继承是类与类之间的一种关系,即子类继承父类的特征和行为,使得子类具有和父类相同的属性和行为。
- 继承的好处在于子类继承了父类的属性和方法从而实现了代码的复用。
- 多态是指一个类对象的相同方法在不同情形下有不同的表现形式。
- 多态使得具有不同内部结构的对象可以共享相同的外部接口。
十二、什么是封装?它的好处是什么?
- 封装是把彼此相关数据和操作包围起来,抽象成为一个对象,变量和函数就有了归属,想要访问对象的数据只能通过已定义的接口。
①程序更易维护我们能修改自己的代码,而不用修改那些调用我们代码的程序片段,从而可以让程式码更容易维护。
②将相关联的变量和函数封装成一个对象,变量描述对象的属性,函数描述对象的行为,这符合我们对客观世界的认识。
③还实现了对属性的数据访问限制,也加强了程式码的安全性。
十三、什么是多态?它的好处是什么?
(一)定义
- 是指相同的操作或函数、过程可作用于多种类型的对象上并获得不同的结果。
- 不同的对象,收到同一消息可以产生不同的结果。计算机程序运行时,相同的消息可能会送给多个不同的类别之对象,而系统可依据对象所属类别,引发对应类别的方法,而有不同的行为。
- 简单来说,所谓多态意指相同的消息给予不同的对象会引发不同的动作。
- 应用程序不必为每一个派生类编写功能调用,只需要对抽象基类进行处理即可。大大提高程序的可复用性。//继承
- 派生类的功能可以被基类的方法或引用变量所调用,这叫向后兼容,可以提高可扩充性和可维护性。
十四、什么是抽象类?它与接口有什么区别?
- 抽象类是用来捕捉子类的通用特性的 。它不能被实例化,只能被用作子类的超类。抽象类是被用来创建继承层级里子类的模板。
(二)与接口区别
参数 | 抽象类 | 接口 |
默认的方法实现 | 它可以有默认的方法实现 | 接口完全是抽象的。它根本不存在方法的实现 |
实现 | 子类使用extends关键字来继承抽象类。如果子类不是抽象类的话,它需要提供抽象类中所有声明的方法的实现。 | 子类使用关键字implements来实现接口。它需要提供接口中所有声明的方法的实现 |
构造器 | 抽象类可以有构造器 | 接口不能有构造器 |
与正常Java类的区别 | 除了你不能实例化抽象类之外,它和普通Java类没有任何区别 | 接口是完全不同的类型 |
访问修饰符 | 抽象方法可以有public、protected和default这些修饰符 | 接口方法默认修饰符是public。你不可以使用其它修饰符。 |
main方法 | 抽象方法可以有main方法并且我们可以运行它 | 接口没有main方法,因此我们不能运行它。(java8以后接口可以有default和static方法,所以可以运行main方法) |
多继承 | 抽象方法可以继承一个类和实现多个接口 | 接口只可以继承一个或多个其它接口 |
速度 | 它比接口速度要快 | 接口是稍微有点慢的,因为它需要时间去寻找在类中实现的方法。 |
添加新方法 | 如果你往抽象类中添加新的方法,你可以给它提供默认的实现。因此你不需要改变你现在的代码。 | 如果你往接口中添加方法,那么你必须改变实现该接口的类。 |
十五、什么是方法重载?
- 方法重载是指在一个类中定义多个同名的方法,但要求每个方法具有不同的参数的类型或参数的个数.具体有以下几种。
(二)具体形式
- 方法名相同,参数类型不同,构成重载
- 方法名相同,参数顺序不同,构成重载
- 方法名相同,参数个数不同,构成重载
十六、什么是接口?它的好处是什么?
- 接口,是 Java 语言中一种引用类型,是方法的集合,如果说类的内部封装了成员变量、构造方法和成员方法,那么接口的内部主要就是封装了方法,包含抽象方法( JDK 7及以前),默认方法和静态方法( JDK 8),私有方法( JDK 9)。
- 定义接口有利于代码的规范:对于一个大型项目而言,架构师往往会对一些主要的接口来进行定义,或者清理一些没有必要的接口。这样做的目的一方面是为了给开发人员一个清晰的指示,告诉他们哪些业务需要实现;同时也能防止由于开发人员随意命名而导致的命名不清晰和代码混乱,影响开发效率。
- 有利于对代码进行维护:比如你要做一个画板程序,其中里面有一个面板类,主要负责绘画功能,然后你就这样定义了这个类。可是在不久将来,你突然发现现有的类已经不能够满足需要,然后你又要重新设计这个类,更糟糕是你可能要放弃这个类,那么其他地方可能有引用他,这样修改起来很麻烦。如果你一开始定义一个接口,把绘制功能放在接口里,然后定义类时实现这个接口,然后你只要用这个接口去引用实现它的类就行了,以后要换的话只不过是引用另一个类而已,这样就达到维护、拓展的方便性。
- 保证代码的安全和严密:一个好的程序一定符合高内聚低耦合的特征,那么实现低耦合,定义接口是一个很好的方法,能够让系统的功能较好地实现,而不涉及任何具体的实现细节。这样就比较安全、严密一些,这一思想一般在软件开发中较为常见。
十七、什么是抽象方法?
- 抽象类就是不能使用new方法进行实例化的类,即没有具体实例对象的类,抽象类有点类似于“模板”的作用,目的是根据其格式来创建和修改新的类,对象不能由抽象类直接创建,只可以通过抽象类派生出新的子类,再由其子类来创建对象,当一个类被声明为抽象类时,要在这个类前面加上修饰符abstract,在抽象类中的成员方法可以包括一般方法和抽象方法。
- 抽象方法就是以abstract修饰的方法,这种方法只声明返回的数据类型,方法名称和所需要的参数,没有方法体,也就是说抽象方法只需要声明而不需要事先,当一个方法为抽象方法时,意味着这个方法必须被子类的方法所重写,否则其子类的该方法仍然是abstract的,而这个子类也必须是抽象的,即声明为abstract。
(三)两者联系
- 抽象类中不一定包含抽象方法,但是包含抽象方法的类一定要被声明为抽象类,抽象类本身不具备实际的功能,只能用于派生其子类,抽象类中可以包含构造方法,但是构造方法不能被声明为抽象,抽象类不能用final来修饰,即一个类不能既是最终类又是抽象类,abstract不能与private,static,final,native并列修饰同一个方法。
十八、什么是静态代码块?它的用处是什么?
- 在java中使用static关键字声明的代码块叫静态代码块。
(二)用处
- 静态块用于初始化类,为类的属性初始化。每个静态代码块只会执行一次。静态代码块随着类加载而加载,有多个静态代码块的,按代码块前后顺序加载。由于JVM在加载类时会执行静态代码块,所以静态代码块先于主方法执行。
- 当某些代码必须在项目启动的时候就执行,那么我们就可以使用静态代码块来实现,这种代码是主动执行的。
十九、Java 的关键字
(一)数据类型的关键字
byte | 字节型 8bit | long | 长整型 32bit |
char | 字符型 16bit | double | 双精度 64bit |
boolean | 布尔型 | void | 无返回 |
short | 短整型 16bit | null | 空值 |
int | 整型 32bit | true | 真 |
float | 浮点型 32bit | false | 假 |
(二) 包的关键字
import | 引入包的关键字 |
package | 定义包的关键字 |
(三)访问修饰符的关键字
public | 公有的,可跨包 |
protected | 受保护的,当前包内可用 |
private | 私有的,当前类可用 |
class | 类 |
interface | 接口 |
abstract | 声明抽象 |
implements | 实现 |
extends | 继承 |
new | 创建新对象 |
二十、super 和 this 的作用
引用:http://t.csdn.cn/ygGeJ
(一)定义
- this:代表当前对象的引用,谁来调用我我就代表谁。
- super:代表当前对象对父类的引用。
(二)区别
1、相同点
- 1. 都是java关键字,起到指代作用;在构造方法中必须出现在第一行。
- 2. 且this() 和super() 不能存在于同一个构造函数中。
- 第一,this()和super()都必须写在构造函数的第一行;第二,this()语句调用的是当前类的另一个构造函数而这个另一个构造函数中必然有一个父类的构造器,再使用super()又调用一次父类的构造器, 就相当于调用了两次父类的构造器,编译器不会通过;
- 3. this和super不能用于static修饰的变量,方法,代码块;因为this和super都是指的是对象(实例)
2、不同点
二十一、什么是包装类?它的作用是什么?
(一)定义
- 包装类就是解决java的八种基本数据类型不面向对象的缺陷,而设计出来的一个个与每一个与基本类型相对应的类,这八种基本数据类型对应的类统称包装类(Wrapper Class),包装类均位于java.lang包
(二)内容
基本数据类型 | 对应包装类型 | 基本数据类型 | 对应包装类型 |
boolean | Boolean | long | Long |
short | Short | int | Integer |
byte | Byte | float | Float |
char | Character | double | Double |
(三)作用
- 作为基本数据类型对应的类存在,方便有关对象的操作
- 可以用设定每种基本数据类型的属性大小及使用方法