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