------- android培训、java培训、期待与您交流! ----------
多态
多态字面上的意思就是多种形态。在面向对象语言中,我们可以将函数的形参定义为一个父类类型,而在真正调用该函数时这个父类类型的所有子类对象都可以传入,根据传入的子类对象不同函数可以运行处多种形态。
-
定义:某一类中事物的多种形态。
-
例:动物中的狗。狗这个对象对应的是类型是狗类型。 猫 a = new 猫();同时猫也属于动物类,所以说 动物 b = new 毛();也是正确的。
-
-
多态的体现:
-
父类的引用指向了自己的子类对象。(父类的引用也可以接收自己的子类对象)
-
-
多态的前提
-
必须是类与类之间有关系,要么继承,要么实现。
-
存在覆盖,子类覆盖父类的功能。
-
-
多态的好处
-
多态的出现大大的提高了程序的扩展性。
-
- 多态的弊端:
-
虽然提高了扩展性,但是只能使用父类的应用访问父类中定义好的方法。
-
-
多态的类型转换:判断所属类型的关键字instanceof
-
类型提升(向上转型):如 Animal a = new Cat(); 把猫的类型提升成了动物。此时a能调用的方法只能是在Animal中定义或声明的方法。如果a想调用猫的特有方法,就必须先把猫向下转型。
-
向下转型:强制将父类的引用转化成原本的子类类型。以Animal a = new Cat()为例,将a转换成猫类型,Cat b=(Cat)a.。现在则就可以用b去调用Cat的 特有功能。
-
-
多态使用的注意事项:
-
多态中成员特点:
-
函数的特点:
-
在编译时期:参阅引用型变量所属的类中是否有调用的方法。如果有,编译通过,如果没有编译失败。
-
在运行时期:参阅对象所属的类中是否有调用的方法。
-
简单总结就是:成员函数在多态调用时,编译看左边,运行看右边。
-
-
成员变量的特点;
-
无论编译和运行,都参考左边(引用型变量所属的类)
-
-
静态成员函数的特点:
-
无论编译和运行,都参考做左边。
-
-
-
多态的应用:(电脑PCI接口)
-
需求:电脑运行实例,电脑运行基于主板。
-
代码:
interface PCI //定义PCI接口 { public void open(); public void close(); } class MainBoard //定义主板,主板中有使用PCI的方法 { public void run() { System.out.println("mainboard run "); } public void usePCI(PCI p)//使用PCI的方法 { if(p!=null) { p.open(); p.close(); } } } class NetCard implements PCI //定义网卡实现PCI接口,以便被主板调用 { public void open() { System.out.println("netcard open"); } public void close() { System.out.println("netcard close"); } } class SoundCard implements PCI //定义声卡实现PCI接口,以便被主板调用 { public void open() { System.out.println("SoundCard open"); } public void close() { System.out.println("SoundCard close"); } } class DuoTaiDemo5 //主函数 { public static void main(String[] args) { MainBoard mb = new MainBoard(); //电脑运行过程。 mb.run(); mb.usePCI(null); mb.usePCI(new NetCard()); mb.usePCI(new SoundCard()); } }
-
Object类
Object:超类,是所有类的父类。在该类中定义的功能是所有类所具备的基本功能。所有的类(除了Object类),都是该类的子类,即使不书写继承,系统也会自动继承该类,所以Object是整个Java语言继承树的唯一一个根
-
equals方法:
-
JAVA中认为所有的对象都具有比较性,都能判断是否是同一个对象。
-
其实比较的是内存地址值。(堆内的地址)
-
方法使用:boolean equals(Object b),说明可以接收任何类型的对象。
-
Object类中已经提供了对对象是否相同的方法,如果自定义类中也有比较的功能,没有必要重新定义,只需要复写equals方法就好了。
-
-
equals的使用:
- 使用Object中定义的方法不进行复写。
class Person //定义Person类 { private String name; Person(String name) { this.name = name; } } class EqualsDemo1 { public static void main(String[] args) { Person p = new Person("Li,Si"); Person q = new Person("Zhang,San"); Person d = p; System.out.println(p.equals(d));//将上面的三个对象进行比较,看是否是同一个对象 System.out.println(p.equals(q)); } }
- 将原有方法复写,建立自己比较方式。在Object类中方法的实现比较简单,如果真正需要在项目中进行比较时,这个equals方法的作用是无法达到实际的要求的。所以如果在项目中涉及的类需要比较该类型的对象时,则必须覆盖equals方法。
class Demo { private int num; Demo(int num) { this.num = num; } public boolean equals(Object b) //复写原来的比较方式, { if (b instanceof Demo) //判断是否属于该类,增加程序的健壮性 { Demo d = (Demo) b; return this.num == d.num; } return false; } } class EqualsDemo { public static void main(String[] args) { Demo a = new Demo(5); Demo b = new Demo(5); System.out.println(a.equals(b)); } }
- 使用Object中定义的方法不进行复写。
- toString方法:
- 在JAVA中所有的对象都可以被打印输出。toString方法是显示对象内容时会被系统自动调用的方法,当输出一个对象的内容时,系统会自动调用该类的toString方法。
toString
方法返回一个字符串,该字符串由类名(对象是该类的一个实例)、at 标记符“@
”和此对象哈希码的无符号十六进制表示组成。换句话说,该方法返回一个字符串,它的值等于:getClass().getName() + '@' + Integer.toHexString(hashCode())
- 在JAVA中所有的对象都可以被打印输出。toString方法是显示对象内容时会被系统自动调用的方法,当输出一个对象的内容时,系统会自动调用该类的toString方法。