java面向对象三大基本特征之:多态 代码解释

下面几个部分都在同一个project里面
package com.rimi.duotai;
import java.lang.reflect.Method;
import com.rimi.abstractdemo.Alimal;
import com.rimi.abstractdemo.Cat;
import com.rimi.abstractdemo.Dog;
/*****************************这是含有main函数的class ***************/

public class DuoTaiDemo {

public static void main(String[] args) {		
	// 多态的概念:  父类类型可以接收子类对象(父类指针可以执行子类对象)
	Dog dog = new Dog("小黑", "公");
	Cat cat = new Cat("小花", "母");
	// 赋值的时候是将(低类型转换为了高类型)子类型转换为父类型会自动提升(向上转型是自动的)
	Method(dog);
}
private static void Method(Alimal d) {		
		d.eat();	
		d.shout();
		// 在实际要使用猫或狗类型的函数中,就需要再将动物类型转换回对应的实际类型
		// 这种就是叫做向下转型,也是需要强制转换,需要判断当前的类型是否可以转换为对应类型
		// 使用关键字 instanceof 来判断类型是否匹配
		if (d instanceof Dog) {
			Dog dd = (Dog)d;
			dd.lookHome();	// 能输出 因为d是Dog类创建的对象	
		}		
		if (d instanceof Cat) {
			Cat cc = (Cat)d;
			cc.catchMouse();  // 不能输出,因为d是Dog类创建的对象,不是Cat创建的
		}
}

}
/*******************定义Alimal类 animal写错了,没改 ************/
package com.rimi.abstractdemo;
// 包含抽象方法的类必须定义为抽象类
// 抽象类就是在类名称前加上abstract

public abstract class Alimal {

private String name;
private String gender;
// 为了子类能方便直接继承,建议写出无参构造
public Alimal() {}
// 带参数的构造函数
public Alimal(String name, String gender) {
	super();
	this.name = name;
	this.gender = gender;
}

// final修饰的方法叫最终方法,只能使用,不能被子类覆盖重写
public final void eat() {
	System.out.println(name+"在吃东西");
}

// 功能知道有,但是具体的实现不清楚,不具体,模糊的
// 抽象:使用关键字abstract来定义
// 当修饰函数时,函数就是抽象方法
// 有抽象方法的类也必须时抽象的(抽象类)
public abstract void shout();


public String getName() {
	return name;
}

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

public String getGender() {
	return gender;
}

public void setGender(String gender) {
	this.gender = gender;
}

}

/**************定义一个Dog类 继承自Alimal **********/

package com.rimi.abstractdemo;
// 使用关键字extends继承alimal
public class Dog extends Alimal {

// 静态修饰变量后,就变成共享的一个变量,所有对象都可以获取和修改
// 如果当前变量的值是固定的,当前变量在初始化后就不能被修改,只能获取
// 就可以用 final(最终的) 关键字修饰,修饰以后的变量就变成了常量 
public final static double PI = 3.14;
// 构造函数不能继承,需要有参构造必须自己实现
public Dog(String name, String gender) {
	super(name, gender);
}
// 重写父类的方法实现子类特有的功能
@Override
public void shout() {
	System.out.println("汪汪汪···");	
}
public void lookHome() {
	System.out.println(getName()+"在看家");
}

}

/*************定义一个Cat类,继承自Alimal ********/
package com.rimi.abstractdemo;
// 如果继承的父类是抽象类,必须实现抽象类的抽象方法才可以定义普通可以实现对象的类

public class Cat extends Alimal {

// 猫的构造函数
public Cat(String name, String gender) {
	super(name, gender);
}

// 必须重写的父类的抽象方法
@Override
public void shout() {
	System.out.println("喵喵喵···");
}	
public void catchMouse() {
	System.out.println(getName()+"在抓老鼠");
}

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值