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

人:男人,女人

动物:猫,狗

猫 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. Android与JS混编(多图选择器)

       github: https://github.com/weifengzz/AndroidJSSelectImg

  2. java基础2

    //第一个程序 用super访问父类中被隐藏的成员变量和被重写的方法 package foxe; class superClass{ int x; superClass(){ x=4; System. ...

  3. linux下mysql环境支持中文配置步骤

    sql脚本执行前加上: CREATE DATABASE IF NOT EXISTS mydatabase DEFAULT CHARSET utf8 COLLATE UTF8_GENERAL_CI; u ...

  4. 数据泵导出/导入Expdp/impdp

    一下转自 http://blog.csdn.net/jionjionyoushen/article/details/6789686 数据泵导出/导入Expdp/impdp Oracle 10g引入了D ...

  5. hdu1372 BFS求最短路径长度

    C - 广搜 基础 Crawling in process... Crawling failed Time Limit:1000MS     Memory Limit:65536KB     64bi ...

  6. [Leetcode] implement strStr() (C++)

    Github leetcode 我的解题仓库   https://github.com/interviewcoder/leetcode 题目: Implement strStr(). Returns ...

  7. 搭建lamp环境

    虚拟机始终是虚拟机,还是linux用起来舒服得多.话不多说,回到我们的老本行,linux下进行lamp环境搭建吧. 一.安装 1.Apache sudo apt-get install apache2 ...

  8. 数据结构与算法javascript描述

    <数据结构与算法javascript描述>--数组篇 导读: 这篇文章比较长,介绍了数组常见的操作方法以及一些注意事项,最后还有几道经典的练习题(面试题). 数组的定义: JavaScri ...

  9. mongodb 基本语法

    成功启动MongoDB后,再打开一个命令行窗口输入mongo,就可以进行数据库的一些操作. 输入help可以看到基本操作命令: show dbs:显示数据库列表 show collections:显示 ...

  10. 前端面试题之js篇

    前端面试也可为是鱼龙混杂,各公司面试题的种类也大不相同,有的公司注重基础语法,面试题偏于ES,有的公司偏于页面逻辑,会考差一些js的应用,现将遇到过的题和典型的题整理一下. 1. 0.2-0.1 == ...