多态:可以理解为事物存在的多种体现形态。

人:男人,女人

动物:猫,狗

猫 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();
}
}

Java学习——多态的更多相关文章

  1. Java学习--多态

    1. 多态 多态:同一个对象(实物),在不同时刻体现出来的不同状态 多态的前提: A:要有继承关系 B:要有方法重写 C:要有父类引用指向子类对象 父类 f = new 子类() 多态中的成员访问特点 ...

  2. Java学习--封装、继承、多态

    接下来几天会根据http://www.cnblogs.com/chenssy/category/525010.html中讲解的java内容做个学习笔记,在此感谢一下这位大仙!! 一.封装 对于封装而言 ...

  3. [ Java学习基础 ] Java的继承与多态

    看到自己写的东西(4.22的随笔[ Java学习基础 ] Java构造函数)第一次达到阅读100+的成就还是挺欣慰的,感谢大家的支持!希望以后能继续和大家共同学习,共同努力,一起进步!共勉! ---- ...

  4. Java学习笔记9(面象对象9:多态)

    多态概述 多态是继封装.继承后,面对对象的第三大特性. 现实事物经常会出现多态,如学生,学生是人的一种,则一个具体的同学张三既是学生也是人,即出现两种形态. Java作为面向对象的语言,同样可以描述一 ...

  5. 学习博客之Java继承多态接口

    这一篇博客主要是对软工前一阶段学习的总结,主要是对Java的学习总结,包括三部分:Java的继承.多态和接口 Java的继承 继承是面向对象的三大特性之一,能够实现软件的复用. Java子类继承父类的 ...

  6. Java 学习笔记 ------第六章 继承与多态

    本章学习目标: 了解继承的目的 了解继承与多态的关系 知道如何重新定义方法 认识java.lang.object 简介垃圾回收机制 一.继承 继承是java面向对象编程技术的一块基石,因为它允许创建分 ...

  7. Java 学习(12):重写(Override)与重载(Overload) & 多态

    目录 --- 重写 --- 重载 --- 多态 重写(Override) 重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变.即外壳不变,核心重写! 重写的好处在于子类可 ...

  8. 《Java学习笔记(第8版)》学习指导

    <Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...

  9. 深入Java核心 Java中多态的实现机制(1)

    在疯狂java中,多态是这样解释的: 多态:相同类型的变量,调用同一个方法时,呈现出多中不同的行为特征, 这就是多态. 加上下面的解释:(多态四小类:强制的,重载的,参数的和包含的) 同时, 还用人这 ...

随机推荐

  1. Nginx Configure时配置

    Configure Arguments Configure arguments common for nginx binaries from pre-built packages for stable ...

  2. JS 图片预览功能

    <script type="text/javascript">    function DisplayImage(fileTag) {        document. ...

  3. RadGrid SelectedIndexChanged 事件没反应的解决方法

    Hello Hrushikesh, You can set ClientSettings.EnablePostBackOnRowClick to true along with ClientSetti ...

  4. jquery select三级联动

    需求:对地区进行选择,选择相应的省,就会出现相应范围的市,然后出现相应的范围的县区:如果县不存在,就不现实,自我要求是自己写个简单的插件,方便以后调用: 逻辑:1.通过div的类名来获取,其下的sel ...

  5. MvcPager概述

    MvcPager 概述   MvcPager分页控件是在ASP.NET MVC Web应用程序中实现分页功能的一系列扩展方法,该分页控件的最初的实现方法借鉴了网上流行的部分源代码, 尤其是ScottG ...

  6. gridview中判断隐藏还是现实

    <asp:TemplateField HeaderText="呼出" HeaderStyle-Width="60px" HeaderStyle-Horiz ...

  7. 递归实现全排列序列C语言实现

    大家好,我是小鸭酱,博客地址为:http://www.cnblogs.com/xiaoyajiang 以下鄙人用递归回溯的办法,采用C语言实现了全排列序列,用以某些优化方案的原始方案的给定 #incl ...

  8. BZOJ 1068 (区间DP)

    题意:字符串的压缩,f[l][r][0]代表还没M,f[l][r][1]代表有M. #include<cstdio> #include<cmath> #include<c ...

  9. 字符串转换为float<2>

    Configuration OK zjtest7-frontend:/usr/local/logstash-2.3.4/config# ../bin/logstash -f g01.conf Sett ...

  10. 【转】linux tree命令以树形结构显示文件目录结构 ---- 不错

    原文网址:http://jingyan.baidu.com/article/acf728fd19c7eff8e510a3eb.html 今天小编来给分享Linux 系统下一个非常有用的命令的使用:tr ...