黑马程序员_面向对象之多态

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流------

/*
 
 多态:  同一种事物,在不同时刻的状态
		举例:
			猫是猫的一种:	猫 m = new 猫();
			猫同时也是动物: 动物 d = new 猫();
	多态的前提:
		a: 要有继承关系
		b: 需要有方法重写. 没有方法重写也是可以的,但是没有意义
		c: 父类的引用指向子类对象
			Fu f = new Zi();

	类的成员:
		成员变量
			编译看左边 , 运行看左边
		构造方法
			创建子类对象的时候,会访问父类的构造方法,对父类的数据进行初始化。
		成员方法:
			编译看左边 , 运行看右边
		静态成员方法
			编译看左边 ,运行看左边
 
 多态的好处:
		a: 提供了代码的维护性(继承保证)
		b: 提供了代码的扩展性(多态保证)
		
多态的弊端: 就是不能访问子类特有的功能
	向下转型:	就是把父类的引用强制转换成子类的引用
	向上转型:   就是多态的体现

	向下转型目的就是使用子类特有的功能
	
	*/

// 父类
class Fu {

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

}

// 子类
class Zi extends Fu {

	public void show(){
		System.out.println("Zi.... show....");
	}
	
	public void function(){
		System.out.println("Zi...function.....");
	}
}


class DuoTaiTest{

	public static void main(String[] args)  {

		// 创建对象,使用多态的形式
		Fu f = new Zi();			// 向上转型

		// 调用show方法
		f.show();
		
		// 调用function方法
		// 错误的: 找不到符号
		// f.function();

		// 现在这个function方法是在子类中存在的,而我们不能直接使用父类的引用来访问.
		// 那么我还想访问这个方法,我们应该怎么办呢?
		// 我们可以通过子类的引用来访问,那么我们如何将父类的引用转换成子类的引用呢?
		Zi zi = (Zi)f;		// 向下转型

		// 调用function方法
		zi.function();
	}
}

/*
抽象类的特点:
		a: 抽象类和抽象方法的格式
			抽象方法:		public abstract 返回值类型 方法名(..) ; 
			抽象类的格式:	abstract class 类名 {}
		b: 抽象类不一定有抽象方法,有抽象方法的类一定是抽象类
		c: 构造方法,可以由构造方法
			用于子类访问父类数据时的初始化
		d: 抽象类不能实例化.
			我们抽象类不能直接实例化,那么可不可以对其进行间接实例化.
			通过多态的形式进行间接实例化
		e: 抽象类的子类
			(1): 可以是抽象类(没有意义)
			(2): 可以是具体的类,需要重写抽象类中的抽象方法
		*/
		
//创建抽象Animal类		
abstract class Animal {

	public abstract void eat() ;

	public void sleep(){
		System.out.println("Animal....sleep....");
	}

	public Animal(){}

}

// Cat不是抽象的, 并且未覆盖Animal中的抽象方法eat()
// class Cat extends Animal {}

// abstract class Cat extends Animal {}

class Cat extends Animal {

	public void eat(){
		System.out.println("Cat....eat....");
	}
}

// 测试类
class AbstractTest {

	public static void main(String[] args){

		// 直接创建对象
		// 错误的: Animal是抽象的; 无法实例化
		// Animal a = new Animal();
		
		//使用子类进行创建对象
		Animal a = new Cat();
		a.eat();
	}
}

抽象类的成员特点:
		a: 成员变量	
				这个量可以是变量,也可以是常量
		b: 构造方法
				可以有 , 用于子类在访问父类数据时候的初始化
		c: 成员方法
			可以是抽象方法,也可以是非抽象方法

	抽象类中成员方法的特征:
		抽象方法:				强制要求子类做的事情。
		非抽象方法:				子类继承的事情,提高代码复用性。
		
抽象类的分析:
	分析问题:		从具体到抽象的过程
		实现:			从抽象到具体
		使用的时候:		使用具体的东西
 
 	看到具体的事物中存在重复性的东西,我们因该将重复型的东西抽取出来,形成一个公共的父类.
	而这个公共的类存在抽象方法,所以这个类我们需要定义成抽象类
	
a: 一个类如果没有抽象方法,可不可以定义为抽象类?如果可以,有什么意义?
			答案:	可以, 不能让外界创建对象
b:	abstract不能和哪些关键字共存?
			private		冲突
			final        冲突
			static      无意义
 

接口定义以及接口与抽象类的区别
接口的特点:
		a: 定义接口格式							interface 接口名 {}
		b:	类实现接口用implements表示	 格式:	class 类名 implements 接口名 {}
		c: 构造方法
			没有构造方法
		d: 无法实例化
			接口不能直接实例化,那么我们可不可以对其进行间接实例化呢?
			我们可以通过多态的形式,对其进行间接实例化
		e: 接口的子类
			(1): 可以是抽象类(没有意义)
			(2): 可以是非抽象类, 但是该类需要重写接口中的抽象方法
			
接口中的成员特点:
		成员变量:	都是常量, 存在默认的修饰符:  public static final
					建议自己给出
		构造方法:	没有构造方法
		成员方法:	
					都是抽象方法,存在默认的修饰符: public abstract
 
 
 类与类 , 类与接口 , 接口和接口的关系

		类与类:	继承关系,在java只支持单继承,不支持多继承 , 但是支持多层继承
		类与接口: 实现的关系(implements), 并且支持多实现,多实现的格式: class 子类名 implements 接口名1, 接口名2 , ...{} 
				  一个类可以继承一个类的同时去实现多个接口
		接口和接口: 继承关系 , 并且支持多继承

	在java语言中存出多继承吗?
	存在, 接口和接口之间就可以多继承
 
 抽象类和接口的区别:
(1): 成员区别
	
	抽象类:
		成员变量:	可以是变量也可以是常量
		构造方法:	有构造方法
		成员方法:	可以是抽象方法,也可以是非抽象方法
	接口:
		成员变量:	只能是常量 ,存在默认的修饰符: public static final
		构造方法:	没有构造方法
		成员方法:	只能是抽象方法, 存在默认的修饰符: public abstract
(2): 关系区别:
	
	类与类:		继承关系, 只能是单继承 , 不能是多继承,但是可以是多层继承
	类与接口:	实现关系, 可以是单实现,也可以是多实现,并且一个类可以继承一个类的同时去实现多个接口
	接口与接口:	继承关系  可以是单继承也可以是多继承

(3): 设计理念
	
	抽象类		体现的关系"is a"		抽象类中定义的是该继承体系的共性功能。
	接口		体现的关系"like a"		接口中定义的是该继承体系的扩展功能。 
 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值