java基础,面向对象有哪些特性,如何理解。

218 阅读4分钟

面向对象有哪些特性,你对这些特性如何理解?

1. 继承: 继承是从已有类得到继承信息创建新类的过程。继承可以扩展超类的一些功能。或者重写超类的一些方法。

2. 封装: 通常认为封装就是把数据和操作的方法绑定起来,对数据的访问只能通过已经定义好的接口。面向对象的本质就是将现实世界描绘成一系列完全自治,封闭的对象。我们的类中编写的方法就是对实现细节的一种封装。封装就是隐藏一切可以隐藏的东西,向外界提供最简单的编程接口。

3. 多态性: 多态性是允许不同子类型的对象对同一消息做出不同的响应。简单的说就是同样的对象引用调用同样的方法但做了不同的事情。多态性分为编译时的多态性和运行时的多态性。如果将对象的方法视为对象向外提供的服务,那么运行时多态可以解释为:当a系统访问b系统提供给的服务时,b系统有多种提供服务的方式,但一切对a系统来说都是透明的。方法重载实现的是编译时的多态性,而方法重写实现的是运行时的多态性。运行时的多态是面向对象最精髓的东西,要实现多态需要做两件事情:1,方法重写(子类继承父类并重写父类中已有的或抽象的方法);2,对象造型(用父类型引用子类型对象,这样同样的引用调用同样的方法就会根据子类对象的不同而表现出不同的行为)。

4. 抽象: 抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象。抽象只关注对象有哪些属性和行为,并不关注这些行为的细节是什么。

为什么要用clone?

在实际编程中,我们常常会遇到这种情况:有一个对象a,在某一时刻暗中已经包含了一些有效值,此时可能会需要一个和a完全相同的b,并且此后对b的任何改动后不会影响到a中的值,也就是说,a与b是两个独立的对象,但b的初始值是由a对象确定的。在java语言中,用简单的赋值语句是不能满足这种需求的,要满足这种需求虽然有很多途径,但实现clone()方法是其中最简单,最高效的手段。

new一个对象的过程和clone一对象的过程有什么区别?

new操作符的本意是分配内存。程序执行到new操作符时,首先去看new操作符后面的类型,因为知道了类型,才能知道要分配多大的内存空间。分配完内存之后,在调用构造函数,填充对象的各个域,这一步叫做对象的初始化,构造方法返回后,一个对象创建完毕,可以把他的引用发布到外部,在外部就可以使用这个引用操纵这个对象。

clone在第一步和new相似,都是分配内存,调用clone方法时,分配的内存和原对象(即调用clone方法的对象)相同,然后在使用原对象中对应的各个域,填充新对象的域,填充完成之后,clone方法返回,一个新的相同的对象被创建,同样可以把新对象的引用发布到外部。

clone方法执行的深拷贝还是浅拷贝?

clone方法执行的是浅拷贝。

如何进行深拷贝?

如果想深拷贝,这个对象必须要实现cloneable接口,实现clone方法,并且clone方法内部,把该对象引用的其他对象也要clone一份,这就要求这个被引用的对象也要实现cloneable接口并且实现clone方法,那么,按照上面结论,要想实现深拷贝body类,必须在body的clone方法中将head类也要拷贝一份。

static class Body implements Cloneable{   
    public Head head;   
    public Body() {}   
    public Body(Head head) {this.head = head;}   
    @Override  
    protected Object clone() throws CloneNotSupportedException {   
        Body newBody =  (Body) super.clone();    
        newBody.head = (Head) head.clone();   
        return newBody;     
    }   
}   
static class Head implements Cloneable{   
    public  Face face;    
    public Head() {}   
    @Override  
    protected Object clone() throws CloneNotSupportedException {   
        return super.clone();   
            }  
}      
public static void main(String[] args) throws CloneNotSupportedException {    
        Body body = new Body(new Head(new Face()));   
        Body body1 = (Body) body.clone();   
        System.out.println("body == body1 : " + (body == body1) );   
        System.out.println("body.head == body1.head : " +  (body.head == body1.head));   
}
//输出
body == body1 : false 
body.head == body1.head : fals