Java_多态_基础学习

本文深入探讨了Java中的多态性概念,通过实例展示了如何使用父类引用指向子类对象,以及多态在成员变量和成员方法访问中的特点。多态带来的好处包括提高代码的扩展性和灵活性,但同时也限制了对子类特有功能的直接访问。通过 Animal 类和 Cat、Dog 子类的示例,阐述了多态在实际操作中的应用。
摘要由CSDN通过智能技术生成
  • JAVA_多态01_多态的定义及使用

类中的方法具有通用性,在Java中使用一个父类类型引用一个子类类型的对象,根据子类对象的特征不同,得到不同的运行结果(书中定义),例如:Animal a = new Cat();

代码如下:

package JAVA_01_多态;
/*
 * 		父类
 * */
public class Animal {

	public void eat() {
		System.out.println("动物吃东西");
	}
}
package JAVA_01_多态;
/*
 *		子类 
 */
public class Cat extends Animal{

	@Override
	public void eat() {
		System.out.println("猫吃鱼");
	}
}
package JAVA_01_多态;
/*
 * 		测试类
 * */
public class AnimalDemo {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		//父类引用指向子类对象
		Animal a = new Cat();
	}

}
  • JAVA_多态02_多态中成员访问的特点
  1. 成员变量访问的特点:
    编译和运行都要看父类,我的理解就是父类中有的成员变量才可以使用,父类中没有的不可以使用,否则会报错,父类中和子类中的成员变量执行时会按照父类的变量来执行
  2. 成员方法的访问特点:
    编译看父类,运行看子类,我的理解就是编译时父类有才可以(父类没有这个方法时执行时会报错),但是如果子类重写了父类的方法,运行时执行的是子类重写以后的结果,如果子类不重写,运行时按照父类的方法执行

共同点:无论是成员变量或成员方法,访问的一定是父类有的,没有的一定会报错

代码:

package JAVA_02_多态中成员访问特点;
/*
 * 		父类
 * */
public class Animal {
	public int age = 40;
	
	public void eat() {
		System.out.println("动物吃东西");
	}
}
package JAVA_02_多态中成员访问特点;
/*
 * 		子类
 * */
public class Cat extends Animal{
	public int age = 20;
	public int weight = 10;
	
	@Override
	public void eat() {
		System.out.println("猫吃鱼");
	}
	
	public void playGame() {
		System.out.println("猫捉迷藏");
	}
}
package JAVA_02_多态中成员访问特点;

/*
 * 		多态中成员访问特点:
 * 			成员变量:编译看左边,执行看左边
 * 			成员方法:编译看左边,执行看右边
 * 
 * 		因为成员方法有重写,成员变量没有重写所以特点不一样
 * */

public class AnimalDemo {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		//父类引用指向子类对象
		Animal a = new Cat();
		
		System.out.println(a.age);//编译看左边的引用,运行也要看左边
//		System.out.println(a.weight);   报错
		
		
		a.eat();      //编译看左边的引用,运行要看右边(重写以后的内容,如果没重写,那就按左边的来)
//		a.playGame();   报错
	}

}
  • JAVA_多态03_多态的好处和弊端
    多态的好处:提高了程序的扩展性,表现为使用父类作为参数,使用具体的子类参与操作
    多态的弊端:不能使用子类的特有功能

代码:

package JAVA_03_多态的好处和弊端;
/*
 * 		父类
 * */
public class Animal {
	public void eat() {
		System.out.println("动物吃东西");
	}
}
package JAVA_03_多态的好处和弊端;
/*
 * 		子类
 * */
public class Cat extends Animal{
	
	@Override
	public void eat() {
		System.out.println("猫吃鱼");
	}
}
package JAVA_03_多态的好处和弊端;
/*
 * 		子类
 * */
public class Dog extends Animal{
	@Override
	public void eat() {
		System.out.println("狗吃骨头");
	}
}
package JAVA_03_多态的好处和弊端;
/*
 * 		操作类
 * */
public class AnimalOperator {
//	public void useAnimal(Cat c) {   //相当于是 Cat c = new Cat();
//		c.eat();
//	}
//	
//	public void useAnimal(Dog d) {   //相当于是Dog d = new Dog();
//		d.eat();
//	}
	
	public void useAnimal(Animal a) {
		
		//Animal a = new Cat();
		//Animal a = new Dog();
		
		a.eat();
	}
}
package JAVA_03_多态的好处和弊端;
/*
 * 		测试类
 * */
public class AnimalDemo {
	public static void main(String[] args) {
		//创建动物操作类对象,调用方法
		AnimalOperator ao = new AnimalOperator();
		Cat c = new Cat();
		ao.useAnimal(c);
		
		Dog d = new Dog();
		ao.useAnimal(d);
	}
}
  • JAVA_多态04_猫吃狗多态版
    首先做一个Animal类,类中有有参无参构造方法,写一个eat()方法,还有getXxx()和setXxx()方法,代码如下:
package JAVA_05_猫和狗;

public class Animal {
	private String name;
	private int age;
	
	public Animal() {}
	
	public Animal(String name,int age) {
		this.name = name;
		this.age = age;
	}
	
	public void eat() {
		System.out.println("动物吃东西");
	}
	
	public void setName(String name) {
		this.name = name;
	}
	public String getName() {
		return name;
	}
	
	public void setAge(int age) {
		this.age=age;
	}
	public int getAge() {
		return age;
	}
}

然后写一个Cat类,继承Animal类,然后重写eat()方法,再写有参和无参的构造方法。代码如下:

package JAVA_05_猫和狗;

public class Cat extends Animal{
	public Cat() {}
	
	@Override
	public void eat() {
		System.out.println("猫吃鱼");
	}
	
	public Cat(String name,int age) {
		super(name,age);
	}
}

再写一个测试类,用多态的方式:

package JAVA_05_猫和狗;

public class AnimalDemo {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Animal a = new Cat();
		a.setName("小花");
		a.setAge(18);
		System.out.println(a.getName()+","+a.getAge());
		
		a = new Cat("xiaor",19);
		System.out.println(a.getName()+","+a.getAge());
	}

}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值