多态:可以理解为事物存在的多种体现形态。
人:男人,女人
动物:猫,狗
猫 x = new 猫();
动物 x = new 猫();
1,多态的体现
父类的引用指向了自己的子类对象。
父类的引用也可以接受自己的子类对象。
2,多态的前提
必须是类与类之间有关系。要么继承,要么实现。
通常还有一个前提:存在覆盖
3,多态的好处
多态的出现大大的提高了程序的扩展性。
4, 多态的弊端:
提高了扩展性,但是只能使用父类的引用访问父类中的成员。
5,多态的应用代码中的特点(多态使用的注意事项)
6, 多态的出现
abstract classAnimal
{abstract voideat();
}class Cat extendsAnimal
{public voideat()
{
System.out.println("吃鱼");
}public voidcatchMouse()
{
System.out.println("抓老鼠");
}
}class Pig extendsAnimal
{public voideat()
{
System.out.println("吃饲料");
}public voidgongDi()
{
System.out.println("拱地");
}
}class Dog extendsAnimal
{public voideat()
{
System.out.println("吃骨头");
}public voidkanJia()
{
System.out.println("看家");
}
}classDuoTaiDemo
{public static voidmain(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(newDog());
}public static voidfunction(Animal a)
{
a.eat();if(a instanceofCat)
{
Cat c=(Cat)a;
c.catchMouse();
}else if(a instanceofDog)
{
Dog c=(Dog)a;
c.kanJia();
}
}
}
/*基础班学生:
学习,睡觉。
高级版学生
学习,睡觉。
可以将这两类事物进行抽取。*/
abstract classStudent
{public abstract voidstudy();public voidsleep()
{
System.out.println("躺着睡");
}
}class BassStudent extendsStudent
{public voidstudy()
{
System.out.println("bass study");
}public voidsleep()
{
System.out.println("坐着睡");
}
}class AdvStudent extendsStudent
{public voidstudy()
{
System.out.println("Advance study");
}
}classDoStudent
{public voiddoSomething(Student stu)
{
stu.study();
stu.sleep();
}
}public classDuotaiDemo2
{public static voidmain(String[] args)
{
DoStudent ds= newDoStudent();
ds.doSomething(newBassStudent());
ds.doSomething(newAdvStudent());//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();
}*/}
在多态中成员函数的特点:
在编译时期:参阅引用型变量所属的类中是否有调用的方法。
如有,编译通过,如果没有,编译失败。
在运行时期:参阅对象所属的类中是否有调用的方法。
简单总结就是:成员函数在多态调用时,编译看左边,运行看右边。
在多态中,成员变量的特点:
无论编译和运行,都参考左边(引用型变量所属的类)
在多态中,静态成员函数的特点:
无论编译和运行,都参考左边
classFu
{voidmethed1()
{
System.out.println("fi method1");
}voidmethed2()
{
System.out.println("fi method2");
}
}class Zi extendsFu
{voidmethed1()
{
System.out.println("zi method1");
}voidmethed3()
{
System.out.println("zi method3");
}
}classDuotaiDemo3
{public static voidmain(String[] args)
{//System.out.println("Hello World!");
Fu f = newZi();
f.methed1();
f.methed2();//f.methed3();
}
}
/*需求
电脑运行实例,
电脑运行基于主板。*/
interfacePCI
{public voidopen();public voidclose();
}classMainBoard
{public voidrun()
{
System.out.println("mainboard run");
}public void usePCI(PCI p) //PCI p = new NetCard(); 接口型引用指向自己的子类对象
{if( p!=null)
{
p.open();
p.close();
}
}
}class NetCard implementsPCI
{public voidopen()
{
System.out.println("netcard open");
}public voidclose()
{
System.out.println("netcard close");
}
}class SoundCard implementsPCI
{public voidopen()
{
System.out.println("netcard open");
}public voidclose()
{
System.out.println("netcard close");
}
}public classDuoTaiDemo4
{public static voidmain(String[] args)
{
MainBoard mb= newMainBoard();
mb.run();//mb.usePCI(null);
mb.usePCI(newNetCard());
}
}
/*Object:是所有对象的直接或者间接父类,传说中的上帝。
该类中定义的肯定是所有对象都具备的功能。
Object类中已经提供了对象是否相同的比较方法。*/
class Demo //extends Object
{private intnum;
Demo(intnum)
{this.num =num;
}public booleanequals(Object obj)
{
Demo d=(Demo)obj;return this.num ==d.num;
}
}classObjectDemo
{public static voidmain(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,关闭数据库里连接*/
interfaceUserInfoDao
{public voidadd(User user);public voiddelete(User user);
}class UserInfoByJDBC implementsUserInfoDao
{public voidadd(User user)
{1,连接数据库。;2,使用sql添加语句添加数据库。;3,关闭连接。;
}public voiddelete(User user)
{1,连接数据库。;2,使用sql添加语句删除数据库。;3,关闭连接。;
}
}classDBOperate
{public static voidmain(String[] args)
{
UserInfoByJDBC ui= newUserInfoByJDBC();
ui.add(User);
ui.delete();
}
}