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

人:男人,女人

动物:猫,狗

猫 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. 基于'sessionStorage'与'userData'的类session存储

    Storage.js: 注意:此版本实现的存储在符合Web存储标准(ie8及ie8以上的版本与其他主流浏览器)的情况下与session的周期一致,但在页面不关闭的情况下没有过期时间,ie7及以下版本则 ...

  2. Python Set集合,函数,深入拷贝,浅入拷贝,文件处理

    1.Set基本数据类型 a.set集合,是一个无序且不重复的元素集合 class set(object): """ set() -> new empty set o ...

  3. 正式学习react(二)

    今天把上一篇还没学习完的 webpack部分学习完: 之前有说过关于css的webpack使用.我们讲了 ExtractTextPlugin 来单独管理css讲了module.loaders下关于 c ...

  4. AsEnumrable和AsQueryable的区别

    http://www.cnblogs.com/jianglan/archive/2011/08/11/2135023.html 在写LINQ语句的时候,往往会看到.AsEnumerable() 和 . ...

  5. win7 下的open live writer代码插件

    open live writer 是博客园官方推荐的编辑器.恰好被它的各种便利吸引住了,于是花点时间研究一下,结果又用了好长时间,因为代码插件一时安装不了.在这里推荐小伙伴们可以先去看看这篇博文:ht ...

  6. C语言 中缀转后缀

    给定字符串型的算术表达式,实现中缀转后缀并运算得出结果: #ifndef STACK_H_INCLUDED #define STACK_H_INCLUDED #include <stdio.h& ...

  7. iPhone 和Android应用,特殊的链接:打电话,短信,email;

    http://ice-k.iteye.com/blog/1426526 下面的这篇文章主要是说,网页中的链接如何写,可以激活电话的功能. 例如,页面中展示的是一个电话号码,当用户在手机浏览器里面点击这 ...

  8. C++初始化列表问题

    C++初始化列表问题,类中有一个对象类型的数组成员变量,在初始化列表中初始化时报错“[]”操作符语法错误 class ClassA{private ClassB arrayOfObjectClassB ...

  9. 利用sql 存储过程把表中内容自动生成insert语句

    选中所在数据库 执行创建存储过程的sql CREATE proc [dbo].[spGenInsertSQL] (@tablename nvarchar(256),@sqlwhere varchar( ...

  10. 安全:加固你的ssh 登录

    SSH 是我们控制虚拟主机的一种途径,这个途径可以让我们拥有完全的控制权,如果对于这个控制权没有进行很好的安全处理,那么将会造成很大的安全问题.      我们可以在系统的日志文件 (例如:/var/ ...