每天三道面试题2019-09-11

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/HardToFindName/article/details/100749866

1、面向对象有哪些特性和说说你对它们的理解

  1. 封装性,通常认为封装是把数据和操作数据的方法绑定起来,对数据的访问只能通过已定义的接口。面向对象的本质就是将现实世界描绘成一系列完全自治、封闭的对象。我们在类中编写的方法实现了对细节的封装;我们编写一个类就是对数据和数据操作的封装。封装就是隐藏一切可以隐藏的东西,对外界只提供最简单的编程接口。
  2. 继承性,继承是指从已有类得到继承信息创建新的类的过程。提供继承信息的类称为父类,得到继承信息的类称为子类。继承让变化中的软件系统有了一定的延续性,同时继承也是封装程序中可变因素的重要手段。
  3. 多态性,多态是指允许不同子类型的对象对同一消息做出不同响应。简单来说就是使用相同的对象引用调用同样的方法但是做出不同的事情。多态分为编译时多态和运行时多态。如果把对象的方法视为对外界提供的服务,那么可以将运行时多态解释为:当A系统访问B系统的服务时,B系统可以有很多种提供服务的方式,但是这一切对A来说都是透明的。方法的重载实现的是编译时多态(也称为前绑定),方法重写实现的是运行时的多态(也称为后绑定),其中运行时多态是面向对象最精髓的东西,实现运行时多态需要做两件事情:其一为方法重写,其二为对象造型(用父类引用引用子类的对象,这样同样的引用调用同样的方法就会根据不同子类对象的实现而表现出不同的行为)。
  4. 抽象性,抽象是将一类对象相同的特征总结出来构造类的过程,包括对数据和方法的抽象,抽象只关注对象的属性和行为,但不关心这些行为的细节。

2、访问权限修饰符有哪些及它们的权限

修饰符 当前类 子类 同包 不同包
public 1 1 1 1
protected 1 1 1 0
default 1 0/1 1 0
private 1 0 0 0

其中default权限就是包权限,当子类在同包下可以访问,不同包下不可访问。

3、说说new一个对象和clone一个对象的区别

new操作符的本意是分配内存,在程序执行到new操作符时,首先会先去看new操作符后面的类型,知道了类型之后才能知道分配多大的空间。分配完空间之后,然后调用构造函数,填充对象的各个域,这一步叫做对象的初始化,构造方法返回后,一个对象创建完毕,可以把她的引用发布到外部,在外部就可以通过这个引用操作这个对象。
clone在第一步和new一样,都是先分配内存,调用clone方法时,分配的内存和原对象相同,然后在使用原对象中对应的各个域,填充到新对象的域,填充完成后,clone方法返回,一个新的相同的对象创建完成,同样可以把这个对象的引用发补到外部。
只是调用clone方法的对象要实现Cloneable接口的clone方法。

扩展:
clone方法实现的浅拷贝。
浅拷贝和深拷贝的区别,如一个Peson类:

public class Person implements Cloneable{
	private int age;
	private String name;
	.......
	@Override 
	protected Object clone() throws CloneNotSupportedException { 
		return (Person)super.clone(); 
	}
}

由于age属性是基本类型,直接将一个4个字节的整数值拷贝过来就行。但是name是引用类型,对他的拷贝有两种实现方式:
1、将原对象的name的地址拷贝给新对象的name
2、根据原对象name的属性值创建新的String对象,然后将新的String对象的地址赋给拷贝对象的name。
第一种称之为浅拷贝,第二种称之为深拷贝,可以理解为浅拷贝虽然拷贝对象在外表上表现出和原对象不同,但是其内部和原对象还是有一些关联,这样便会带来一些弊端,如我们修改拷贝对象的name属性时同时也会修改原对象的name属性,这样的情况不是我们愿意看到的。
而深拷贝则是完全根据原有对象创建出全新的对象,它们是两个独立的对象。可以将上面的代码修改如下,得到深拷贝:

public class Person implements Cloneable{
	private int age;
	private String name;
	.......
	@Override 
	protected Object clone() throws CloneNotSupportedException { 
		Person person = (Person)super.clone();
		person.name = new String|(name);
		return person; 
	}
}

猜你喜欢

转载自blog.csdn.net/HardToFindName/article/details/100749866
今日推荐