答:面向对象的特征主要有如下几个方面:程序员
-抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面。抽象只关注对象有哪些属性和行为,并不关注这些行为的细节是什么。面试
-继承:继承是从己有类获得继承信息建立新类的过程。提供继承信息的类被称为父类(超类、基类);获得继承信息的类被称为子类(派生类)。继承让变化中的软件系统有了必定的延续性,同时继承也是封装程序中可变因素的重要手段(若是不能理解请阅读阎宏博士的《Java与模式》或《设计模式精解》中关于桥梁模式的部分)。算法
-封装:一般认为封装是把数据和操做数据的方法绑定起来,对数据的访问只能经过己定义的接口。面向对象的本质就是将现实世界描绘成一系列彻底自治、封闭的对象。咱们在类中编写的方法就是对实现细节的一种封装;咱们编写一个类就是对数据和数据操做的封装。能够说,封装就是隐藏一切可隐藏的东西,只向外界提供最简单的编程接口(能够想一想普通洗衣机和全自动洗衣机的差异,明显全自动洗衣机封装更好所以操做起来更简单;咱们如今使用的智能手机也是封装得足够好的,由于几个按键就搞定了全部的事情)。编程
-多态性:多态性是指容许不一样子类型的对象对同一消息做出不一样的响应。简单的说就是用一样的对象引用调用一样的方法可是作了不一样的事情。多态性分为编译时的多态性和运行时的多态性。若是将对象的方法视为对象向外界提供的服务,那么运行时的多态性能够解释为:当A系统访问B系统提供的服务时,B系统有多种提供服务的方式,但一切对A系统来讲都是透明的(就像电动剃须刀是A系统,它的供电系统是B系统,B系统可使用电池供电或者用交流电,甚至还有多是太阳能,A系统只会经过B类对象调用供电的方法,但并不知道供电系统的底层实现是什么,究竟经过何种方式得到了动力)。方法重载(overload)实现的是编译时的多态性(也称为前绑定),而方法重写(override)实现的是运行时的多态性(也称为后绑定)。运行时的多态是面向对象最精髓的东西,要实现多态须要作两件事:1).方法重写(子类继承父类并重写父类中己有的或抽象的方法);2).对象造型(用父类型引用引用子类型对象,这样一样的引用调用一样的方法就会根据子类对象的不一样而表现出不一样的行为)。设计模式
答:一般咱们定义一个基本数据类型的变量,一个对象的引用,还有就是函数调用的现场保存都使用JVM中的栈空间;而经过new关键字和构造器建立的对象则放在堆空间,堆是垃圾收集器管理的主要区域,因为如今的垃圾收集器都采用分代收集算法,因此堆空间还能够细分为新生代和老生代,再具体一点能够分为 Eden、Survivor (又可分为 From Survivor 和 To Survivor)、Tenured;方法区和堆都是各个线程共享的内存区域,用于存储己经被JVM加载的类信息、常量、静态变量、JIT编译器编译后的代码等数据;程序中的字面量(literal)如直接书写的100、"hello"和常量都是放在常量池中,常量池是方法区的一部分,栈空间操做起来最快可是栈很小,一般大量的对象都是放在堆空间,栈和堆的大小均可以经过JVM的启动参数来进行调整,栈空间用光了会引起StackOverflowError,而堆和常量池空间不足则会引起OutOfMemoryError 。String str = new String("hello");数组
上面的语句中变量str放在栈上,用new建立出来的字符串对象放在堆上,而"hello"这个字面量是放在方法区的。ide
答:数组没有 length()方法,有 length 的属性。String 有 length()方法。JavaScript 中,得到字符串的长度是经过 length 属性获得的,这一点容易和Java 混淆。函数
答:不对,若是两个对象 x 和 y 知足 x.equals(y) == true,它们的哈希码(hash code)应当相同。Java 对于 eqauls 方法和 hashCode 方法是这样规定的:(1)若是两个对象相同(equals 方法返回 true),那么它们的 hashCode 值必定要相同;(2)若是两个对象的 hashCode 相同,它们并不必定相同。固然,你未必要按照要求去作,可是若是你违背了上述原则就会发如今使用容器时,相同的对象能够出如今 Set 集合中,同时增长新元素的效率会大大降低(对于使用哈希存储的系统,若是哈希码频繁的冲突将会形成存取性能急剧降低)。性能
补充:关于 equals 和 hashCode 方法,不少 Java 程序都知道,但不少人也就是仅仅知道而已,在 Joshua Bloch 的大做《Effective Java》(不少软件公司,《Effective Java》、《Java 编程思想》以及《重构:改善既有代码质量》是Java 程序员必看书籍,若是你还没看过,那就赶忙去亚马逊买一本吧)中是这样介绍 equals 方法的:首先 equals 方法必须知足自反性(x.equals(x)必须返回 true)、对称性(x.equals(y)返回 true 时,y.equals(x)也必须返回true)、传递性(x.equals(y)和 y.equals(z)都返回 true 时,x.equals(z)也必须返回 true)和一致性(当 x 和 y 引用的对象信息没有被修改时,屡次调用x.equals(y)应该获得一样的返回值),并且对于任何非 null 值的引用 x,x.equals(null)必须返回 false。实现高质量的 equals 方法的诀窍包括:1.使用==操做符检查"参数是否为这个对象的引用";2. 使用 instanceof 操做符检查"参数是否为正确的类型";3. 对于类中的关键属性,检查参数传入对象的属性是否与之相匹配;4. 编写完 equals 方法后,问本身它是否知足对称性、传递性、一致性;5. 重写 equals 时老是要重写 hashCode;6. 不要将 equals方法参数中的 Object 对象替换为其余的类型,在重写时不要忘掉@Override 注解。ui
答:Java平台提供了两种类型的字符串:String 和 StringBuffer、StringBuilder,它们能够储存和操做字符串。其中String引用的字符串内容是不能被改变的,而StringBuffer/StringBuilder类表示的字符串对象能够直接进行修改。StringBuilder是Java5中引入的,它和StringBuffer的方法彻底相同,区别在于它是在单线程环境下使用的,由于它的全部方面都没有被synchronized修饰,所以它的效率也比StringBuffer要高。