本来在内存分析那一篇日记讲述了很多方面的内存问题,其实也包含很很多面向对象的内存描述,
但是在准备写IO总结的时候,发现面向对象还是有很多知识点需要总结,而且面向对象也是一类的知识了。
对其总结也是必然的
----------------------------------------------------------------------------------------------------------------------------------------------------------
什么是类?
类就是物体的抽象。
什么对象?
对象就是就是这类事物,实实在在存在个体。
什么是面向对象?
将功能封装进对象,强调具备了功能的对象。
--------------------------------------------------------------------------------------------
其实面向对象呢,很简单,和C语言做个对比吧:
C语言对数据的组织很好,复杂的数据有结构体,但是里面不包含方法,仅仅是数据体,然后通过malloc来长期保存在内存里面,就好像是new 对象一样,在堆空间保存的只是成员变量,但是,java持有this的地址动态绑定,利用自身的属性和方法进行广义的封装。
将属性和方法封装到一起,就好像一个物体,有属性和有行为,这样对于在数据的世界里,认识就更规范了。
本来是利用主函数内方法和结构体来操纵这么多的数据,现在就可以对数据进行模块划分,自身处理自身的行为,再聚集一起形成一个整体,那么耦合性就减少了,程序就易懂易做了,
--------------------------------------------------------------------------------------------
面向对象的特点?
封装(encapsulation):是指隐藏对象的属性和实现细节,仅对外提供公共访问方式。
对于面向对象,我们使用对象的时候不需要知道实现的细节,因为我们需要的是做,而细节就留给帮我们做的这个对象实现,这样不仅仅保护了已写好的代码的安全,而且让调用者方便使用。
继承(inheritance):继承性是子类自动共享父类数据结构和方法的机制,这是类之间的一种关系。在定义和实现一个类的时候,可以在一个已经存在的类的基础之上来进行,把这个已经存在的类所定义的内容作为自己的内容,并加入若干新的内容。
这是我觉得继承的较好的实图,为什么这样说?
因为子类创建的时候,要对其父类创建了才对自身创建。所以父类在子类的里面是比较合适的,这样的效果其实就是让类和类,对象和对象产生了关系;
父类对象有父类对象的属性方法,子类也有子类的属性和方法,当子类继承了父类的属性就有了父类的属性和子类的属性,这样增强的程序的复用性,因为,可能很多年以后我们再写程序的时候就不需要修改父类的方法和属性,直接继承了,再对其扩展就可以了。这样的java体系就显得很稳定。
那么子类如果定义了和父类同名的成员方法和变量呢?
这种情况叫做覆盖,当调用对象的时候出现子类覆盖就会使用子类覆盖的方法和变量。
在一般的情况,对于变量:父类中有了,子类一般就不需要定义
覆盖注意事项:
1,子类覆盖父类时,必须权限要大于等于父类权限。
2,静态不能覆盖非静态。
那么对象是如何构造的呢?
对象的构造需要用到构造函数:构造函数可以本类进行对象初始化,也可以给子类对象进行初始化。
怎么理解呢?其实很简单,对于本来的构造调用自身的构造函数,对于子类的构造,子类的构造方法会先访问了父类的构造方法,就像上图一样,父类对象先出现了,再出现子类对象。
对于一个父类有很多的继承,那么此类究竟是什么?
其实父类是进一步的对子类进行抽象,有很多时候父类是没有必要创建对象的,仅仅为提供给子类继承其共有的属性,所以java就有抽象类的说法。
在C++中有多重继承,为什么java中没有呢?
其实多重继承有很大的限制性,如果两个类有同样的方法,那么子类继承这两个类,调用的那个同样方法究竟是哪一个呢?这样就显得程序有点复杂了,
所以java中定义了接口,提供给类实现,
--------------------------------------------------------------------------------------------
接口
初期理解:接口看上去是一个特殊的抽象类。里面存的都是抽象方法。接口和继承不同,是可以多重实现的。
格式:
1,通过interface来定义。
2,接口中常见成员:常量,抽象方法。
而且这些成员都有固定的修饰符。
常量:public static final
方法:public abstract
3,接口中的成员都是共有的。
4,一个类可以对接口进行多实现,也弥补了多继承带来的安全隐患,所以java对多继承进行了改良。
用多实现方法来体现多继承的特性。
5,一个类可以继承一个类的同时,实现多个接口。
6,接口与接口之间是继承关系,而且可以多继承。
应用特点:
1,接口是对外暴露的规则。
2,接口是功能的扩展。
3,接口的出现降低了耦合性。
--------------------------------------------------------------------------------------------
多态(polymorphism)
某一类事物的多重存在形态。
举个例子:正如汽车火车单车,都是交通工具,有时候我们使用的时候只是想坐车,所以三种交通工具也可以,这样,要是再来了三轮车和摩托车我们一样可以坐
这样就可以提高了扩展性
--------------------------------------------------------------------------------------------
1,多态的体现
父类的引用指向了自己的子类对象。
父类的引用也可以接收自己的子类对象。
2,多态的前提
必须是类与类之间有关系。要么继承,要么实现。
通常还有一个前提:存在覆盖。
3,多态的好处
多态的出现大大的提高程序的扩展性。
4,多态的弊端:
提高了扩展性,但是只能使用父类的引用访问父类中的成员。
--------------------------------------------------------------------------------------------
其实这个内存结构就可以搞清有时子类复写了方法和变量时的操作。
子类复写了父类属性,在多态的时候调用的是父类的变量,因为对象向上转型,指向对象里面的父类对象。
那么为什么多态调用的是复写的方法呢?
因为方法在方法区,类变量指向的还是堆里面的这个对象,找方法的时候也是先找其子类的方法,但是在编译器就要注意,父类没有的方法是不能利用多态调用的,否则要是该子类对象没有该方法,程序就会产生问题,所以在编译期不能利用多态调用父类没有的方法。