黑马程序员-----Java基础-----多态
2015-08-13 08:47
525 查看
------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流!
-------
多态:可以理解为事物存在的多种体现形态。
1,多态的体现
父类的引用指向了自己的子类对象。
父类的引用也可以接收自己的子类对象。
2,多态的前提
必须是类与类之间有关系,要么继承,要么实现。
通常还有一个前提,存在覆盖。
3,多态的好处
多态的出现大大的提高了程序扩展性。
4,多态的应用
5,弊端
提高了扩展性,但是只能使用父类的引用访问父类中的成员。
Animal a = new Cat();类型提升,向上转型。
a.eat();
如果想要调用猫的特有方法时,如何操作?
Cat c = (cat)a;强制将父类的引用转成子类类型,向下转型。
c.catchMouse();
千万不要出现这样的操作,将父类对象转成子类对象:
我们不能转换的是父类应用指向自己的子类对象时,该应用
可以被提升,也可以被强制转换。
多态自始至终都是子类对象在做着变化。
Animal a = new Aanimal();这是错误的。
Cat c = (Cat)a;
6.多态的特点XX重要
在多态成员函数的特点
在编译时期,参阅引用类型变量所属的类中是否有调用的方法,如果有
编译通过,没有编译失败。
在运行时,参阅对象所属的类中是否有调用方法。
简单总结就是,成员函数在多态调用时,编译看左边,运行看右边。
在多态中成员变量的特点;
无论编译还是运行,都参考左边(引用型变量所属的类)。
在多态中,静态成员函数特点:
无论编译还是运行,都参考左边。
Fu
int num = 5
Zi
int num = 8
Fu f = new Zi();
System.out.println(f.num);--5
Zi z = new Zi();
System.out.println(z.num);--8
class Fu
{
void method1()
{
System.out.println("Fu-1");
}
void method2()
{
System.out.println("Fu-2");
}
}
class Zi extends Fu
{
void method1()
{
System.out.println("Zi-1");
}
void method3()
{
System.out.println("Zi-2");
}
}
class Demo
{
public static void main(String[] args)
Zi z = new Zi();
z.method1();
z.method2();
z.method3();结果是:zi-fu-zi
Fu f = new Zi();
f.method1();
f.method2();//结果是zi1 , fu2 。
f.method3();//编译失败,父类中没有3的方法。
}
abstract class Animal
{
abstract void eat();
}
class Cat extends Animal
{
void eat()
{
System.out.println("吃鱼");
}
void catchmouse()
{
System.out.println("抓老鼠");
}
}
class Dog extends Animal
{
void eat()
{
System.out.println("啃骨头");
}
void Kanjia()
{
System.out.println("看家");
}
}
class Pig extends Animal
{
void eat()
{
System.out.println("饲料");
}
void GongDi()
{
System.out.println("拱地");
}
}
public class Duotai {
public static void main(String[] args) {
/*Cat c = new Cat();
c.eat();
Dog d = new Dog();
d.Kanjia();
function(c);
function(d);*/
/*Animal c = new Animal();
c.eat();*/
function(new Cat());
function(new Dog());
}
public static void function(Animal a)//Animal a = new Cat();
{
a.eat();
/*Cat c = (Cat)a;
c.catchmouse();*/
//判断一下是猫还是够。
if(a instanceof Cat)
{
Cat c = (Cat)a;
c.catchmouse();
}
else if(a instanceof Dog)
{
Dog c = (Dog)a;
c.Kanjia();
}
//a.Kanjian.();运行出错,不是共性的。
}
/*public static void function(Cat c)
{
c.eat();
}
public static void function(Dog d)
{
d.eat();
}*/
}
需求:电脑运行实例,基于主板。
class MainBoard
{
public void run()
{
System.out.println("MainBoard run");
}
public void useNetCard(NetCard c)
{
c.open();
c.close();
}
}
public class DuoTai
{
public static void main(String[] args
dd4c
)
{
MainBoard mb = new MainBoard();
mb.run();
mb.useNetCard(new NetCard());
}
}
class NetCard
{
public void open()
{
System.out.println("open");
}
public void close()
{
System.out.println("close");
}
}
-------------使用接口和多态的应用
interface PCI
{
public void open();
public void close();
}
class MainBoard
{
public void run()
{
System.out.println("MainBoard run");
}
public void usePCI(PCI p)
{
if(p!=null)
{
p.open();
p.close();
}
}
}
public class Duo
{
public static void main(String[] args)
{
MainBoard mb = new MainBoard();
mb.run();
mb.usePCI(null);
mb.usePCI(new NetCard());
mb.usePCI(new SoundCard());
}
}
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("SoundCard-open");
}
public void close()
{
System.out.println("SoundCard-close");
}
}
--------------多态扩展示例
需求:数据库的操作
1,连接数据库,JDBC Hibernate
2,操作数据库 , c creat r read u update d delete
3,关闭数据库。
class UserInfoByJDBC
{
public void add(User user)
{
1,JDBC连接数据库
2,使用spl添加语句添加数据
3,关闭连接
}
public void delete(User user)
{
1,JDBC连接数据库
2,使用spl添加语句删除数据
3,关闭连接
}
}
//一年后更换UserInfoByJDBC 为 UserInfoByHibernate
/*class UserInfoByHibernate
{
public void add(User user)
{
1,Hibernate连接数据库
2,使用spl添加语句添加数据
3,关闭连接
}
public void delete(User user)
{
1,Hibernate连接数据库
2,使用spl添加语句删除数据
3,关闭连接
}
}*/
public class Duo
{
public static void main(String[] args)
{
UserInfoByJDBC UserInfoByJDBC();
//UserInfoByHibernate ui = new UserInfoByHibernate
ui.add();
ui.delete();
}
}
--------------------------------------
interface UserInfoDao
{
public void add(User user);
public void delete(User user);
}
public class Duo
{
public static void main(String[] args)
{
//UserInfoByJDBC UserInfoByJDBC();
//UserInfoByHibernate ui = new UserInfoByHibernate();
UserInfoDao ui = 这里可以用 UserInfoByJDBC();或者一年以后更换新的UserInfoByHibernate();
ui.add();
ui.delete();
}
}
class UserInfoByJDBC这个要implements UserInfoDao
或者:
class UserInfoByHibernate个要implements UserInfoDao
-----<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流!
-------
-------
多态:可以理解为事物存在的多种体现形态。
1,多态的体现
父类的引用指向了自己的子类对象。
父类的引用也可以接收自己的子类对象。
2,多态的前提
必须是类与类之间有关系,要么继承,要么实现。
通常还有一个前提,存在覆盖。
3,多态的好处
多态的出现大大的提高了程序扩展性。
4,多态的应用
5,弊端
提高了扩展性,但是只能使用父类的引用访问父类中的成员。
Animal a = new Cat();类型提升,向上转型。
a.eat();
如果想要调用猫的特有方法时,如何操作?
Cat c = (cat)a;强制将父类的引用转成子类类型,向下转型。
c.catchMouse();
千万不要出现这样的操作,将父类对象转成子类对象:
我们不能转换的是父类应用指向自己的子类对象时,该应用
可以被提升,也可以被强制转换。
多态自始至终都是子类对象在做着变化。
Animal a = new Aanimal();这是错误的。
Cat c = (Cat)a;
6.多态的特点XX重要
在多态成员函数的特点
在编译时期,参阅引用类型变量所属的类中是否有调用的方法,如果有
编译通过,没有编译失败。
在运行时,参阅对象所属的类中是否有调用方法。
简单总结就是,成员函数在多态调用时,编译看左边,运行看右边。
在多态中成员变量的特点;
无论编译还是运行,都参考左边(引用型变量所属的类)。
在多态中,静态成员函数特点:
无论编译还是运行,都参考左边。
Fu
int num = 5
Zi
int num = 8
Fu f = new Zi();
System.out.println(f.num);--5
Zi z = new Zi();
System.out.println(z.num);--8
class Fu
{
void method1()
{
System.out.println("Fu-1");
}
void method2()
{
System.out.println("Fu-2");
}
}
class Zi extends Fu
{
void method1()
{
System.out.println("Zi-1");
}
void method3()
{
System.out.println("Zi-2");
}
}
class Demo
{
public static void main(String[] args)
Zi z = new Zi();
z.method1();
z.method2();
z.method3();结果是:zi-fu-zi
Fu f = new Zi();
f.method1();
f.method2();//结果是zi1 , fu2 。
f.method3();//编译失败,父类中没有3的方法。
}
abstract class Animal
{
abstract void eat();
}
class Cat extends Animal
{
void eat()
{
System.out.println("吃鱼");
}
void catchmouse()
{
System.out.println("抓老鼠");
}
}
class Dog extends Animal
{
void eat()
{
System.out.println("啃骨头");
}
void Kanjia()
{
System.out.println("看家");
}
}
class Pig extends Animal
{
void eat()
{
System.out.println("饲料");
}
void GongDi()
{
System.out.println("拱地");
}
}
public class Duotai {
public static void main(String[] args) {
/*Cat c = new Cat();
c.eat();
Dog d = new Dog();
d.Kanjia();
function(c);
function(d);*/
/*Animal c = new Animal();
c.eat();*/
function(new Cat());
function(new Dog());
}
public static void function(Animal a)//Animal a = new Cat();
{
a.eat();
/*Cat c = (Cat)a;
c.catchmouse();*/
//判断一下是猫还是够。
if(a instanceof Cat)
{
Cat c = (Cat)a;
c.catchmouse();
}
else if(a instanceof Dog)
{
Dog c = (Dog)a;
c.Kanjia();
}
//a.Kanjian.();运行出错,不是共性的。
}
/*public static void function(Cat c)
{
c.eat();
}
public static void function(Dog d)
{
d.eat();
}*/
}
需求:电脑运行实例,基于主板。
class MainBoard
{
public void run()
{
System.out.println("MainBoard run");
}
public void useNetCard(NetCard c)
{
c.open();
c.close();
}
}
public class DuoTai
{
public static void main(String[] args
dd4c
)
{
MainBoard mb = new MainBoard();
mb.run();
mb.useNetCard(new NetCard());
}
}
class NetCard
{
public void open()
{
System.out.println("open");
}
public void close()
{
System.out.println("close");
}
}
-------------使用接口和多态的应用
interface PCI
{
public void open();
public void close();
}
class MainBoard
{
public void run()
{
System.out.println("MainBoard run");
}
public void usePCI(PCI p)
{
if(p!=null)
{
p.open();
p.close();
}
}
}
public class Duo
{
public static void main(String[] args)
{
MainBoard mb = new MainBoard();
mb.run();
mb.usePCI(null);
mb.usePCI(new NetCard());
mb.usePCI(new SoundCard());
}
}
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("SoundCard-open");
}
public void close()
{
System.out.println("SoundCard-close");
}
}
--------------多态扩展示例
需求:数据库的操作
1,连接数据库,JDBC Hibernate
2,操作数据库 , c creat r read u update d delete
3,关闭数据库。
class UserInfoByJDBC
{
public void add(User user)
{
1,JDBC连接数据库
2,使用spl添加语句添加数据
3,关闭连接
}
public void delete(User user)
{
1,JDBC连接数据库
2,使用spl添加语句删除数据
3,关闭连接
}
}
//一年后更换UserInfoByJDBC 为 UserInfoByHibernate
/*class UserInfoByHibernate
{
public void add(User user)
{
1,Hibernate连接数据库
2,使用spl添加语句添加数据
3,关闭连接
}
public void delete(User user)
{
1,Hibernate连接数据库
2,使用spl添加语句删除数据
3,关闭连接
}
}*/
public class Duo
{
public static void main(String[] args)
{
UserInfoByJDBC UserInfoByJDBC();
//UserInfoByHibernate ui = new UserInfoByHibernate
ui.add();
ui.delete();
}
}
--------------------------------------
interface UserInfoDao
{
public void add(User user);
public void delete(User user);
}
public class Duo
{
public static void main(String[] args)
{
//UserInfoByJDBC UserInfoByJDBC();
//UserInfoByHibernate ui = new UserInfoByHibernate();
UserInfoDao ui = 这里可以用 UserInfoByJDBC();或者一年以后更换新的UserInfoByHibernate();
ui.add();
ui.delete();
}
}
class UserInfoByJDBC这个要implements UserInfoDao
或者:
class UserInfoByHibernate个要implements UserInfoDao
-----<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流!
-------
相关文章推荐
- 面试题6
- 黑马程序员--JAVA基础语法之--关键字、常亮、变量、标识符
- 【LeetCode-面试算法经典-Java实现】【119-Pascal's Triangle II(帕斯卡三角形(杨辉三角)II)】
- 【LeetCode-面试算法经典-Java实现】【118-Pascal's Triangle(帕斯卡三角形)】
- 黑马程序员-Java基础:集合
- 黑马程序员——Java中IO流下
- 黑马程序员--Java基础--IO流(三)
- 黑马程序员--Java基础--IO流(二)
- 程序员和工程师有什么不一样?
- 程序员世界常见的6个问题
- 程序员,为什么千万不要重写代码?
- 剑指offer面试题java版系列 题1 Singleton模式
- Android工程师面试宝典&面试实战试题详解01
- 黑马程序员——Java中对象的继承
- 面向程序员的数据库访问性能优化法则
- 黑马程序员——类与对象2
- 黑马程序员 oc随记 foundation框架 nsstring.NSmutable.nsarray与nsdictionay
- 面试之二百度
- 【黑马程序员】Foundation框架NSArray
- 面试题:比较两个集合是否相等?