多态:可以理解为事物存在的多种体现形态。
人:男人,女人
动物:猫,狗
猫 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();
}
}