1、Java语言有哪些优点 ?
• Java为纯面向对象的语言
• 平台无关性
• Java提供了很多内置的类库,简化了开发人员的程序工作,比如提供了垃圾回收器,使得开发人员从对内存的管理中解脱出来
2、面向对象的特征有哪些方面 ?
• 抽象:抽象是将一类对象的共同特征总结出来构造类的过程
• 继承:继承是从已有类得到继承信息创建新类的过程。提供继承信息的类 被称为父类(超类、基类);得到继承信息的类被称为子类
• 封装:通常认为封装是把数据和操作数据的方法绑定起来,对数据的访问 只能通过已定义的接口
• 多态:
3、多态的实现机制
多态表示同一操作作用在不同对象时,会产生不同的结果。
多态主要有2中表现方式:方法的重载和重写(覆盖)
4、重载和重写(覆盖)的区别
重载(overload)和重写(覆盖)(override)是Java多态性的不同表现方式。
• 重载: 一个类中定义了多个同名的方法,方法名必须相同,参数类型不同、个数不同、顺序 不同。
• 重写: 发生在子类和父类之间,方法名、参数列表必须相同,重写要求子类被重写方法与父类被重写方法有相同的返回类型。如果父类方法访问修饰符为 private 则子类就不能重写该方法。
5、JAVA 的基本数据类型有哪些 ? String 是不是基本数据类型 ?
Java 有 8 种基本数据类型: byte int short long double float Boolean char
byte int short long 都属于整数类型. byte(-128-127)
Double float 属于浮点类型.
Boolean 为布尔类型
Char 为字符型
String 不是基本数据类型,它定义的为对象,是引用类型
6、int 和 Integer [ˈɪntɪdʒə(r)]
有什么区别 ?
为了将基本数据类型当成对象操作,Java 为每一个基本数据类型都引入了对应的包装类型(wrapper class),int 的包装类就是 Integer,从 Java 5 开始引入了自动装箱/拆箱机制,使得二者可以相互转换
7、自动装箱与拆箱
装箱:将基本类型用它们对应的引用类型包装起来
拆箱:将包装类型转换为基本数据类型
8、Java 中的 Math.round(-1.5) 等于多少?
等于 -1,round表示四舍五入,实现原理是在数字基础上先增加0.5然后再向下取整,比如Math.round(-1.6)=-2,Math.round(-1.4)=-1
9、&和&&的区别
&是位运算符,表示按位与运算,&&是逻辑运算符,表示逻辑与(and)
10、"=="和 equals 方法有什么区别?
• 对于==,如果作用于基本数据类型的变量,则直接比较其存储的 “值”是否相等。
比如int n=3;int m=3;n==m为true
如果作用于引用类型的变量,则比较的是所指向的对象的地址。比如
String str1 = new String("hello"); String str2 = new String("hello"); str1==str2为false
• 对于equals方法,注意:equals方法不能作用于基本数据类型的变量
如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址;
诸如String、Date等类对equals方法进行了重写的话,比较的是所指向的对象的内容
11、String str="i"与 String str=new String("i")一样吗?
不一样,因为内存的分配方式不一样。String str="i"的方式,Java 虚拟机会将其分配到常量池中;而 String str=new String("i") 则会被分到堆内存中
12、String 和 StringBuilder、StringBuffer 的区别
• 都是final类,都不允许被继承
• 都可以储存和操作字符串。其中 String 是只读字符串,也就意味着 String 引用的 字符串内容是不能被改变的。而 StringBuffer/StringBuilder 类表示的字符串对象 可以直接进行修改。
• StringBuffer是线程安全的,StringBuilder不是线程安全的。但它们的所有方法是相同的,StringBuffer在StringBuilder的方法之上添加了synchronized修饰,保证了线程安全
• StringBuilder比StringBuffer拥有更好的性能
对于三者使用的总结:
- 操作少量的数据 = String
- 单线程操作字符串缓冲区下操作大量数据 = StringBuilder
- 多线程操作字符串缓冲区下操作大量数据 = StringBuffer
13、 抽象类必须要有抽象方法吗?
不需要,抽象类不一定非要有抽象方法
14、 普通类和抽象类有哪些区别?
普通类不能包含抽象方法,抽象类可以包含抽象方法
抽象类不能直接实例化,普通类可以直接实例化
15、抽象类(abstract class)和接口(interface)有什么异 同?
• 实现:抽象类的子类使用 extends 来继承,接口必须使用 implements 来实现接口。
• 构造函数:抽象类可以有构造函数,接口不能有
• main 方法:抽象类可以有 main 方法,并且我们能运行它,接口不能有 main 方法
• 实现数量:一个类可以实现很多个接口;但是只能继承一个抽象类
• 访问修饰符:接口中的方法默认使用 public 修饰;抽象类中的方法可以是任意访问修饰符
16、阐述 final、finally、finalize 的区别
• final是修饰符有三种用法:用于声明变量、方法、类
被声明为 final 的变量必须在声明时给定初值,而在以后的引用中只能读取不可修改
被声明为 final 的方法也同样只能使用,不能在子类中被重写
被声明为 final 的类意味着它不能再派生出新的子类,即不能被继承。
• finally作为异常处理的一部分,通常放在 try…catch语句后面,附带代码块,表示 无论程序正常执行还是发生异常,这段语句最终一定被执行,一般用于需要释放资源的情况
• finalize是Object 类中定义的方法,在垃 圾收集器执行时会调用被回收对象的finalize( )方法可以重写此方法实现对其他资源的回收,比如关闭文件等
17、 hashCode( )与 equals( )
hashCode( )是从Object类中继承过来的,也用来鉴定两个对象是否相等。hashCode( )只有在集合中用到,hashCode( )会返回对象在内存中的地址转换成一个int值(哈希码/散列码)
当把对象放入集合时,由于对象在Map中的key是不能重复的,先计算对象的 hashcode 值来判断对象加入的位置,同时也会与其他已经加入的对象的 hashcode 值作比较,如果不相等将对象放入集合中;
如果发现有相同 hashcode 值的对象,这时会调用 equals()方法来检查 hashcode 相等的对象是否真的相同。如果两者相同,HashSet 就不会让其加入操作成功。如果不同的话,就会重新散列到其他位置。
hashCode( )与 equals( )的相关规定
• 如果两个对象相等,则 hashcode 一定也是相同的
• 两个对象相等,对两个对象分别调用 equals 方法都返回 true
• 两个对象有相同的 hashcode 值,它们也不一定是相等的
• 因此,equals 方法被重写过,则 hashCode方法也必须被重写
18、static关键字有哪些作用?
• static修饰变量:
Java提供了两种类型的变量:用static修饰的静态变量和不用static修饰的实例变量
静态变量属于类,随着类加载时完成被初始化,所有类共享静态变量。对静态变量的引用有2种方式,“类名.静态变量”和“对象.静态变量”
实例变量属于对象,只有对象被创建后,实例对象才会被分配空间才能使用,引用方式只有“对象.实例变量”
• static修饰方法:
static方法一般称作静态方法,由于静态方法不依赖于任何对象就可以进行访问。因此对于静态方法来说,是没有this的,因为它不依附于任何对象,既然都没有对象,就谈不上this了
静态方法只能访问静态成员。(非静态既可以访问静态,又可以访问非静态)
静态方法中不可以使用this或者super关键字
• static修饰代码块:
static代码块(静态代码块)在类中是独立于成员变量和成员函数的代码块,不在任何一个方法体内,经常被用来初始化静态变量,这些static代码块只会被执行一次
• static内部类:
静态内部类不能与外部类有相同的名字,不能访问外部类的普通成员变量,只能访问外部类中的静态成员和静态方法。
需要注意的是只有内部类才能在其前面加上一个权限修饰符static定义为静态。
19、什么是Java序列化,如何实现Java序列化?
序列化就是一种用来处理对象流的机制。当两个进程在进行通信时,无论是何种类型的数据,都会以二进制序列的形式在网络上传送。发送方需要把这个Java对象转换为字节序列,才能在网络上传送;接收方则需要把字节序列再恢复为Java对象
• 序列化:把Java对象转换为字节序列的过程
• 反序列化:把字节序列恢复为Java对象的过程
序列化的实现:在Java中只要一个类实现了Serializable接口的类就被认为是序列化的类,这种类的所有对象就是序列化的对象。只有被序列化的数据才允许被存储到文件、数据库之中或者通过网络协议进行传输
20、Java 中 IO 流分为几种?
按功能来分:输入流(input)、输出流(output)
按类型来分:字节流和字符流。
字节流和字符流的区别是:字节流按 8 位传输以字节为单位输入输出数据,字符流按 16 位传输以字符为单位输入输出数据
21、BIO、NIO、AIO 有什么区别?
BIO:Blocking IO 同步阻塞式 IO,就是我们平常使用的传统 IO,它的特点是模式简单使用方便,
并发处理能力低。
NIO:Nonblocking IO 同步非阻塞 IO,是传统 IO 的升级,
客户端和服务器端通过 Channel(通道)通讯,实现了多路复用。
AIO:Asynchronous IO 是 NIO 的升级,也叫 NIO2,实现了异步非堵塞 IO ,
异步 IO 的操作基于事件和回调机制。
22、this和super的区别
在Java语言中,this用来指向当前实例对象,它的一个非常重要的作用就是用来区分
对象的成员变量与方法的形参(当一个方法的形参与成员变量的名字相同时,就会覆盖成员变量),
示例如下:
super 可以用来访问父类的方法或成员变量。当子类成员变量与父类有相同名字时也会
覆盖父类的方法或成员变量,要想访问父类的方法或成员变量只能通过super关键字来访问,
示例如下: