------
Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
第四讲 面向对象4--多态
1.多态-概念
多态:可以理解为事物存在的多种体现形态。
人:男人,女人
动物:猫,狗。
猫 x = new 猫();
动物 x = new 猫();
人:男人,女人
动物:猫,狗。
猫 x = new 猫();
动物 x = new 猫();
2.多态-扩展性
Animal c = new Cat(); //一个对象可以有多种形态。动物可以是猫,狗,猪。。。
c.eat();
public static void function(Animal a) //Animal a = new Cat();
{
a.eat();
//a.catchMouse();
}
/*
public static void function(Cat c)//
{
c.eat();
}
public static void function(Dog d)
{
d.eat();
}
public static void function(Pig p)
{
p.eat();
}
*/
1,多态的体现
父类的引用指向了自己的子类对象。
父类的引用也可以接收自己的子类对象。
2,多态的前提
必须是类与类之间有关系。要么继承,要么实现。
通常还有一个前提:存在覆盖。
3,多态的好处
多态的出现大大的提高程序的扩展性。
4,多态的弊端:
提高了扩展性,但是只能使用父类的引用访问父类中的成员。
3.多态-转型
Animal a = new Cat();//类型提升。 向上转型。
a.eat();
//如果想要调用猫的特有方法时,如何操作?
//强制将父类的引用。转成子类类型。向下转型。
Cat c = (Cat)a;
c.catchMouse();
//千万不要出现这样的操作,就是将父类对象转成子类类型。
//我们能转换的是父类应用指向了自己的子类对象时,该应用可以被提升,也可以被强制转换。
//多态自始至终都是子类对象在做着变化。
Animal a = new Animal();
Cat c = (Cat)a;
4.多态-示例
/*
基础班学生:
学习,睡觉。
高级班学生:
学习,睡觉。
可以将这两类事物进行抽取。
*/
abstract class Student{
public abstract void study();
public void sleep(){
System.out.println("躺着睡");
}
}
class BaseStudent extends Student{
public void study(){
System.out.println("base study");
}
public void sleep(){
System.out.println("坐着睡");
}
}
class AdvStudent extends Student{
public void study(){
System.out.println(" adv study");
}
}
<pre name="code" class="java">class DoStudent{
public void doSome(Student stu){
stu.study();
stu.sleep();
}
}
class DuoTaiDemo3{
public static void main(String[] args) {
DoStudent ds = new DoStudent();
ds.doSome(new BaseStudent());
ds.doSome(new AdvStudent());
// BaseStudent bs = new BaseStudent();
// bs.study();
// bs.sleep();
// AdvStudent as = new AdvStudent();
// as.study();
// as.sleep();
}
}
5.多态中成员的特点
在多态中成员函数的特点:(非静态的)
在编译时期:参阅引用型变量所属的类中是否有调用的方法。如果有,编译通过,如果没有编译失败。
在运行时期:参阅对象所属的类中是否有调用的方法。
简单总结就是:成员函数在多态调用时,编译看左边,运行看右边。
在编译时期:参阅引用型变量所属的类中是否有调用的方法。如果有,编译通过,如果没有编译失败。
在运行时期:参阅对象所属的类中是否有调用的方法。
简单总结就是:成员函数在多态调用时,编译看左边,运行看右边。
在多态中,成员变量的特点:
无论编译和运行,都参考左边(引用型变量所属的类)。
无论编译和运行,都参考左边(引用型变量所属的类)。
在多态中,静态成员函数的特点:
无论编译和运行,都参考做左边。
无论编译和运行,都参考做左边。
6.多态的主板示例
/*
需求:
电脑运行实例,
电脑运行基于主板。
*/
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");
method();
}
}
class SoundCard implements PCI{
public void open(){
System.out.println("SoundCard open");
}
public void close(){
System.out.println("SoundCard close");
}
}
/*
class MainBoard
{
public void run()
{
System.out.println("mainboard run");
}
public void useNetCard(NetCard c)
{
c.open();
c.close();
}
}
class NetCard
{
public void open()
{
System.out.println("netcard open");
}
public void close()
{
System.out.println("netcard 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());
}
}
上边的例子要重点掌握,用到了接口,多态,增加了多态的扩展性。注释中是最初的设计方案,但是是死程序,不支持扩展。
7.多态的扩展示例
/*
需求:数据库的操作。
数据是:用户信息。
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 UserInofDao{
public void add(User user){
1,JDBC连接数据库。;
2,使用sql添加语句添加数据。;
3,关闭连接。
}
public void delete(User user){
1,JDBC连接数据库。;
2,使用sql添加语句删除数据。;
3,关闭连接。
}
}
class UserInfoByHibernate implements UserInfoDao{
public void add(User user){
1,Hibernate连接数据库。;
2,使用sql添加语句添加数据。;
3,关闭连接。
}
public void delete(User user){
1,Hibernate连接数据库。;
2,使用sql添加语句删除数据。;
3,关闭连接。
}
}
class DBOperate{
public static void main(String[] args) {
//UserInfoByJDBC ui = new UserInfoByJDBC();
<span style="white-space:pre"> </span>//UserInfoByHibernate ui = new UserInfoByHibernate();
UserInfoDao ui = new UserInfoByHibernate(); //多态
ui.add(user);
ui.delete(user);
}
}
8.Object类-equals()
Object:是所有对象的直接后者间接父类,传说中的上帝。
该类中定义的肯定是所有对象都具备的功能。
Object类中已经提供了对对象是否相同的比较方法。
如果自定义类中也有比较相同的功能,没有必要重新定义。
只要沿袭父类中的功能,建立自己特有比较内容即可。这就是覆盖。
该类中定义的肯定是所有对象都具备的功能。
Object类中已经提供了对对象是否相同的比较方法。
如果自定义类中也有比较相同的功能,没有必要重新定义。
只要沿袭父类中的功能,建立自己特有比较内容即可。这就是覆盖。
9.Object类-toString()
java认为所有对象都能变成字符串被打印。