9.java基础-多态

多态

某一个事物,在不同时刻表现出来的不同状态。
Cat可以是猫,同时Cat也是动物。

多态的好处

A:提高了代码的维护性(继承保证)
B:提高了代码的扩展性(由多态保证)

多态的前提

1.有继承关系
2.有方法重写
3.有父类引用指向子类对象

多态成员访问特点

☆成员变量:编译看左边,运行看左边。
☆成员方法:编译看左边,运行看右边。

由于成员方法存在方法重写,所以它运行看右边。
由于成员方法存在方法重写,所以它运行看右边。

构造方法

创建子类对象的时候,访问父类的构造方法,对父类的数据进行初始化。

package study.多态;

/*
	多态:同一个对象(事物),在不同时刻体现出来的不同状态。
	举例:
		猫是猫,猫是动物。
		水(液体,固体,气态)。
		
	多态的前提:
		A:要有继承关系。
		B:要有方法重写。
			其实没有也是可以的,但是如果没有这个就没有意义。
				动物 d = new 猫();
				d.show();
				动物 d = new 狗();
				d.show();
		C:要有父类引用指向子类对象。
			父 f =  new 子();
			
	用代码体现一下多态。

*/
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) {
        Fu f = new Fu();
        Fu f2 = new Zi();
        Zi z = new Zi();

        /***
         * 成员变量
         */
        //100
        System.out.println(f.num);
        //100
        System.out.println(f2.num);
        //1000
        System.out.println(z.num);

        /***
         * 成员方法
         */
        //show Fu
        f.show();
        //show Zi
        f2.show();
        //show Zi
        z.show();

    }
}

多态的弊端:不能使用子类的特有功能。

class Fu {
	public void show() {
		System.out.println("show fu");
	}
}

class Zi extends Fu {
	public void show() {
		System.out.println("show zi");
	}
	
	public void method() {
		System.out.println("method zi");
	}

}

class DuoTaiDemo3 {
	public static void main(String[] args) {
		//测试
		Fu f = new Zi();
		
		//打印show zi 原因:编译看左边 运行看右边。
		f.show();
		
		//无法调用子类的method方法
		f.method();
	}
}
如何使用子类的特有功能:向下转型

多态的弊端:
不能使用子类的特有功能。
我就想使用子类的特有功能?行不行?
行! 怎么用呢?

A:创建子类对象调用方法即可。(可以,但是很多时候不合理。而且,太占内存了)

Zi z = new Zi();

​B:把父类的引用强制转换为子类的引用。(向下转型)

	Fu f = new Zi();
	Zi z = (Zi)f;

在我们平时的开发中并不会出现上述向下转型的情景。想想我们在Service层开发时,需要被外部调用的方法都声明在Service接口内,不需要被外部调用的方法可以写在Service接口的具体实现内。

class Fu {
	public void show() {
		System.out.println("show fu");
	}
}

class Zi extends Fu {
	public void show() {
		System.out.println("show zi");
	}
	
	public void method() {
		System.out.println("method zi");
	}

}

class DuoTaiDemo4 {
	public static void main(String[] args) {
		//测试 编译看左边运行看右边
		Fu f = new Zi();
		f.show();
		//无法调用
		f.method();
		
		//创建子类对象
		Zi z1 = new Zi();
		z1.show();
		z1.method();
		
		//由于f指向的实际是1个Zi对象
		//因此可以对Zi对象进行强转
		Zi z2 = (Zi)f;
		z2.show();
		z2.method();
	}
}

多态练习

/*
	看程序写结果:先判断有没有问题,如果没有,写出结果
*/
class Fu {
	public void show() {
		System.out.println("fu show");
	}
}

class Zi extends Fu {
	public void show() {
		System.out.println("zi show");
	}

	public void method() {
		System.out.println("zi method");
	}
}

class DuoTaiTest3 {
	public static void main(String[] args) {
		Fu f = new Zi();
		
		f.method();//找不到符号
		
		f.show();//zi show
	}
}
package netty.bytebuf;

/*
	看程序写结果:先判断有没有问题,如果没有,写出结果
	
	多态的成员访问特点:
		方法:编译看左边,运行看右边。
		
	继承的时候:
		子类中有和父类中一样的方法,叫重写。
		子类中没有父亲中出现过的方法,方法就被继承过来了。
*/
class A {
	public void show() {
		show2();
	}
	public void show2() {
		System.out.println("我");
	}
}
class B extends A {
	/*
	public void show() {
		show2();
	}
	*/

	public void show2() {
		System.out.println("爱");
	}
}
class C extends B {
	public void show() {
		super.show();
	}
	public void show2() {
		System.out.println("你");
	}
}
public class DuoTaiTest4 {
	public static void main(String[] args) {
		A a = new B();
		//由于B没有show方法,所以B在A中找show方法
		//执行show2(),先在本类中找,找到了就调用打印爱

		a.show();
		//C有show方法,调用show方法 执行super.show() 找到B的show方法
		//B的show方法是从A继承来的,C执行show2(),先在本类C中找,找到了就调用打印你
		B b = new C();
		b.show();
	}
}


爱你
package netty.bytebuf;

/*
	看程序写结果:先判断有没有问题,如果没有,写出结果
	
	多态的成员访问特点:
		方法:编译看左边,运行看右边。
		
	继承的时候:
		子类中有和父类中一样的方法,叫重写。
		子类中没有父亲中出现过的方法,方法就被继承过来了。
*/
class A {
	public void show() {
		show2();
	}
	public void show2() {
		System.out.println("我");
	}
}
class B extends A {
	//这是和上个例子不同的地方
	public void show() {
		show2();
	}
	public void show2() {
		System.out.println("爱");
	}
}
class C extends B {
	public void show() {
		super.show();
	}
	public void show2() {
		System.out.print("你");
	}
}
public class DuoTaiTest4 {
	public static void main(String[] args) {
		A a = new B();
		//由于B没有show方法,所以B在A中找show方法
		//执行show2(),先在本类中找,找到了就调用打印爱

		a.show();
		//C有show方法,调用show方法 执行super.show() 找到B的show方法
		//B的show方法是从A继承来的,C执行show2(),先在本类C中找,找到了就调用打印你
		B b = new C();
		b.show();
	}
}
爱你

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值