javaSE学习的week05

本文通过猫狗案例展示了Java中的继承概念,详细解释了多态的定义、前提条件,并通过实例演示了多态在成员访问中的特点。接着探讨了多态在代码维护性和扩展性上的优势,以及在动物工具类场景下的应用。同时,文章也提到了多态的潜在弊端,如无法直接调用子类特有方法,并给出了解决方案。最后,通过多态方法测试了狗和猫的行为。
摘要由CSDN通过智能技术生成

1. 继承案例

package cn.hncu_01;

/*
 * 猫狗案例讲解(继承版)
 */
class Animal {
	// 成员变量
	private String name;
	private int age;

	// 构造方法
	public Animal() {
		super();
		// TODO Auto-generated constructor stub
	}

	public Animal(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}

	// 成员方法
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}
	
	public void eat(){
		System.out.println("吃饭");
	}
	
	public void  sleep() {
		System.out.println("睡觉");
	}
}
//狗类
class Dog extends Animal {
	
	
	public Dog() {
		super();
		// TODO Auto-generated constructor stub
	}


	public Dog(String name, int age) {
		super(name, age);
		// TODO Auto-generated constructor stub
	}


	public void eat() {
		System.out.println("狗吃肉");
	}
	
	
	public void sleep() {
		System.out.println("狗趴着睡觉");
	}
}

//猫类
class Cat extends Animal {
	
	
	public Cat() {
		super();
		// TODO Auto-generated constructor stub
	}


	public Cat(String name, int age) {
		super(name, age);
		// TODO Auto-generated constructor stub
	}


	public void eat() {
		System.out.println("猫吃鱼");
	}
	
	
	public void sleep() {
		System.out.println("猫躺着睡觉");
	}
}

public class Demo {
	public static void main(String[] args) {
		//测试狗类
		Dog dog = new Dog();
		dog.setName("来福");
		dog.setAge(2);
		System.out.println(dog.getName()+"---"+dog.getAge());
		System.out.println("---------------------------------");
		Dog dog2 = new Dog("旺财",3);
		System.out.println(dog2.getName()+"---"+dog2.getAge());
		System.out.println("---------------------------------");
		//测试猫类,自己测
	}
}

2. 多态的概念

package cn.hncu_02;
/*
 * 多态
 * 1. 什么是多态?
 * 		同一个对象在不同时刻体现出来的不同状态.
 * 			如:水(固态,液态,气态)
 * 				猫是猫, 猫是动物
 * 2. 多态的前提
 * 		(1) 有继承关系.
 * 		(2) 有方法重写.
 * 		(3) 有父类引用指向子类对象.
 * 			Fu f = new Zi();
 * 
 * 3. 根据多态的前提,写一个案例
 * 
 * 
 * 
 */
class Fu {
	public void method(){
		System.out.println("method Fu");
	}
}

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

public class Demo {
	public static void main(String[] args) {
		//有父类引用指向子类对象
		//这就是多态
		Fu f = new Zi();
		f.method();
	}
}

3. 多态中成员访问的特点

package cn.hncu_03;
/*
 * 多态中成员访问的特点:
 *成员变量
 * 	编译看左边,运行看左边
 *构造方法
 * 	创建子类对象时,先访问父类的构造方法,对父类的数据进行初始化.(和继承中一样)
 * 成员方法
 * 	编译看左边,运行看右边
 * 静态方法
 * 	编译看左边,运行看左边 		
 */


class Fu {
	public int num1=10;
	
	public Fu(){
		System.out.println("Fu无参构造");
	}
	
	public void method(){
		System.out.println("method Fu");
	}
	
	public static void fun(){
		System.out.println("fun Fu");
	}
}

class Zi extends Fu{
	public int  num1 = 20;
	public int num2 = 200;
	
	public Zi(){
		System.out.println("Zi无参构造");
	}
	
	public void method(){
		System.out.println("method Zi");
	}
	
	public void  function(){
		System.out.println("function Zi");
	}
	
	public static void fun(){
		System.out.println("fun Zi");
	}
}

public class Demo {
	public static void main(String[] args) {
		//有父类引用指向子类对象
		//这就是多态
		Fu f = new Zi();
		//f.method();
		//System.out.println(f.num1);//10
		//System.out.println(f.num2);
		//f.method();
		//f.function();
		f.fun();
	}
}

4. 多态的好处

package cn.hncu_04;
/*
 * 多态的好处
 * 		(1) 提高了代码的维护性(由继承保证).
 * 		(2)	提高了代码的扩展性(由多态保证).
 * 
 * 需求:写一个动物的工具类.
 */
class Animal {
	public void eat(){
		System.out.println("吃饭");
	}
	public void sleep(){
		System.out.println("睡觉");
	}
}

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 AnimalTools {
	private AnimalTools(){
		
	}
	//调用狗的功能
	//类名做形参,实际需要的是该类的一个对象.
	/*public static void useDog(Dog d){
		d.eat();
		d.sleep();
	}
	
	public static void useCat(Cat c){
		c.eat();
		c.sleep();
	}
	public static void usePig(Pig p){
		p.eat();
		p.sleep();
	}*/
	//动物的种类有很多,安卓上面的方法写动物工具类不合适.
	public static void useAnimal(Animal a){
		a.eat();
		a.sleep();
	}
}


public class Demo {
	public static void main(String[] args) {
		//AnimalTools at = new AnimalTools();
		/*Dog  dog = new Dog();
		AnimalTools.useDog(dog);
		AnimalTools.useCat(new Cat());
		AnimalTools.usePig(new Pig());*/
		AnimalTools.useAnimal(new Dog());//Animal a = new Dog(),这就是多态
		AnimalTools.useAnimal(new Cat());
		AnimalTools.useAnimal(new Pig());
	}
}

5. 多态的弊端

package cn.hncu_05;
/*
 * 多态的弊端
 * 		不能使用子类的特有功能.怎么解决?
 * 	解决的办法有两个:
 * 		(1) 直接创建子类对象调用子类方法即可.
 * 		(2) 向下转型.
 * 				Fu f = new Zi()
 * 				Zi z = (Zi) f;
 * 总结:
 * 		java 中的转型问题.
 * 			向上转型:Fu f = new Zi()
 * 			向下转型:Zi z = (Zi) f
 */
class Fu {
	public void function(){
		System.out.println("function Fu");
	}
}

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

public class Demo {
	public static void main(String[] args) {
		/*Fu f = new Zi();
		f.function();*/
		//f.method();
		/*Zi z = new Zi();
		z.method();
		z.function();*/
		Fu f = new Zi();
		Zi z = (Zi) f;//向下转型
		z.method();
		z.function();
		
	}
}

案例

package cn.hncu_06;

/*
 * 猫狗案例练习多态版
 */
class Animal {
	// 成员变量
	private String name;
	private int age;

	// 构造方法
	public Animal() {
		super();
		// TODO Auto-generated constructor stub
	}

	public Animal(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}

	// 成员方法
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}
	
	public void eat(){
		System.out.println("吃饭");
	}
	
	public void  sleep() {
		System.out.println("睡觉");
	}
}
//狗类
class Dog extends Animal {
	
	
	public Dog() {
		super();
		// TODO Auto-generated constructor stub
	}


	public Dog(String name, int age) {
		super(name, age);
		// TODO Auto-generated constructor stub
	}


	public void eat() {
		System.out.println("狗吃肉");
	}
	
	
	public void sleep() {
		System.out.println("狗趴着睡觉");
	}
}

//猫类
class Cat extends Animal {
	
	
	public Cat() {
		super();
		// TODO Auto-generated constructor stub
	}


	public Cat(String name, int age) {
		super(name, age);
		// TODO Auto-generated constructor stub
	}


	public void eat() {
		System.out.println("猫吃鱼");
	}
	
	
	public void sleep() {
		System.out.println("猫躺着睡觉");
	}
}

public class Demo {
	public static void main(String[] args) {
		//多态的方法测试狗
		Animal a = new Dog();
		a.eat();
		a.sleep();
		//多态的方法测试猫
		a = new Cat();
		a.eat();
		a.sleep();
		
	}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值