一、面向对象的特性和对这些特性的理解
默认状况下面向对象有3大特性:封装、继承、多态,若是非要说出四大特性,那么就把抽象加上去。程序员
封装:一般认为,封装就是把数据和操做数据的方法绑定起来,对数据的访问只能经过已定义的接口。面向对象的本质就是将现实世界描绘成一系列彻底自治、封闭的对象。咱们在类中编写的方法就是对实现细节的一种封装;咱们编写的的一个类就是对数据和数据操做的封装。能够说,封装就是隐藏一切能够隐藏的东西,只向外界提供最简单的编程接口。
继承:继承是从已有的类中获得继承信息,而且建立新类的过程。提供继承信息的类被称为父类(超类、基类);获得继承信息的类称为子类(派生类)。继承让变化中的软件系统具备了必定的延续性,同时继承也是封装程序中可变因素的重要手段。
多态性:多态性是指容许不一样子类型的对象对同一消息作出不一样的响应。简单地说就是用一样的对象引用调用一样的方法可是作了不一样的事情。多态性分为编译时多态和运行时的多态。若是将对象的方法看做为对象向外界提供的服务,那么运行时多态能够理解为:当A系统访问B系统提供的服务时,B系统有多种提供服务的方式,但一切对A系统来讲都是透明的。方法重载实现的是编译时多态,也称为前绑定,而方法重写实现的是运行时多态,也称为后绑定。运行时的多态是面向对象最精髓的东西,要实现多态须要作两件事:第一是方法重写,子类继承父类并重写父类中已有的或者抽象的方法。第二是,对象造型,用父类型引用子类型对象,这样的引用调用一样的方法就会根据子类对象的不一样而变现出不一样的行为。
抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面。抽象只关注对象有哪些属性和行为,并不关注这些行为的细节是什么。
二、为何须要clone对象?
在实际编程中,咱们经常会遇到这种状况:有一个对象A,在某一时刻A中已经包含了一些有效值,此时可能会须要一个和A彻底相同的新对象B,而且此后B作的任何改动都不会再影响到A,也就是说,A与B是两个彻底独立的个体,可是B的初始值是由A对象肯定的。在Java中,使用简单的赋值语句并不能知足这种需求,知足这种需求是能够有许多其余途径的,可是使用clone()方法无疑是最简单最高效的手段。编程
三、new一个对象和clone一个对象的区别?
new操做符的本意是分配内存:程序执行到new操做符时,首先去看一下new操做符后面的类型,由于知道了类型,才能够根据类型知道须要分配多大的内存空间,分配完内存空间以后,再调用构造函数,填充对象的各个域,这一步叫作对象的初始化。构造方法返回后,一个对象就算建立完毕了,能够把他的引用(地址)发布到外部,在外部就可使用这个引用(地址)来操纵这个对象了。clone在第一步和new是类似的,也是首先分配内存,调用clone方法时,分配的内存和原对象(即调用clone方法的那个对象)相同,而后再使用原对象中对应的各个域去填充新对象的各个域,填充完成以后,clone方法返回,一个新的相同的对象就被建立成功了,一样能够把这个新对象的引用(地址)发布到外部使用。函数
四、Java为何没有goto语句?
goto是Java中的保留字,在目前的版本中Java没有使用,根据Java之父Gosling给出的Java关键字列表,其中有goto和const这两个关键字,可是目前这两个关键字没法使用,在将来版本的Java中会不会启用这两个关键字并不知道,所以有的地方也把他们成为保留字,其实保留字这个词应该是具备更加准确的含义,熟悉C语言编程的程序员都知道,在系统类库中使用过的有特殊意义的单词或单词组合都被视为保留字。(水题,凑个数的,嘿嘿,了解便可)对象
五、Java中&和&&的区别?
&运算符有两种用法:按位与和逻辑与。继承
&&运算符是短路与运算,逻辑与和短路与的差异仍是很大的,虽然两者都是要求运算符左右两边都为true整个表达式的值才是true。接口
&&之因此被称为短路与是由于若是&&左边的表达式为false,则右边的表达式会被直接短路掉,不会再执行了,在实际开发中,咱们可能更多时候须要的是&&。例如在验证用户登陆断定用户名不是null并且也不是空字符串的时候,应该写为username != null && !username.equals(""),注意:两者的顺序不能改变!更不能使用&,由于第一个条件若是不成立,根本不能进行空字符串的equals比较,不然会产生NullPointerException异常。内存
逻辑或|和短路或||的差异也是如此。开发
六、==和equals的区别?
equals和==最大的区别就是:equals是一个方法,==是一个运算符!字符串
==:若是比较的对象是基本数据类型,则比较的是数值是否相等,若是比较的双方是引用数据类型,则比较的是引用对象的地址值是否相同。io
equals():用来比较两个对象的内容是否相同,equals方法不能用于基本数据类型的变量,若是没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址。
七、抽象方法(abstract)是否能够同时是静态的?是否同时是本地的(native)?是否能够同时是synchronized?
都不能。抽象方法须要子类重写,而静态的方法都是没法被重写的,所以两者是矛盾的。本地方法由本地代码(C/C++)实现的,抽象方法是没有实现的,也是矛盾的。synchronized和方法的实现细节有关系,抽象方法不涉及具体实现细节,所以也是互相矛盾的。
八、静态变量和实例变量的区别是什么?
静态变量:被static修饰符修饰的变量就是静态变量,也称为类变量,它是属于类的,不属于类的任何一个对象,一个类无论建立多少个对象,静态变量在内存中有且仅有一个。静态变量能够实现让多个对象共享内存。
实例变量:实例变量必须依存于某一具体的实例,须要首先建立对象,而后经过对象才能够访问到它。
九、break和continue的区别是什么?
break和continue都是用来控制循环语句的,break用于彻底结束一个循环,跳出循环体执行循环后面的语句,continue用于跳出本次循环,继续判断循环条件是否知足,知足的话继续执行下次循环。
十、抽象类(abstract)和接口(interface)之间有什么异同?
不一样:
抽象类:
抽象类中能够定义构造器;
抽象类中能够有抽象方法和具体方法;
抽象类中能够定义成员变量;
有抽象方法的类必须被定义为抽象类,而抽象类中没必要必定要有抽象方法;
抽象类中能够包含静态方法;
一个类只能继承一个抽象类;
抽象类中的成员能够是private、默认、protected、public的。
接口:
接口中不能定义构造器;
接口中的方法所有是抽象方法,不包含具体实现;
接口中的成员所有是public的;
接口中定义的成员变量实际上都是常量;
接口中不能有静态方法
一个类能够实现多个接口。
相同:
接口和抽象类都不能实例化; 抽象类和接口类型均可以做为引用类型; 一个类若是继承了某个抽象类或者实现了某个接口,都须要对其中的抽象方法进行所有实现,不然该类仍然须要被声明为抽象类。