![黑马程序员_复习_Day06 - 九五二七 - 今天](http://img2.ph.126.net/v1DytpgJnDkmmfHSMNzCvA==/1288029493446043733.png)
类与类之间存在着继承关系,类与接口中间存在的是实现关系。
继承用extends;实现用implements ;
![黑马程序员_复习_Day06 - 九五二七 - 今天](http://img2.ph.126.net/1qBc2I2rD0i-Rfo8njlu-w==/6597788847263046995.png)
![黑马程序员_复习_Day06 - 九五二七 - 今天](http://img0.ph.126.net/drT5aCAq8ZVkQ9Vn8k99zQ==/6597858116495594991.png)
接口都用于设计上,设计上的特点:(可以理解主板上提供的接口)
1:接口是对外提供的规则。(主板都遵守国际标准化,都遵守这个规则)
2:接口是功能的扩展。
3:接口的出现降低了耦合性。(可以实现模块化开发,不用大家一起开发)
抽象类与接口:
抽象类:一般用于描述一个体系单元,将一组共性内容进行抽取
可以在类中定义抽象内容让子类实现,可以定义非抽象内容让子类直接使用。
它里面定义的都是一些体系中的基本内容。
接口:一般用于定义对象的扩展功能,是在继承之外还需这个对象具备的一些功能。
抽象类和接口的共性:都是不断向上抽取的结果。
抽象类和接口的区别:
1:抽象类只能被继承,而且只能单继承。
接口需要被实现,而且可以多实现。
2:抽象类中可以定义非抽象方法,子类可以直接继承使用。
接口中都是抽象方法,需要子类去实现。
3:抽象类使用的是 is a 关系。
接口则使用的是 like a 关系。
4:抽象类的成员修饰符可以自定义。
接口中的成员修饰符是固定的,全都是public的。
在开发之前,先定义规则,A和B分别开发,A负责实现这个规则,B负责使用这个规则。
至于A是如何对规则具体实现的,B是不需要知道的。这样就降低了A和B直接耦合性。
![黑马程序员_复习_Day06 - 九五二七 - 今天](http://img2.ph.126.net/vHubwZMSgYZeOXcdeCymEA==/6597808638472351172.png)
![黑马程序员_复习_Day06 - 九五二七 - 今天](http://img0.ph.126.net/IUUxthw3Guo9_obHDYS4Pw==/1848446172159311499.png)
![黑马程序员_复习_Day06 - 九五二七 - 今天](http://img0.ph.126.net/6bcmMntGBG20X04zwqFsuA==/2848526764412690733.png)
![黑马程序员_复习_Day06 - 九五二七 - 今天](http://img0.ph.126.net/CXTRj9wuxu2ny1DciFlr1A==/6608790560608153407.jpg)
如果想用子类对象的特有方法,如何判断对象是哪个具体的子类类型呢?
格式:<对象 instanceof 类型> ,判断一个对象是否所属于指定的类型。
Student instanceof Person = true; (student继承了person类)
1,成员变量:在多态中,子父类成员变量同名。
在编译时期:参考的是引用型变量所属的类中是否有调用的成员。(编译时不产生对象,只检查语法错误)
运行时期:也是参考引用型变量所属的类中是否有调用的成员。
简单一句话:无论编译和运行,成员变量参考的都是引用变量所属的类中的成员变量。
再说的更容易记忆一些:成员变量 --- 编译运行都看 = 左边。
2,成员函数。
编译时期:参考引用型变量所属的类中是否有调用的方法。
运行事情:参考的是对象所属的类中是否有调用的方法。
为什么是这样的呢?因为在子父类中,对于一模一样的成员函数,有一个特性:覆盖。
简单一句:成员函数,编译看引用型变量所属的类,运行看对象所属的类。
更简单:成员函数 --- 编译看 = 左边,运行看 = 右边。
3,静态函数。
编译时期:参考的是引用型变量所属的类中是否有调用的成员。
运行时期:也是参考引用型变量所属的类中是否有调用的成员。
为什么是这样的呢?因为静态方法,其实不所属于对象,而是所属于该方法所在的类。
调用静态的方法引用是哪个类的引用调用的就是哪个类中的静态方法。
简单说:静态函数 --- 编译运行都看 = 左边。
对于静态方法调用时:父类走父类 子类走子类(面试易问)
多态的主板示例:
![黑马程序员_复习_Day06 - 九五二七 - 今天](http://img0.ph.126.net/hBobolsdwncM7eQ-0DcQIw==/6608413428120988644.png)
多态连接数据库示例:
需求:数据库的操作。
数据是:用户信息。
1,连接数据库。JDBC Hibernate
2,操作数据库。
c create r read u update d delete
3,关闭数据库连接。
![黑马程序员_复习_Day06 - 九五二七 - 今天](http://img1.ph.126.net/FxLs7n30XNgo1TAKlMM2Pw==/6608188028237296819.png)
Object以及equals
一直在谈继承,子继承父,父还有没有父类,构造函数中第一行语句都是隐式的是super语句,通过它来访问父类。那么父类应该是有父类的
API:
public class Object
类 Object
是类层次结构的根类。每个类都使用 Object
作为超类。所有对象(包括数组)都实现这个类的方法。
Class Object
is the root of the class hierarchy. Every class has Object
as a superclass. All objects, including arrays, implement the methods of this class.
Object:是所有对象的直接后者间接父类,传说中的上帝。
Object: Java认为所有的对象都具备一些基本的共性内容,这些内容可以不断的向上抽取,最终就抽取到了一个最顶层的类中的,该类中定义的就是所有对象都具备的功能。
该类中定义的肯定是所有对象都具备的功能(不断向上抽取最后成了Object类)
![黑马程序员_复习_Day06 - 九五二七 - 今天](http://img0.ph.126.net/iuLUVBuT3cZPkvGNIawIMQ==/6608491493445542856.png)
![黑马程序员_复习_Day06 - 九五二七 - 今天](http://img2.ph.126.net/hi3rDrxdIFW2LTVfx9m1nw==/6608179232144271239.png)
Java认为所有的对象都具备比较性,都能比较两个对象是否相同。只要是实体,就可比较是同一个实体。所有对象都具备的方法,一定定义在Object类中
![黑马程序员_复习_Day06 - 九五二七 - 今天](http://img1.ph.126.net/OeF8Xt1C4iAt7mm9XZSx1Q==/6608747679654814921.png)
可以看住其实比较的是地址值。(不同类型的都可比较,因为只比较地址,与类型无关)
![黑马程序员_复习_Day06 - 九五二七 - 今天](http://img0.ph.126.net/Tw9Z81JgiOofri_S2QJ4cw==/6608615738259481641.png)
![黑马程序员_复习_Day06 - 九五二七 - 今天](http://img1.ph.126.net/pq-MYl2RFs6Oz2R5Pb8kZQ==/6608781764515276120.png)
自己敲得equals出现的错误
![黑马程序员_复习_Day06 - 九五二七 - 今天](http://img1.ph.126.net/akK70NZ9bxTUva0V4xTEMw==/6608259496493098564.png)
toString()
Java又认为所有的对象都能变成字符串被打印.
故也把toString归到Object类上。
![黑马程序员_复习_Day06 - 九五二七 - 今天](http://img2.ph.126.net/9MQ-e-5zMZVjmxfnH_c0bA==/6608181431167526762.png)
为了对象对应的字符串内容有意义,可以通过复写,建立该类对象自己特有的字符串表现形式。类似覆写equals方法,让toString打印自己定义的内容
![黑马程序员_复习_Day06 - 九五二七 - 今天](http://img0.ph.126.net/2KHNbDoYf_oDZRThwcvloA==/3684225970266186210.png)
虽然所有的Object中方法都要覆写定义自己的内容,但是不能抽象,
抽象是强迫子类一定要用Object类中的方法,而此刻只是用就覆写,不用就do nothing.