2020-12-09抽象类的继承和创建/适配器/对象运行时的多态

java 核心编程思想是面向对象
面向对象核心编程思想是面向抽象

抽象类的定义

抽象类通常应包含抽象方法,也可以包含非抽象方法
抽象类不能使用final关键字修饰
抽象类自身不能够实例化,必须依赖子类进行创建
抽象类就是用来被继承的

抽象类的继承和创建

抽象类被非抽象类继承必须对所有抽象方法提供实现
抽象类被抽象类继承可以不实现父类的抽象方法
抽象类对象的实例化必须通过非抽象子类进行创建
抽象类对象都是上转型对象
final修饰的方法不能在子类中被重写,抽象方法不能用final修饰

适配器

1.为抽象类定义适配器类,对所有抽象方法提供实现空实现
2.非抽象子类继承适配器类,只重写需要的父类方法

对象运行时多态

jvm在运行时创建和使用某个对象的时候才能确定对象具体是哪种数据类型
1.运行时多态能够使设计应用程序更加灵活,易于扩展,代码简洁
2.运行时多态体现了java面向对象语言特性继承的优越性

思考题(自己的理解)【网上找的答案】
1.抽象类为什么不允许自身构造器创建对象?(因为抽象类没有具体的方法,无法被创建的对象调用)
2.抽象方法时如何实现它的功能具体化的?(通过子类重写方法)
3.适配器的作用是什么?(子类不需要将父类所有的抽象方法重写)
4.如何理解对象运行时多态?(可以根据参数的不同调用不同的方法)

animal抽象类

package com.xzit.abstrcts;
/**
 * 定义更高层次的抽象组件类,从而可以在被继承时而根据实际子类应用场景继续功能实现
 * @author Administrator
 *
 */
public abstract class Animal {
	private String name = "狮子王";
	
	public abstract void run();//抽象类中允许定义抽象方法也可以定义非抽象方法

	public abstract void eat();
	
	public abstract void hunting();//捕猎的行为方法
	
	public Animal() {
		System.out.println("我是抽象类");
	}
	
	public Animal(String name) {
		this.name =name;
	}
	
	public String getName() {
		return name;
	}
}

适配器animalAdapter,重写了animal中的所有抽象方法

package com.xzit.abstrcts.imp;

import com.xzit.abstrcts.Animal;
/**
 * 为抽象类提供适配器从而让普通抽象类的子类继承此适配器,避免必须实现所有抽象方法
 * @author Administrator
 *
 */
public class AnimalAdapter extends Animal {

	@Override
	public void run() {
		// TODO Auto-generated method stub

	}

	@Override
	public void eat() {
		// TODO Auto-generated method stub

	}

	@Override
	public void hunting() {
		// TODO Auto-generated method stub

	}

}

cat类继承适配器,重写了run,eat,hunting方法

package com.xzit.abstrcts.imp;

public class Cat extends AnimalAdapter{

	@Override
	public void run() {
		System.out.println("猫可以上树");
	}

	@Override
	public void eat() {
		System.out.println("吃鱼");
	}

	@Override
	public void hunting() {
		System.out.println("   ");
	}
	
}

persion类,通过raise方法来实现对象运行时多态(pet替换成Animal不同的子类就可以调用子类的方法)

package com.xzit.abstrcts.imp;

import com.xzit.abstrcts.Animal;

public class Person {
	private String name;
	
	public void raiseLion(Lion lion) {
		System.out.println("养狮子");
	}
	
	public void raiseFish(Fish fish) {
		System.out.println("养鱼"+fish);
	}
	
	public void raiseCat(Cat cat) {
		System.out.println("养猫"+cat);
	}
	/**
	 * 运行时才决定pet参数到底是什么对象
	 */
	public void raisePet(Animal pet) {
		System.out.println("sdfjslafj");
	}
}

main方法

package com.xzit.test;

import com.xzit.abstrcts.Animal;
import com.xzit.abstrcts.imp.Cat;
import com.xzit.abstrcts.imp.Fish;
import com.xzit.abstrcts.imp.Lion;
import com.xzit.abstrcts.imp.Person;

public class TestRuntime {
	public static void main(String[] args) {
		Person xiaocui = new Person();
		Animal cat = new Cat();
		Animal Animal = new Lion();//创建一个Animal类型的Lion实例(调用的方法都是Lion中的方法,但是Animal类型的)
		Animal Fish = new Fish();
		Cat cat01 = new Cat();
		xiaocui.raisePet(cat);
		xiaocui.raiseCat(cat01);;
		
	}
}

学习思考:

Animal animal = new Cat( );

这段代码表示创建一个名为animal的实例,类型是Animal类的,但是调用的方法是调用的Cat类。因为这个实例是通过抽象类Animal的无参构造器创建的,说明虽然抽象类对象的实例化必须通过非抽象子类进行创建,但是抽象类的无参构造器还是有用的。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值