- 1、面向对象的特征有哪些方面
(1)抽象
抽象就是找出事物之间的相似和共性处,把这些事物归为一个类,这个类只考虑事物的相似和共性之处,忽略一些主题与当前目标无关的那些方面。抽象不需要了解全部问题,只需要了解一部分的问题,忽略问题的细节。抽象 包含行为抽象与数据 抽象。
(2)继承
在实现一个类时,可以现有的类上派生,这个过程称为继承。新类继承了原有类的特征,那么新类为子类,原有类为父类。子类可以从父类那里继承方法与变量,同时可以根据需求修改或者增加原有的变量。继承支持类的重用,提高 代码的复用性和 可扩展性。
(3)封装
封装是把过程和数据包围起来,外界只能通过已定义的方法对数据进行访问。 一般我们把变量私有化,然后把操作与访问这个变量的方法放在一个类中,这个类可以访问 私有变量,而 外界只能通过提供的方法对变量进行访问。
(4) 多态
多态是指允许不同类对同一消息作出响应。既程序在引用一个变量或者方法时,到底会指向那个类,在编程时并不确定,而是在程序运行期间才确定,因为在程序运行时间才确定具体的类这样就可以让一个变量绑定到不同的类上去实现。
在实现多态的过程中,因为子类向上转型了,他只能访问父类有的变量与方法,对于子类有,父类没有的方法是不能被引用的,包括子类对父类的重载方法。若子类重写了 父类的方法,那么访问时,必定是访问 子类重写的方法。
- 2、String是最基本的数据类型吗?
基本数据类型 包括:int、double、char、long、float、 boolean、short、byte八个。 String是引用类型。引用其实就像是一个对象的名字或者别名 (alias),一个对象在内存中会请求一块空间来保存数据,根据对象的大小,它可能需要占用的空间大小也不等。访问对象的时候,我们不会直接是访问对象在内存中的数据,而是通过引用去访问。引用也是一种数据类型,我们可以把它想象为类似 C++ 语言中指针的东西,它指示了对象在内存中的地址。
- 3、int 和 Integer 有什么区别
integer是int的包装类,int为基本数据类型;int的默认值为0,integer为null;integer需要被实例化后才能使用,int不需要;int直接存储的是数值,而integer存储的是地址。 为了方便将基本数据类型当做对象引用,Java引进了基本数据类型相对应的封装类: 基本数据类型及其分装类有:int(integer) double(Double) byte(Byte) short(Short) long(Long) float(Float) boolean(Boolean) char(Character)
- 4、String 和StringBuffer的区别
String类产生的值为不可修改的(因为String没有没有用来改变字符串中某个字符的方法),当重新赋值时其实为两个变量。StringBuffer对象的内容为可变的,它提供了很多更改字符串中字符的方法,当对值进行修改时不产生新的对象,所以当你想经常对一个字符串进行修改时,则使用 StringBuffer。
- 5、运行时异常与一般异常有何异同?
异常 表示程序运行中出现的非正常现象,运行异常表示虚拟机在通常的操作中 可能遇到的异常,例如 角标越界、空指针异常等,是一直常见的运行错误。Java编译器要求抛出 所有非运行时的异常,而不要求抛出运行时的异常。
- 6、说出ArrayList,Vector, LinkedList的存储性能和特性
ArrayList与Vector都是用数组的方式存储数据的,数值元素数大于实际存储的元素数,以便增加与插入数据,她们都是允许按序号来索引元素的,但是其插入元素需要涉及到数组元素移动等内存操作,所以他们都是索引数据快,插入数据慢。ArrayList与Vector的区别为:Vector属于线性安全的,所以性能上要比ArrayList差。而LinkedList使用了双向链表存储数据, 按序号索引数据需要进行向前或者向后遍历,但是其插入数据只需要记录本项的前后项即可,所以插入数据比较快。
- 7、Collection 和 Collections的区别
Collection是一个集合类的父级接口,他提供了对集合进行基本操作的通用接口方法,Collection接口的意义是为了给具体的集合方法提供最大的统一操作方式。继承他的主要接口有set与list。
Collections是一个针对collection提供的帮助类,他提供一些静态方法来对集合进行排序,搜索等操作。
- 8、&和&&的区别
。&&为逻辑运算符,左右两个条件式都为true时结果才为true,判断时先判断左边,如果左边条件式判断为错误,则不运行右边。&为位运算符和逻辑运算符,为逻辑运算符时,左右两个条件式都为true时结果才为true,左右两边有一个为false则结果为false,但是两端都会 运行。
- 9、HashMap和Hashtable的区别
hashtable为线性安全,而hashmap为线性不安全的,在多线程中hashmap需要自己增加同步处理。由于非线性hash安全,map效率上可能高于hashtable。
hashmap把hashtable 的contains方法改为containsKey和containsValue,因为contains容易引起误解。
hashmap允许key或value为null值,而hashtable都不允许key或value出现null值
- 10、final, finally, finalize的区别
final用来声明属性方法和类,声明属性代表属性不可变,声明方法代表该方法不能覆盖,声明类代表该类不能继承
finally用于异常检测代码 中,finally表示总是会运行。
finalize为Object类的一个方法,垃圾收集器执行的时候,会调用被回收对象的该方法。可以覆盖此方法来提供垃圾回收时其他资源的回收,例如文件的关闭等。
- 11、sleep() 和 wait() 有什么区别?
sleep为线程类(Thread)的方法,导致此线程在指定时间内暂停运行,给执行 机会给其他线程,等到指定时间结束会自动恢复,sleep不会释放对象锁。
wait为Object类方法,使用 wait会使当前线程分区对象锁,进入该对象对应的等待池。可以通过notify,notifyAll方法来唤醒等待的线程。
- 12、Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型?
override重写是父类与子类的多态表现,重载是一个类中多态的表现。override重写表示子类中的方法与父类中的某个方法的方法名与参数完全相同,那么子类对象调用这个方法时,访问的为子类中定义的方法,相当于把父类的方法覆盖了,这也是多态的一直表现形式。 overload方法重载为定义一些名称相同,参数列表不同的方法。方法重载主要看的是参数列表是否相同,与返回类型无关,所以是可以改变返回值类型的。
- 13、error和exception有什么区别?
error表示一些恢复起来很可能的异常,例如像内存的溢出,不能通过修改程序来处理这样的异常
exception 指程序中运行的异常,像角标越界,是程序设计出现的错误,可以通过修改程序 来处理这种异常
- 14、abstract class和interface有什么区别?
声明方法的存在而不去实现它的类被叫做抽象类(abstract class),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。不能创建abstract 类的实例。然而可以创建一个变量,其类型是一个抽象类,并让它指向具体子类的一个实例。不能有抽象构造函数或抽象静态方法。Abstract 类的子类为它们父类中的所有抽象方法提供实现,否则它们也是抽象类为。取而代之,在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法。
接口(interface)是抽象类的变体。在接口中,所有方法都是抽象的。多继承性可通过实现 这样的接口而获得。接口中的所有方法都是抽象的,没有一个有程序体。接口只可以定义static final成员变量。接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法。 然后,它可以在实现了该接口的类的任何对象上调用接口的方法。由于有抽象类,它允许使用接口名作为引用变量的类型。通常的动态联编将生效。引用可以转换到 接口类型或从接口类型转换,instanceof 运算符可以用来决定某对象的类是否实现了接口。
- 15、heap和stack有什么区别。
stack栈内存空间又系统自动分配与释放,heap堆空间为手动申请与释放的,堆常用new来分配空间。
堆为先进先出,栈为先进后出。
堆(数据结构):堆可以被看成是一棵树,如:堆排序; 栈(数据结构):一种先进后出的数据结构。
- 16、GC是什么? 为什么要有GC?
GC是垃圾回收的意思,程序员错误的或者忘记内存回收会导致系统的不稳定甚至奔溃。Java提供的GC功能可以自动的检测对象是否超过作用域,以此来达到自动回收内存的目的,Java没有提供释放内存的方法。
- 17、short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?
s1=s1+1,编译错误,因为b+1时,b会自动转型为int型与1求和,求和完为int型,int为高精度, short为低精度,所以会报错。
s1+=1不会报错,因为+=、-+、*=、/= 这些运算符比较特殊 本身就具有强制类型转换的作用。
- 18、Math.round(11.5)等於多少? Math.round(-11.5)等於多少?
Math.round()为四舍五入,Math.round(11.5)为12,Math.round(-11.5)为11.
- 19、String s = new String(“xyz”);创建了几个String Object?
两个,一个是字符串字面量"xyz"所对应的、驻留(intern)在一个全局共享的字符串常量池中的实例,另一个是通过new String(String)创建并初始化的、内容与"xyz"相同的实例。
- 20、给我一个你最常见到的runtime exception。
Java.lang.NullPointerException空指针异常
Java.lang.IndexOutOfBoundsException索引超出异常
Java.lang.ArithmeticException算术异常
Java.lang.ClassCastException类转换异常
IllegalArgumentException非法数据异常
IllegalStateException非法语句异常
- 21、接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承实体类(concrete class)?
接口可以继承接口、抽象方法可以实现接口。抽象类可以继承实体类,但是要和实体类继承一样,父类要可继承,并拥有子类可以访问得到构造方法
- 22、List, Set, Map是否继承自Collection接口?
List、Set是,Map不是 - 23、数组有没有length()这个方法?String有没有length()这个方法?
数组没有length()这个 方法,但是有length这个属性,String有length这个方法。
- 23、Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?
Set里面的元素是不能重复的,用equals来区分是否重复,equals与==的区别在于是否指向同一对象,如果为同一对象,那么 equals与==无差别,如果为不同对象,那么无论两个对象指向的值是否一样,==结果都为false,而equals会去判断对象的值, 当两个对象的值一样时,会放回ture。而Set存储的为对象的 引用,判断两个不同的对象引用里的值是否相等,则要用equals方法。如为ture,代表值相等,元素重复。
- 24、构造器Constructor是否可被override?
首先,构造器不能被继承,因为构造器的名称与类名一样,而各个类的类名不一样,所以不能被继承,所以就没有重写这个东西,不过在一个类中,构造器可以被重载。
- 25、是否可以继承String类?
String类是finall类,所以不能继承
- 26、swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上?
swtich语句中的变量类型可以为:int 、 short 、 char、 byte,从javaSE 7开始,String也可以作为swtich变量类型,long不能作用于swtich.
- 27、try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后?
但程序进入到try语句中,那么fianlly里的代码一定会被执行,执行时间在return前。
- 28、两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对?
不对,两个对象值相同,那么hashcode也一定相同。什么是hashcode,当我们向一个集合里面去插入对象时,我们需要其判断插入对象的值 是否在集合中已存在,我们可以利用equals去判断,但当集合元素太多时,频繁使用equals会使效率变低,这时hashcode 作用就提现出来了,当往集合添加对象时,先调用 这个对象的hashmap方法 得到该对象的hash值,再与集合的hash值进行比较,如果相等,就代表 该对象元素以存在集合,不能插入,既相当于(x.equals(y) == true),如果不相等,则再调用equals进行判断,不同的话就 存进集合,这里为什么还要再使用equals进行二次判断呢,因为不同的对象可能会产生相同的hashcode,所以hashcode相同的情况下还行调用equals进行二次判断,但是相同的对象一定会产生相同的hashcode。也就是说:
如果两个对象equals的结果为true,则 为相同对象,其hashcode一定相同,反过来说,就是hashcode不等的两个对象,equals一定为false。但是如果hashcode相同的两个对象,其equals结果不一定为 ture,因为不同对对象可能 会产生相同的hashcode。
- 29、当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
值传递,就java里面只有值传递,当一个对象传递到一个方法里面,传递的为该对象的引用,既地址,方法可以修改对象的内容,同时对象的内容也会 被改变,但是方法不能改变对象的引用。
- 30、