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

人:男人,女人

动物:猫,狗

猫 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和apache的特点优点和使用场景

    Apache   Apache是世界使用排名第一的Web服务器软件.它可以运行在几乎所有广泛使用的计算机平台上,由于其跨平台和安全性被广泛使用,是最流行的Web服务器端软件之一.   Apache源于 ...

  2. 诡异的SpriteKit 游戏查错

    在Endless Runner 游戏中,做了一些atlas后,发现有个问题,当player跳跃起来的时候,发现他没有动画了,被默认的X图片代替.原来的图像是这样的. 在增加了一些动画后,我的效果就成这 ...

  3. UVA10305 拓扑排序

    网址:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=117863#problem/B 思路分析:裸的拓扑排序,注释在代码中. 代码: #i ...

  4. 范围for语句 && 列表初始值&& 标准库函数begin和end

    范围for语句: 引入的意义:简化传统for的编写,主要用于遍历给定序列中的每个元素并对序列中的每个值执行某种操作,其语法形式是: for( 声明: 给定序列) { 执行的操作. } 其中,“给定序列 ...

  5. 在msvc中使用Boost.Spirit.X3

    Preface “Examples of designs that meet most of the criteria for "goodness" (easy to unders ...

  6. Session与Cookie间不得不说的一些事

    在很久很久以前,刚有浏览器和网页的时候,web开发者发现了一个问题,我必须要在客户端这边保存一些东西才能实现某些功能,比如大家喜闻乐见的购物车.用户登录.自动登陆等.但是客户端只有一个浏览器,怎么在用 ...

  7. 【Nutch2.2.1基础教程之3】Nutch2.2.1配置文件

    nutch-site.xml 在nutch2.2.1中,有两份配置文件:nutch-default.xml与nutch-site.xml. 其中前者是nutch自带的默认属性,一般情况下不要修改. 如 ...

  8. ashx中session的使用

    在平常的页面上是用是很容易就的到request,response对像,从而对其进行一些操作,但在ashx(一般处理程序)中却是有一点的不同, 在ashx你无法正常的使用session,即 contex ...

  9. Apache服务器安装配置(win版)

    登录http://httpd.apache.org/download.cgi 这个地址,找到2.4.10,如下图位置: 2 进入如下界面后,选择第一项ApacheHaus,这是个第三方下载平台,在它的 ...

  10. hibernate多对多映射文件详解(一)

    1.仓库表属性 public class WarehouseNew implements java.io.Serializable { // Fields private static final l ...