-
// 例1:多态性
-
class Fu {
-
public
int num =
100;
-
-
public void show() {
-
System.out.println(
"show Fu");
-
}
-
-
public static void function() {
-
System.out.println(
"function Fu");
-
}
-
}
-
-
class Zi extends Fu {
-
public
int num =
1000;
-
public
int num2 =
200;
-
-
public void show() {
-
System.out.println(
"show Zi");
-
}
-
-
public void method() {
-
System.out.println(
"method zi");
-
}
-
-
public static void function() {
-
System.out.println(
"function Zi");
-
}
-
}
-
-
class DuoTaiDemo {
-
public static void main(String[] args) {
-
//要有父类引用指向子类对象。
-
//父 f = new 子();
-
Fu f =
new Zi();
-
System.out.println(f.num);
-
//找不到符号
-
//System.out.println(f.num2);
-
-
f.show();
-
//找不到符号
-
//f.method();
-
f.function();
-
}
-
}
-
运行结果:
-
-
100
-
show Zi
-
function Fu
-
// 例2:向上向下转型
-
class 孔子爹 {
-
public
int age =
40;
-
-
public void teach() {
-
System.out.println(
"讲解JavaSE");
-
}
-
}
-
-
class 孔子 extends 孔子爹 {
-
public
int age =
20;
-
-
public void teach() {
-
System.out.println(
"讲解论语");
-
}
-
-
public void playGame() {
-
System.out.println(
"英雄联盟");
-
}
-
}
-
-
//Java培训特别火,很多人来请孔子爹去讲课,这一天孔子爹被请走了
-
//但是还有人来请,就剩孔子在家,价格还挺高。孔子一想,我是不是可以考虑去呢?
-
//然后就穿上爹的衣服,带上爹的眼睛,粘上爹的胡子。就开始装爹
-
//向上转型
-
孔子爹 k爹 =
new 孔子();
-
//到人家那里去了
-
System.out.println(k爹.age);
//40
-
k爹.teach();
//讲解论语
-
//k爹.playGame(); //这是儿子才能做的
-
-
-
//讲完了,下班回家了
-
//脱下爹的装备,换上自己的装备
-
//向下转型
-
孔子 k = (孔子) k爹;
-
System.out.println(k.age);
//20
-
k.teach();
//讲解论语
-
k.playGame();
//英雄联盟
-
/*
-
例3 多态的好处:
-
A:提高了代码的维护性(继承保证)
-
B:提高了代码的扩展性(由多态保证)
-
-
猫狗案例代码
-
*/
-
class Animal {
-
public void eat(){
-
System.out.println(
"eat");
-
}
-
-
public void sleep(){
-
System.out.println(
"sleep");
-
}
-
}
-
-
class Dog extends Animal {
-
public void eat(){
-
System.out.println(
"狗吃肉");
-
}
-
-
public void sleep(){
-
System.out.println(
"狗站着睡觉");
-
}
-
}
-
-
class Cat extends Animal {
-
public void eat() {
-
System.out.println(
"猫吃鱼");
-
}
-
-
public void sleep() {
-
System.out.println(
"猫趴着睡觉");
-
}
-
}
-
-
class Pig extends Animal {
-
public void eat() {
-
System.out.println(
"猪吃白菜");
-
}
-
-
public void sleep() {
-
System.out.println(
"猪侧着睡");
-
}
-
}
-
-
//针对动物操作的工具类
-
class AnimalTool {
-
private AnimalTool(){}
-
-
/*
-
//调用猫的功能
-
public static void useCat(Cat c) {
-
c.eat();
-
c.sleep();
-
}
-
-
//调用狗的功能
-
public static void useDog(Dog d) {
-
d.eat();
-
d.sleep();
-
}
-
-
//调用猪的功能
-
public static void usePig(Pig p) {
-
p.eat();
-
p.sleep();
-
}
-
*/
-
public static void useAnimal(Animal a) {
-
a.eat();
-
a.sleep();
-
}
-
-
}
-
-
class DuoTaiDemo2 {
-
public static void main(String[] args) {
-
//我喜欢猫,就养了一只
-
Cat c =
new Cat();
-
c.eat();
-
c.sleep();
-
-
//我很喜欢猫,所以,又养了一只
-
Cat c2 =
new Cat();
-
c2.eat();
-
c2.sleep();
-
-
//我特别喜欢猫,又养了一只
-
Cat c3 =
new Cat();
-
c3.eat();
-
c3.sleep();
-
//...
-
System.out.println(
"--------------");
-
//问题来了,我养了很多只猫,每次创建对象是可以接受的
-
//但是呢?调用方法,你不觉得很相似吗?仅仅是对象名不一样。
-
//我们准备用方法改进
-
//调用方式改进版本
-
//useCat(c);
-
//useCat(c2);
-
//useCat(c3);
-
-
//AnimalTool.useCat(c);
-
//AnimalTool.useCat(c2);
-
//AnimalTool.useCat(c3);
-
-
AnimalTool.useAnimal(c);
-
AnimalTool.useAnimal(c2);
-
AnimalTool.useAnimal(c3);
-
System.out.println(
"--------------");
-
-
//我喜欢狗
-
Dog d =
new Dog();
-
Dog d2 =
new Dog();
-
Dog d3 =
new Dog();
-
//AnimalTool.useDog(d);
-
//AnimalTool.useDog(d2);
-
//AnimalTool.useDog(d3);
-
AnimalTool.useAnimal(d);
-
AnimalTool.useAnimal(d2);
-
AnimalTool.useAnimal(d3);
-
System.out.println(
"--------------");
-
-
//我喜欢宠物猪
-
//定义一个猪类,它要继承自动物,提供两个方法,并且还得在工具类中添加该类方法调用
-
Pig p =
new Pig();
-
Pig p2 =
new Pig();
-
Pig p3 =
new Pig();
-
//AnimalTool.usePig(p);
-
//AnimalTool.usePig(p2);
-
//AnimalTool.usePig(p3);
-
AnimalTool.useAnimal(p);
-
AnimalTool.useAnimal(p2);
-
AnimalTool.useAnimal(p3);
-
System.out.println(
"--------------");
-
-
//我喜欢宠物狼,老虎,豹子...
-
//定义对应的类,继承自动物,提供对应的方法重写,并在工具类添加方法调用
-
//前面几个必须写,我是没有意见的
-
//但是,工具类每次都改,麻烦不
-
//我就想,你能不能不改了
-
//太简单:把所有的动物都写上。问题是名字是什么呢?到底哪些需要被加入呢?
-
//改用另一种解决方案。
-
-
}
-
-
/*
-
//调用猫的功能
-
public static void useCat(Cat c) {
-
c.eat();
-
c.sleep();
-
}
-
-
//调用狗的功能
-
public static void useDog(Dog d) {
-
d.eat();
-
d.sleep();
-
}
-
*/
-
}
-
public
interface Parent//父类接口
-
{
-
public void simpleCall();
-
}
-
public
class Child_A implements Parent
-
{
-
public void simpleCall();
-
{
-
//具体的实现细节;
-
}
-
}
-
-
public
class Child_B implements Parent
-
{
-
public void simpleCall();
-
{
-
//具体的实现细节;
-
}
-
}