Java学习——多态
多态:可以理解为事物存在的多种体现形态。
人:男人,女人
动物:猫,狗
猫 x = new 猫();
动物 x = new 猫();
1,多态的体现
父类的引用指向了自己的子类对象。
父类的引用也可以接受自己的子类对象。
2,多态的前提
必须是类与类之间有关系。要么继承,要么实现。
通常还有一个前提:存在覆盖
3,多态的好处
多态的出现大大的提高了程序的扩展性。
4, 多态的弊端:
提高了扩展性,但是只能使用父类的引用访问父类中的成员。
5,多态的应用代码中的特点(多态使用的注意事项)
6, 多态的出现
abstract class Animal { abstract void eat(); } class Cat extends Animal { public void eat() { System.out.println("吃鱼"); } public void catchMouse() { System.out.println("抓老鼠"); } } class Pig extends Animal { public void eat() { System.out.println("吃饲料"); } public void gongDi() { System.out.println("拱地"); } } class Dog extends Animal { public void eat() { System.out.println("吃骨头"); } public void kanJia() { System.out.println("看家"); } } class DuoTaiDemo { public static void main(String[] args) { /*Cat c = new Cat(); c.eat(); Dog d = new Dog(); d.eat(); */ //Animal a = new Cat();//类型提升,向上转型。 //a.eat(); //如果想要调用猫的特有方法时,如何操作? //强制将父类的引用,转成子类类型。向下转型。 //Cat c = (Cat)a; //c.catchMouse(); //千万不要出现这样的操作,就是讲父类对象转换成子类类型。 //我们能转换的是父类应用指向类自己的子类对象时,该应用可以被提升,也可以被强制转换。 //多态自始至终都是子类对象在做着变化。 //function(new Cat()); function(new Dog()); } public static void function(Animal a) { a.eat(); if(a instanceof Cat) { Cat c = (Cat)a; c.catchMouse(); } else if(a instanceof Dog) { Dog c = (Dog)a; c.kanJia(); } } }
/* 基础班学生: 学习,睡觉。 高级版学生 学习,睡觉。 可以将这两类事物进行抽取。 */ abstract class Student { public abstract void study(); public void sleep() { System.out.println("躺着睡"); } } class BassStudent extends Student { public void study() { System.out.println("bass study"); } public void sleep() { System.out.println("坐着睡"); } } class AdvStudent extends Student { public void study() { System.out.println("Advance study"); } } class DoStudent { public void doSomething(Student stu) { stu.study(); stu.sleep(); } } public class DuotaiDemo2 { public static void main(String[] args) { DoStudent ds = new DoStudent(); ds.doSomething(new BassStudent()); ds.doSomething(new AdvStudent()); // BassStudent bs = new BassStudent(); // bs.study(); // bs.sleep(); // AdvStudent as = new BaseStudent(); // as.study(); // as.sleep(); } /*public void doSomething(Student s) { s.study(); s.sleep(); } */ }
在多态中成员函数的特点:
在编译时期:参阅引用型变量所属的类中是否有调用的方法。
如有,编译通过,如果没有,编译失败。
在运行时期:参阅对象所属的类中是否有调用的方法。
简单总结就是:成员函数在多态调用时,编译看左边,运行看右边。
在多态中,成员变量的特点:
无论编译和运行,都参考左边(引用型变量所属的类)
在多态中,静态成员函数的特点:
无论编译和运行,都参考左边
class Fu { void methed1() { System.out.println("fi method1"); } void methed2() { System.out.println("fi method2"); } } class Zi extends Fu { void methed1() { System.out.println("zi method1"); } void methed3() { System.out.println("zi method3"); } } class DuotaiDemo3 { public static void main(String[] args) { //System.out.println("Hello World!"); Fu f = new Zi(); f.methed1(); f.methed2(); //f.methed3(); } }
/* 需求 电脑运行实例, 电脑运行基于主板。 */ interface PCI { public void open(); public void close(); } class MainBoard { public void run() { System.out.println("mainboard run"); } public void usePCI(PCI p) //PCI p = new NetCard(); 接口型引用指向自己的子类对象 { if( p!=null) { p.open(); p.close(); } } } class NetCard implements PCI { public void open() { System.out.println("netcard open"); } public void close() { System.out.println("netcard close"); } } class SoundCard implements PCI { public void open() { System.out.println("netcard open"); } public void close() { System.out.println("netcard close"); } } public class DuoTaiDemo4 { public static void main(String[] args) { MainBoard mb = new MainBoard(); mb.run(); //mb.usePCI(null); mb.usePCI(new NetCard()); } }
/* Object:是所有对象的直接或者间接父类,传说中的上帝。 该类中定义的肯定是所有对象都具备的功能。 Object类中已经提供了对象是否相同的比较方法。 */ class Demo //extends Object { private int num; Demo(int num) { this.num = num; } public boolean equals(Object obj) { Demo d = (Demo)obj; return this.num == d.num; } } class ObjectDemo { public static void main(String[] args) { Demo d1 = new Demo(4); Demo d2 = new Demo(5); //Demo d3 = d1; //System.out.println(d1.equals(d2)); Class c = d2.getClass(); System.out.println(c.getName() + "@@" + Integer.toHexString(d2.hashCode())); System.out.println(d2.toString()); } }
/* 需求:数据库的操作。 Dao: data access object 1,连接数据库。JDBC Hibernate 2,操作数据库。 c create r read u update d delete 3,关闭数据库里连接 */ interface UserInfoDao { public void add(User user); public void delete(User user); } class UserInfoByJDBC implements UserInfoDao { public void add(User user) { 1,连接数据库。; 2,使用sql添加语句添加数据库。; 3,关闭连接。; } public void delete(User user) { 1,连接数据库。; 2,使用sql添加语句删除数据库。; 3,关闭连接。; } } class DBOperate { public static void main(String[] args) { UserInfoByJDBC ui = new UserInfoByJDBC(); ui.add(User); ui.delete(); } }